Come sovrascrivere la classe di tipo virtuale in Magento 2


14

Come sovrascrivere il blocco VirtualType in Magento 2, voglio sovrascrivere il seguente blocco del tipo virtuale con il mio blocco,

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

Quindi ho provato a sovrascriverlo dal mio modulo personalizzato in di.xmlquesto modo,

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

Ma non funziona

Quindi, qual è il modo corretto di sovrascrivere una classe di tipo virtuale in Magento 2?

Risposte:


14

Devi usare:

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

come menzionato Raffaello.

Per far funzionare correttamente questo singolo blocco, devi anche aggiungere un view/frontend/layout/catalogsearch_result_index.xmlfile con il seguente contenuto:

<?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
Funziona come un fascino!
— Volvox,

Perché dici di aver bisogno setTemplatedell'azione? Non credo sia vero. L'impostazione di una preferenza per il tipo virtuale non dovrebbe influire sull'impostazione del modello già definita nell'XML del layout principale.
— Scott Buchanan,

1
@ScottBuchanan per quanto riguarda il modello fornito contiene il modulo. Quando rispondevo a questa domanda questo blocco conteneva un modello product/list.phtmlcosì come usando la preferenza cambia modello inVendor_Module::product/list.phtml
— Bartłomiej Szubert

Ah, ha senso.
— Scott Buchanan,

8

Se vuoi sovrascrivere il tipo virtuale nel tuo esempio, devi usare:

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

Invece di:

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

Nel tuo esempio, hai la precedenza sul tipo originale e non sul tipo virtuale, ecco perché non funziona.


Grazie per la tua risposta, ora ho provato come hai menzionato, ma non funziona ancora.
— Nuwaus,

@nuwaus interessante, dove ti di.xmltrovi?
— Raffaello al Pianismo digitale,

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

@nuwaus e se lo sposti etc/frontend/di.xml?
— Raffaello al Pianismo digitale,

Non funziona ancora :(
— nuwaus,

4

Non sono sicuro di come le configurazioni XML siano state unite e ordinate, ma questo tipo di problema di solito dipende dalla sequenza dei moduli caricati.

Vorrei provare ad aggiungere una sequenza al tuo module.xml:

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

La preferenza descritta da Raffaello sopra sta funzionando bene per me.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.