No Magento 1, como desenvolvedor de módulos, é possível alterar o modelo de um bloco usando o código XML de layout, algo como isto
<reference name="block_to_change">
<action method="setTemplate">
<param>/path/to/template.phtml</param>
</action>
</reference>
e adicionando seu modelo ao tema base.
app/design/frontend/base/default/template/path/to/template.phtml
É possível, como desenvolvedor de módulos, fazer algo semelhante no Magento 2? Ou seria necessário usar o código XML ou PHP do layout para remover o bloco em que estou interessado e inserir um novo bloco com um modelo diferente (cuja classe estende a classe de bloco original)
Sei que poderia criar um tema personalizado que substitui um modelo, mas estou interessado em criar um módulo que altere o modelo padrão, mas ainda permita que um tema personalizado substitua esse modelo.
O nó de ação está obsoleto, mas você pode usar argumentos de bloco
fonte
addtocart.phtml
arquivo de acordo com a configuração do sistema e também deseja atualizar isso usando módulo personalizado<action method='setTemplate'>
) funciona sem problemas.Para entender a diferença entre
<arguments>
e<action>
você deve entender como os construtores dos objetos Magento 2 funcionam. Se você substituir um construtor no Magento, sempre obterá um$data-parameter
que é uma matriz. Esses são os dados fornecidos nos arquivos XML e traduzidos para o interno$_data-array
de\Magento\Framework\DataObject
:No entanto, no caso de um modelo, se
setTemplate()
for usado no pseudo construtor (_construct()
, sublinhado único), isso significa que ele$data
será substituído, independentemente de estar definido no XML.Nesse cenário,
<action>
é preferível, pois isso é executado após o construtor e pseudo construtor.fonte
O seguinte funcionou para mim no Magento EE 2.2.3
Nota: se você estiver usando um módulo personalizado para alterar o modelo de um núcleo e estiver ficando louco porque o código anterior cortado não funciona, verifique se o seu módulo está carregado após o módulo principal que você está tentando alterar (module.xml) e se você executado
bin/magento setup:upgrade
:)fonte
Não sei por que, mas acho que é o melhor:
fonte
Isso funcionará apenas se seu bloco não tiver sido substituído antes de usar o
setTemplate
método Magento 2.2.xe superior.fonte