Jak zastąpić klasę Virtual Type w Magento 2

14

Jak zastąpić blok VirtualType w Magento 2, chcę zastąpić następujący blok typu wirtualnego własnym blokiem,

<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>

Więc próbowałem zastąpić go z mojego niestandardowego modułu w di.xmlten sposób,

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

Ale to nie działa.

Więc, co jest właściwym sposobem na przesłanianie wirtualną klasę w Magento typu 2?

Nuweus
źródło

Odpowiedzi:

14

Musisz użyć:

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

jak wspomniał Raphael.

Aby ten pojedynczy blok działał poprawnie, musisz również dodać view/frontend/layout/catalogsearch_result_index.xmlplik o następującej treści:

<?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>

Bartłomiej Szubert
źródło
1
Działa jak marzenie!
Volvox,
Dlaczego mówisz, że potrzebujesz setTemplateakcji? Nie wierzę, że to prawda. Ustawienie preferencji dla typu wirtualnego nie powinno wpływać na ustawienie szablonu, które jest już zdefiniowane w pliku XML układu podstawowego.
Scott Buchanan,
1
@ ScottBuchanan, o ile szablon zawiera moduł. Odpowiadając na to pytanie, ten blok zawierał szablon, product/list.phtmlwięc używając preferencji zmieniono szablon naVendor_Module::product/list.phtml
Bartłomiej Szubert
Ach, to ma sens.
Scott Buchanan,
8

Jeśli chcesz zastąpić typ wirtualny w swoim przykładzie, musisz użyć:

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

Zamiast:

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

W twoim przykładzie zastępujesz typ oryginalny, a nie typ wirtualny, dlatego nie działa.

Raphael at Digital Pianism
źródło
Dziękuję za odpowiedź. Teraz wypróbowałem sposób, o którym wspomniałeś, ale nadal nie działa.
nuwaus
@nuwaus ciekawe, gdzie się di.xmlznajdujesz?
Raphael w Digital Pianism
my-plugin-dir / etc / di.xml
nuwaus
@nuwaus co się stanie, jeśli go przeniesiesz etc/frontend/di.xml?
Raphael w Digital Pianism
To wciąż nie działa :(
nuwaus
4

Nie jestem pewien, jak dokładnie konfiguracje xml są scalane i sortowane, ale ten typ problemu zwykle sprowadza się do sekwencji ładowanych modułów.

Chciałbym dodać sekwencję do module.xml:

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

Preferencje opisane powyżej przez Rafaela działają dobrze dla mnie.

Langley
źródło