问题描述
当我尝试重写产品的URL密钥时,是否有一种方法可以防止magento 2用select *,right(remind,charindex (',',reverse(remind))-1)
from t t1
cross apply (select stuff(col,charindex(',857',col),len(col),'') as remind) t2
替换/
?
解决方法
我需要完全一样。我通过为 \Magento\Catalog\Model\Product\Url
中的 formatUrlKey() 方法创建一个环绕插件来完成它[编辑] 最好的方法是只启用您想要的字符,因此我们仍然删除特殊字符和空格。我添加的代码只允许 / 和 _
只需创建一个文件: app/code/YourVendorName/YourModule/Plugin/FormatUrlKeyPlugin.php
<?php
declare(strict_types=1);
namespace YourVendorName\YourModule\Plugin;
/**
* Class FormatUrlKeyPlugin
* @package YourVendorName\YourModule\Plugin
*/
class FormatUrlKeyPlugin
{
/**
* FormatUrlKeyPlugin constructor.
* @param Translit $translit
*/
public function __construct(\Magento\Framework\Filter\Translit $translit)
{
$this->translit = $translit;
}
/**
* Prevent Magento from replacing slashes in url_key
*
* @param \Magento\Catalog\Model\Product\Url $subject
* @param callable $proceed
* @param $str
* @return mixed
*/
public function aroundFormatUrlKey(\Magento\Catalog\Model\Product\Url $subject,callable $proceed,$str)
{
$str = preg_replace('#[^0-9a-z_/]+#i','-',$this->translit->filter($str));
$str = strtolower($str);
$str = trim($str,'-');
return $str;
}
}
并将插件添加到 di.xml(如果您的模块中没有它,请创建一个新插件) app/code/YourVendorName/YourModule/etc/di.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Catalog\Model\Product\Url">
<plugin name="FormatUrlKeyPlugin" type="YourVendorName\YourModule\Plugin\FormatUrlKeyPlugin" sortOrder="1" disabled="false"/>
</type>
</config>