Como sobrescrever um modelo via módulo no Magento2

9

Estou criando um módulo e quero substituir o modelo app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/edit/options.phtml.

Isso é possível em um módulo (não um tema)

Infelizmente, não parece super fácil alterar o nome do módulo via XML de layout, pois isso está definido em https://github.com/magento/magento2/blob/develop/app/code/Magento/Catalog/Block /Adminhtml/Product/Edit/Tab/Options.php#L21

Alex
fonte
Por favor, consulte este link para a resposta magento.stackexchange.com/questions/76434/…
Divya Muralidharan
Consulte este link para obter a resposta magento.stackexchange.com/questions/76434/…
Divya Muralidharan

Respostas:

10

Adicione a pasta de layout do seu arquivo de módulo [Vendedor] / [ModuleName] /view/adminhtml/layout/catalog_product_options.xml

<?xml version="1.0"?>
<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/layout_generic.xsd">
    <referenceBlock name="admin.product.options">
        <arguments>
            <argument name="template" xsd:type="string">[Vendor]/[ModuleName]::product_options.phtml</argument>
        </arguments>
    </referenceBlock>
</layout>

Também é necessário adicionar ao módulo xml esta linha, para carregar seus layouts após o catálogo

<sequence>
        <module name="Magento_Catalog"/>
</sequence>
KAndy
fonte
De onde você tirou o nome admin.product.options?
Alex
Basta procurar \ Magento \ Catalog \ Block \ Adminhtml \ Product \ Edit \ Tab \ Options por arquivos de layout e descobrir a declaração em Magento / Catalog / view / adminhtml / layout /
catalog_product_options.xml
11
Não deveria ser Vendor_ModuleName::product_options.phtml?
Giel Berkers
Sim, obrigado por ponto
Kandy
2
Essa solução funciona apenas se o modelo original tiver sido definido no arquivo Block.php. Se o modelo original estiver definido no layout.xml, esta solução não funcionará. Uma abordagem melhor é sempre usar em <action method="setTemplate">vez de <arguments>. Esta solução funciona em todos os casos.
Jalogut
3
  1. Crie o arquivo de layout correspondente no seu módulo:

[Fornecedor] / [ModuleName] /view/adminhtml/layout/catalog_product_options.xml

  1. Defina sua configuração de modelo personalizado
<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/layout_generic.xsd">
    <referenceBlock name="admin.product.options">
        <action method="setTemplate">
            <argument name="template" xsi:type="string">[Vendor]_[ModuleName]::product_options.phtml</argument>
        </action>
    </referenceBlock>
</layout>

NOTA: é muito importante usar em <action method="setTemplate">vez de <arguments>. <arguments>funcionará apenas se o bloco não tiver outro modelo especificado na declaração xml. Em qualquer outro caso, você precisa <action method="setTemplate">substituir o modelo existente. É melhor usar, <action method="setTemplate">porque sempre funciona.

Jalogut
fonte
0

Sim, você pode substituir os arquivos de modelo do aplicativo / código do seu módulo personalizado. No entanto, lembre-se de que, no conceito de herança do Magento, os arquivos (modelos, layouts, arquivos estáticos) do aplicativo / design substituem o mesmo no aplicativo / código. Assim como o tema filho substitui o tema pai.

Portanto, considero melhor criar um tema personalizado para o seu módulo personalizado e adicionar todos os seus arquivos phtml, xml, css, js, fonte e imagem lá no app / design.

Iveta Allogenes
fonte