Comment remplacer la classe Virtual Type dans Magento 2

14

Comment remplacer le bloc VirtualType dans Magento 2, je veux remplacer le bloc de type virtuel suivant par mon propre bloc,

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

J'ai donc essayé de le remplacer à partir de mon module personnalisé di.xmlcomme celui-ci,

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

Mais ça ne marche pas.

Alors, quelle est la bonne façon de remplacer une classe de type virtuel dans Magento 2?

nuwaus
la source

Réponses:

14

Vous devez utiliser:

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

comme Raphaël l'a mentionné.

Pour que ce bloc singulier fonctionne correctement, vous devez également ajouter un view/frontend/layout/catalogsearch_result_index.xmlfichier avec le contenu suivant:

<?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
la source
1
Fonctionne comme un charme!
Volvox
Pourquoi dites-vous que vous avez besoin de l' setTemplateaction? Je ne crois pas que ce soit vrai. La définition d'une préférence pour le type virtuel ne devrait pas affecter le paramètre de modèle déjà défini dans le XML de mise en page principal.
Scott Buchanan
1
@ScottBuchanan dans la mesure où le modèle fourni contient un module. Lorsque vous avez répondu à cette question, ce bloc contenait un modèle, product/list.phtmldonc en utilisant le modèle de préférence changé enVendor_Module::product/list.phtml
Bartłomiej Szubert
Ah, c'est logique.
Scott Buchanan
8

Si vous souhaitez remplacer le type virtuel dans votre exemple, vous devez utiliser:

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

Au lieu de:

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

Dans votre exemple, vous remplacez le type d'origine et non le type virtuel, c'est la raison pour laquelle cela ne fonctionne pas.

Raphael chez Digital Pianism
la source
Merci pour votre réponse, maintenant j'ai essayé la façon dont vous l'avez mentionné, mais cela ne fonctionne toujours pas.
nuwaus
@nuwaus intéressant, où êtes-vous di.xmlsitué?
Raphael au Digital Pianism du
rép-my-plugin / etc / di.xml
nuwaus
@nuwaus et si vous le déplacez vers etc/frontend/di.xml?
Raphael au Digital Pianism
Cela ne fonctionne toujours pas :(
nuwaus
4

Je ne sais pas exactement comment les configurations xml sont fusionnées et triées, mais ce type de problème se résume généralement à la séquence des modules en cours de chargement.

J'essaierais d'ajouter une séquence à votre module.xml:

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

La préférence décrite par Raphael ci-dessus fonctionne bien pour moi.

Langley
la source