Cara mengganti kelas Jenis Virtual di Magento 2

14

Cara mengganti blok VirtualType di Magento 2, saya ingin mengganti jenis blok virtual berikut dengan blok saya sendiri,

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

Jadi saya mencoba menimpanya dari modul khusus saya di.xmlseperti ini,

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

Tapi itu tidak berhasil.

Jadi, apa cara yang tepat untuk menimpa kelas tipe virtual di Magento 2?

nuwaus
sumber

Jawaban:

14

Anda harus menggunakan:

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

seperti yang disebutkan Raphael.

Agar blok tunggal ini berfungsi dengan baik, Anda juga perlu menambahkan view/frontend/layout/catalogsearch_result_index.xmlfile dengan konten berikut:

<?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
sumber
1
Bekerja seperti pesona!
Volvox
Mengapa Anda mengatakan Anda membutuhkan setTemplatetindakan? Saya tidak percaya itu benar. Mengatur preferensi untuk tipe virtual seharusnya tidak memengaruhi pengaturan template yang sudah ditentukan dalam tata letak inti XML.
Scott Buchanan
1
@ScottBuchanan sejauh templat yang disediakan berisi modul. Ketika menjawab pertanyaan ini, blok ini berisi template yang product/list.phtmlmenggunakan preferensi yang mengubah template keVendor_Module::product/list.phtml
Bartłomiej Szubert
Ah, masuk akal.
Scott Buchanan
8

Jika Anda ingin mengganti jenis virtual dalam contoh Anda, Anda perlu menggunakan:

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

Dari pada:

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

Dalam contoh Anda, Anda menimpa tipe asli dan bukan tipe virtual, itulah alasan mengapa itu tidak berfungsi.

Raphael di Digital Pianism
sumber
Terima kasih atas jawaban Anda, Sekarang saya telah mencoba cara yang Anda sebutkan, tetapi masih tidak berhasil.
nuwaus
@nuwaus menarik, di mana Anda di.xmlberada?
Raphael di Digital Pianism
my-plugin-dir / etc / di.xml
nuwaus
@ Wahwaus bagaimana jika Anda pindah ke etc/frontend/di.xml?
Raphael di Digital Pianism
Itu masih tidak berhasil :(
nuwaus
4

Saya tidak yakin bagaimana sebenarnya konfigurasi xml digabungkan dan diurutkan, tetapi jenis masalah ini biasanya turun ke urutan modul yang sedang dimuat.

Saya akan mencoba menambahkan urutan ke module.xml:

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

Preferensi yang dijelaskan oleh Raphael di atas berfungsi dengan baik untuk saya.

Langley
sumber