So überschreiben Sie die Virtual Type-Klasse in Magento 2

12

So überschreiben Sie den VirtualType-Block in Magento 2: Ich möchte folgenden virtuellen Typblock mit meinem eigenen Block überschreiben.

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

Also habe ich versucht, es von meinem benutzerdefinierten Modul di.xmlwie folgt zu überschreiben ,

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

Aber es funktioniert nicht.

Also, was ist der richtige Weg , um eine virtuelle Typklasse in Magento 2 vorran?

nuwaus
quelle

Antworten:

12

Sie müssen verwenden:

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

wie Raphael erwähnte.

Damit dieser singuläre Block ordnungsgemäß funktioniert, müssen Sie auch eine view/frontend/layout/catalogsearch_result_index.xmlDatei mit folgendem Inhalt hinzufügen :

<?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
quelle
1
Klappt wunderbar!
Volvox
Warum sagst du, dass du die setTemplateAktion brauchst ? Ich glaube nicht, dass das stimmt. Das Festlegen einer Voreinstellung für den virtuellen Typ sollte sich nicht auf die Vorlageneinstellung auswirken, die bereits im XML-Kernlayout definiert ist.
Scott Buchanan
1
@ScottBuchanan sofern Vorlage vorhanden Modul enthält. Bei der Beantwortung dieser Frage enthielt dieser Block Vorlage als product/list.phtmlsolche mit Präferenz geändert VorlageVendor_Module::product/list.phtml
Bartłomiej Szubert
Ah, macht Sinn.
Scott Buchanan
7

Wenn Sie den virtuellen Typ in Ihrem Beispiel überschreiben möchten, müssen Sie Folgendes verwenden:

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

Anstatt von:

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

In Ihrem Beispiel überschreiben Sie den ursprünglichen und nicht den virtuellen Typ. Dies ist der Grund, warum dies nicht funktioniert.

Raphael bei Digital Pianism
quelle
Vielen Dank für Ihre Antwort. Jetzt habe ich versucht, wie Sie es erwähnt haben, aber es funktioniert immer noch nicht.
Nuwaus
@nuwaus interessant, wo ist dein standort di.xml?
Raphael bei Digital Pianism
my-plugin-dir / etc / di.xml
nuwaus
@nuwaus was ist wenn du es verschiebst etc/frontend/di.xml?
Raphael bei Digital Pianism
Es funktioniert immer noch nicht :(
Nuwaus
4

Ich bin nicht sicher, wie genau die XML-Konfigurationen zusammengeführt und sortiert werden, aber diese Art von Problem hängt normalerweise von der Reihenfolge der geladenen Module ab.

Ich würde versuchen, eine Sequenz zu Ihrem hinzuzufügen module.xml:

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

Die von Raphael oben beschriebene Präferenz funktioniert gut für mich.

Langley
quelle