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.