Як перекрити клас 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?

Відповіді:


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
Bartłomiej Szubert

Ах, має сенс.
Скотт

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знаходиться?
Рафаель у Digital Pianism

my-plugin-dir / etc / di.xml
nuwaus

@nuwaus, що якщо ви перемістите його etc/frontend/di.xml?
Рафаель у Digital Pianism

Це все ще не працює :(
nuwaus

4

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

Я б спробував додати послідовність до вашого module.xml:

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

Вподобання, описане Рафаелем вище, працює для мене чудово.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.