Como sobrescrever arquivos de modelo principais de um módulo personalizado?

10

Eu quero substituir dois arquivos. Ou seja, o view.phtmle print.phtmldos pedidos de vendas.
(caminho app/design/frontend/base/default/template/sales/order/:)

Estou criando um módulo no qual desejo criar um caminho app/design/frontend/base/default/template/<My Module Name>/sales/order/para que o núcleo view.phtmle os print.phtmlarquivos não sejam substituídos.

Então, por favor, me guie como realizar essa tarefa.

Rajan Faldu
fonte

Respostas:

13

Você pode fazer isso com um arquivo XML de layout dentro do seu módulo. Você precisa ter uma seção no seu módulo config.xmlcomo esta para permitir que o Magento carregue o XML de layout do seu módulo (caminho app/design/frontend/base/default/layout/mymodulename.xml:):

<config>
    [...]
    <frontend>
        [...]
        <layout>
            <updates>
                <mymodulename_layout module="MyModuleName">
                    <file>mymodulename.xml</file>
                </mymodulename_layout>
            </updates>
        </layout>
    </frontend>

Neste arquivo XML de layout, você pode fazer referência aos blocos específicos e alterar seu modelo.

<layout>
    <sales_order_view>
        <reference name="sales.order.view">
            <action method="setTemplate">
                <template>mymodulename/sales/order/view.phtml</template>
            </action>
        </reference>
    </sales_order_view>
    <sales_order_print>
        <reference name="sales.order.print">
            <action method="setTemplate">
                <template>mymodulename/sales/order/print.phtml</template>
            </action>
        </reference>
    </sales_order_print>
</layout>
7ochem
fonte
@ 7ochem, como conseguir o mesmo no magento2?
Prasad maganti 15/10/2015
Você deve perguntar isso como uma nova questão, pois é muito ampla para colocá-lo em um comentário aqui e não é o que o OP está pedindo
7ochem
3

Suponha que o nome do módulo 'CustomSales' e o nome do pacote "Exercício".

Etapa 1: Crie um arquivo de configuração do módulo no aplicativo / etc / modules / Exercise_CustomSales.xml

<config>
<modules>
    <Exercise_CustomSales>
        <active>true</active>
        <codePool>local</codePool>
    </Exercise_CustomSales>
</modules>

Etapa 2: Crie um arquivo de configuração em app / code / local / Exercise / CustomSales / etc / config.xml

<config>
<modules>
    <Exercise_CustomSales>
        <version>1.7.0.2</version>
    </Exercise_CustomSales>
</modules>
<global>
    <blocks>
        <customsales>
            <class>Exercise_CustomSales_Block</class>
        </customsales>
        <sales>
            <rewrite>
                <order_view>Exercise_CustomSales_Block_Sales_Order_View</order_view>
            </rewrite>
        </sales>
    </blocks>
</global>

Etapa 3: Crie um arquivo php que substitua o arquivo view.phtml real, app / code / local / Exercise / CustomSales / Block / Sales / Order / View.php

A classe Exercise_CustomSales_Block_Sales_Order_View estende o Mage_Sales_Block_Order_View
{
    função protegida _construct ()
    {
        pai :: _ construct ();
        $ this-> setTemplate ('costumesales / sales / order / view.phtml');
    }
}

Etapa 4: você deve criar um arquivo local.xml dentro da pasta de layout (caminho possível: app / design / frontend / package / theme / layout). Isto é para print.phtml.

por exemplo, (app / design / frontend / rwd / default / layout / local.xml)

<layout>
<sales_order_print>
    <reference name="sales.order.print">
        <action method="setTemplate">
            <template>customsales/sales/order/print.phtml</template>
        </action>
    </reference>
</sales_order_print>

Mova o arquivo view.phtml e print.phtml dentro de "app / design / frontend / package / theme / template / costumesales / sales / order".

Limpar cache magento.

Sohel Rana
fonte
Não há necessidade de reescrever o bloco inteiro. Na minha resposta, o construtor de Mage_Sales_Block_Order_Viewget é chamado primeiro e define o modelo, depois setTemplateé chamado iniciado pelo layout XML do meu exemplo e define o modelo personalizado. Eu gostaria de procurar soluções que não usem reescritas, pois elas podem causar conflitos.
7ochem 27/03/2015
7ochem está certo. Não há necessidade de definir o modelo no bloco. A solução da 7ochem é boa e funcionou para mim.
Rajan Faldu 27/03/2015
Depende de você. Se você sobrescrever ou adicionar algum método php, precisará sobrescrever o bloco, caso contrário, basta alterar o modelo através de module.xml ou local.xml. Minha solução não afeta nenhuma versão magento, eu acho.
Sohel Rana 27/03