Cómo anular la clase de tipo virtual en Magento 2

14

Cómo anular el bloque VirtualType en Magento 2, quiero anular el siguiente bloque de tipo virtual con mi propio bloque,

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

Así que intenté anularlo desde mi módulo personalizado di.xmlcomo este,

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

Pero no funciona.

Entonces, ¿cuál es la forma correcta de anular una clase de tipo virtual en Magento 2?

nuwaus
fuente

Respuestas:

14

Tienes que usar:

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

como lo mencionó Rafael.

Para que este bloque singular funcione correctamente, también debe agregar un view/frontend/layout/catalogsearch_result_index.xmlarchivo con el siguiente contenido:

<?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
fuente
1
¡Funciona de maravilla!
Volvox
¿Por qué dices que necesitas la setTemplateacción? No creo que sea verdad. Establecer una preferencia para el tipo virtual no debería afectar la configuración de la plantilla que ya está definida en el diseño principal XML.
Scott Buchanan
1
@ScottBuchanan hasta que la plantilla proporcionada contenga el módulo. Al responder a esta pregunta, este bloque contenía una plantilla que product/list.phtmlusaba la plantilla de preferencia cambiada aVendor_Module::product/list.phtml
Bartłomiej Szubert
Ah, tiene sentido.
Scott Buchanan
8

Si desea anular el tipo virtual en su ejemplo, debe usar:

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

En lugar de:

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

En su ejemplo, anula el tipo original y no el tipo virtual, esa es la razón por la que no funciona.

Raphael en Digital Pianism
fuente
Gracias por su respuesta, ahora he intentado de la manera que mencionó, pero todavía no funciona.
nuwaus
@nuwaus interesante, ¿dónde está di.xmlubicado?
Raphael en Digital Pianism
my-plugin-dir / etc / di.xml
nuwaus
@nuwaus, ¿y si lo mueves a etc/frontend/di.xml?
Raphael en Digital Pianism
Todavía no funciona :(
nuwaus
4

No estoy seguro de cómo se fusionan y ordenan exactamente las configuraciones xml, pero este tipo de problema generalmente se reduce a la secuencia de los módulos que se están cargando.

Intentaría agregar secuencia a tu module.xml:

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

La preferencia descrita por Raphael arriba está funcionando bien para mí.

Langley
fuente