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?

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>


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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.