Como substituir um modelo com layout ALIAS.
Esta resposta é um exemplo possível, você pode seguir isto para substituir o modelo do ALIAS.
Eu criei dois módulos de exemplo, Vendor_Module
tem layout com modelo de alias, estamos substituindo esse alias por Vendortwo_Moduletwo
módulo.
Suponha que você saiba as etapas para criar o módulo, não estou postando a criação do módulo inteiro.
Módulo 1
\ app \ code \ Fornecedor \ Módulo \ etc \ frontend \ routes.xml
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/App/etc/routes.xsd">
<router id="standard">
<route id="module" frontName="module">
<module name="Vendor_Module" />
</route>
</router>
</config>
\ app \ code \ Vendor \ Module \ view \ frontend \ layout \ module_test_test.xml
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="2columns-left" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd">
<body>
<referenceContainer name="content">
<block class="Vendor\Module\Block\Test\Test" name="test_test" template="test/test.phtml">
<block class="Vendor\Module\Block\Test\Test" as="testali" template="test/testali.phtml"/>
</block>
</referenceContainer>
</body>
</page>
Módulo 2
\ app \ code \ Vendortwo \ Moduletwo \ etc \ frontend \ routes.xml
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/App/etc/routes.xsd">
<router id="standard">
<route id="moduletwo" frontName="moduletwo">
<module name="Vendortwo_Moduletwo" />
</route>
</router>
</config>
\ app \ code \ Vendortwo \ Moduletwo \ view \ frontend \ layout \ default.xml
<?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">
<referenceBlock name="test_test">
<block class="Vendortwo\Moduletwo\Block\Two\Two" as="testali" template="two/twoalias.phtml"/>
</referenceBlock>
</page>
Após remover o cache, executei http: // localhost / magento210 / module / test / test
O modelo de alias é substituído por Vendortwo_Moduletwo
two/twoalias.phtml
É assim que se faz corretamente e sem hacks.
Não procurei o caso de uso do OP, mas precisava modificar os renderizadores no carrinho. O problema é que, como no caso do OP, o
Magento_Checkout
módulo não fornece nomes para os renderizadores, o que significa que eles não podem ser referenciados e seus modelos alterados usando métodos tradicionais ou documentados. No entanto, após algumas investigações, descobri como fazê-lo usando as ferramentas que o Magento2 nos fornece diretamente no XML do layout.Observe que existem outros lugares onde essa mesma abordagem funciona, como no
Magento\Sales\Block\Items\AbstractItems
bloco. Os módulosMagento_Checkout
eMagento_Sales
são os dois que mais utilizam os representantes de itens, portanto, isso abrange muitas das consultas que levariam alguém a alterar o modelo de um bloco sem um nome. A razão pela qual isso foi publicado é devido à inevitabilidade de outras pessoas procurarem como modificar modelos de renderizador nos módulos de pagamento ou vendas.Vou fornecer a solução primeiro e depois explicá-la em detalhes para quem quiser saber por que ela funciona.
Solução
Adicione o seguinte ao
checkout_cart_index.xml
arquivo de layout:Observe que o nome e o caminho do módulo precisam ser modificados para refletir sua base de código.
Explicação
Isso funciona aproveitando os
overridden_templates
dados do bloco, que não são definidos por padrão.Em
Magento_Checkout
, ocheckout_cart_index.xml
arquivo de layout define o seguinte bloco:Em seguida, define alguns desses renderizadores no
checkout_cart_item_renderers.xml
arquivo de layout:Infelizmente, eles não podem ser referenciados por seus aliases
default
esimple
, respectivamente.No entanto, olhando para o
Magento\Checkout\Block\Cart\Grid
bloco, que é nomeadocheckout.cart.form
e é o pai dos representantes, pode-se notar que há uma chamada para ogetItemHtml
método no modelo associadocart/form.phtml
. Esse método então chamagetItemRenderer
. Ambos os métodos são definidos naGrid
classe pai deAbstractBlock
. É aqui que osoverridden_templates
dados são usados:Com esse conhecimento, o preenchimento do bloco com dados do XML de layout é simples, usando a
arguments
sintaxe do Magento2 .fonte
Minha solução não é universal, é um "truque sujo", mas pode ser útil em certos casos. Minha amostra é para renderizador de front-end, não para adminhtml (acho que deve ser o mesmo).
Configure o ponto de interrupção
\Magento\Framework\Data\Structure::getChildId
com a condição " $ parentId == 'checkout.cart.item.renderers' " (este é um nome para o bloco pai, como você pode ver nocheckout_cart_item_renderers.xml
layout). Todos os blocos filhos têm nomes próprios (computados):Use estes nomes na atualização de layout do seu módulo:
fonte
Por favor, veja minha resposta aqui: https://magento.stackexchange.com/a/239387/14403
Acredito que essa é a solução que funcionará melhor para você. A solução inclui substituir qualquer bloco / modelo que não possua apenas um nome alternativo.
fonte