如何替换Magento2中特定块中的转义器类

如何替换Magento2中特定块中的转义器类,magento2,Magento2,目标 仅为Magento2中的一个块升级/重写Magento\Framework\Escaper类 我需要这样做,因为Magento正在将转换标签中的“-”字符转换为“\u002”。我认为这是Magento 2中的一个bug,因为Google使用了“-” 我的解决方案 使用依赖项注入,构建(虚拟类型)上下文类,并在其中注入自定义转义器。然后,虚拟上下文用于Magento\GoogleAdwords\Block\Code app/code/MyVendor/MyModule/etc/fronten

目标

仅为Magento2中的一个块升级/重写Magento\Framework\Escaper类

我需要这样做,因为Magento正在将转换标签中的“-”字符转换为“\u002”。我认为这是Magento 2中的一个bug,因为Google使用了“-”

我的解决方案

使用依赖项注入,构建(虚拟类型)上下文类,并在其中注入自定义转义器。然后,虚拟上下文用于Magento\GoogleAdwords\Block\Code

app/code/MyVendor/MyModule/etc/frontend/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">
    <virtualType name="AdwordsContext" type="Magento\Framework\View\Element\Template\Context">
        <arguments>
            <argument name="escaper" xsi:type="object">MyVendor\MyModule\Model\Escaper</argument>
        </arguments>
    </virtualType>
    <type name="Magento\GoogleAdwords\Block\Code">
        <arguments>
            <argument name="context" xsi:type="object">AdwordsContext</argument>
        </arguments>
    </type>
</config>

MyVendor\MyModule\Model\Escaper
AdwordsContext
app/code/MyVendor/MyModule/Model/Escaper.php

<?php

namespace MyVendor\MyModule\Model;

class Escaper extends \Magento\Framework\Escaper
{
    /**
     * @param string $string
     *
     * @return string
     */
    public function escapeJs($string): string
    {
        if ($string === '' || ctype_digit($string)) {
            return $string;
        }

        return preg_replace_callback(
            '/[^a-z0-9,\._-]/iSu',
            function ($matches) {
                $chr = $matches[0];
                if (strlen($chr) != 1) {
                    $chr = mb_convert_encoding($chr, 'UTF-16BE', 'UTF-8');
                    $chr = ($chr === false) ? '' : $chr;
                }

                return sprintf('\\u%04s', strtoupper(bin2hex($chr)));
            },
            $string
        );
    }
}

请检查您的elasticsearch配置,并在以下位置查找更多解决方案:

您为什么发送垃圾邮件?