Como substituir a classe Tipo virtual no Magento 2


13

Como substituir o bloco VirtualType no Magento 2, desejo substituir o seguinte bloco virtual por meu próprio bloco,

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

Então, eu tentei substituí-lo do meu módulo personalizado di.xmlassim,

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

Mas não funciona.

Então, qual é a maneira correta de substituir uma classe de tipo virtual no Magento 2?

Respostas:


13

Você tem que usar:

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

como Rafael mencionou.

Para fazer esse bloco singular funcionar corretamente, você também precisa adicionar um view/frontend/layout/catalogsearch_result_index.xmlarquivo com o seguinte conteúdo:

<?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
Funciona como um encanto!
#Volvox #

Por que você diz que precisa da setTemplateação? Não acredito que seja verdade. Definir uma preferência para o tipo virtual não deve afetar a configuração do modelo que já está definida no XML do layout principal.
22418 Scott Schanhan

1
@ScottBuchanan, na medida em que o modelo fornecido contém o módulo. Ao responder esta pergunta neste bloco continha modelo como product/list.phtmlisso usando a preferência mudou modelo paraVendor_Module::product/list.phtml
Bartłomiej Szubert

Ah, faz sentido.
Scott Buchanan

7

Se você deseja substituir o tipo virtual no seu exemplo, é necessário usar:

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

Ao invés de:

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

No seu exemplo, você substitui o tipo original e não o virtual, é por isso que não está funcionando.


Obrigado pela sua resposta, agora tentei da maneira que você mencionou, mas ainda não funciona.
nuwaus

@nuwaus interessante, onde está di.xmllocalizado?
Raphael no Digital Pianism

meu-plugin-dir / etc / di.xml
nuwaus

@nuwaus e se você mudar para etc/frontend/di.xml?
Raphael no Digital Pianism

Ainda não funciona :(
nuwaus

4

Não tenho certeza de como exatamente as configurações xml são mescladas e classificadas, mas esse tipo de problema geralmente se resume à sequência dos módulos que estão sendo carregados.

Eu tentaria adicionar sequência ao seu module.xml:

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

A preferência descrita por Raphael acima está funcionando bem para mim.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.