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?

nuwaus
fonte

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>

Bartłomiej Szubert
fonte
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.

Raphael na Digital Pianism
fonte
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.

Langley
fonte