Как переопределить класс Virtual Type в Magento 2

14

Как переопределить блок VirtualType в Magento 2, я хочу переопределить следующий блок виртуального типа своим собственным блоком,

<virtualType name="Magento\CatalogSearch\Block\SearchResult\ListProduct" type="Magento\Catalog\Block\Product\ListProduct">
   <arguments>
       <argument name="catalogLayer" xsi:type="object">Magento\Catalog\Model\Layer\Search</argument>
   </arguments>
</virtualType>

Поэтому я попытался переопределить его из моего пользовательского модуля, di.xmlкак это,

<preference for="Magento\Catalog\Block\Product\ListProduct" type="My\Vendor\Block\Product\ListProductSearch" />

Но это не работает.

Итак, как правильно переопределить класс виртуального типа в Magento 2?

nuwaus
источник

Ответы:

14

Вы должны использовать:

<preference for="Magento\CatalogSearch\Block\SearchResult\ListProduct" type="Vendor\Module\Block\Product\ListProductSearch" />

как упоминал Рафаэль.

Чтобы этот блок работал правильно, вам также нужно добавить view/frontend/layout/catalogsearch_result_index.xmlфайл со следующим содержимым:

<?xml version="1.0"?>

<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
    <referenceBlock name="search_result_list">
        <action method="setTemplate">
            <argument name="template" xsi:type="string">Magento_Catalog::product/list.phtml</argument>
        </action>
    </referenceBlock>
</body>

Бартломей Шуберт
источник
1
Работает как шарм!
Volvox
Почему вы говорите, что вам нужно setTemplateдействие? Я не верю, что это правда. Установка предпочтения для виртуального типа не должна влиять на настройку шаблона, которая уже определена в базовом макете XML.
Скотт Бьюкенен
1
@ScottBuchanan, поскольку шаблон содержит модуль. При ответе на этот вопрос в этом блоке содержался шаблон, product/list.phtmlпоэтому предпочтение было изменено на шаблонVendor_Module::product/list.phtml
Бартломей Шуберт,
Ах, имеет смысл.
Скотт Бьюкенен
8

Если вы хотите переопределить виртуальный тип в вашем примере, вам нужно использовать:

<preference for="Magento\CatalogSearch\Block\SearchResult\ListProduct" type="My\Vendor\Block\Product\ListProductSearch" />

Вместо того:

<preference for="Magento\Catalog\Block\Product\ListProduct" type="My\Vendor\Block\Product\ListProductSearch" />

В вашем примере вы переопределяете исходный тип, а не виртуальный тип, вот почему он не работает.

Рафаэль в цифровом пианизме
источник
Спасибо за ваш ответ. Теперь я попробовал, как вы упомянули, но все равно не работает.
nuwaus
@nuwaus интересно, где ты находишься di.xml?
Рафаэль на цифровом пианизме
my-plugin-dir / etc / di.xml
nuwaus
@nuwaus что делать, если вы переместите его в etc/frontend/di.xml?
Рафаэль на цифровом пианизме
Это все еще не работает :(
nuwaus
4

Я не уверен, как именно конфигурации xml объединяются и сортируются, но проблема такого типа обычно сводится к последовательности загружаемых модулей.

Я бы попробовал добавить последовательность к вашему module.xml:

<sequence>
        <module name="Magento_CatalogSearch"/>
</sequence>

Предпочтение, описанное Рафаэлем выше, прекрасно работает для меня.

Лэнгли
источник