¿Cómo sobrescribir archivos de plantilla principales desde un módulo personalizado?

10

Quiero sobrescribir dos archivos. A saber, el view.phtmly print.phtmlde los pedidos de ventas.
(path: app/design/frontend/base/default/template/sales/order/)

Estoy creando un módulo en el que quiero crear una ruta app/design/frontend/base/default/template/<My Module Name>/sales/order/para que el núcleo view.phtmly los print.phtmlarchivos no se sobrescriban.

Así que por favor guíame cómo lograr esta tarea.

Rajan Faldu
fuente

Respuestas:

13

Puede hacer esto con un archivo XML de diseño dentro de su módulo. Debe tener una sección en su módulo config.xmlcomo esta para permitir que Magento cargue el diseño XML de su módulo (ruta:) 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>

En este archivo XML de diseño puede hacer referencia a los bloques específicos y cambiar su plantilla.

<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
fuente
@ 7ochem, ¿cómo lograr lo mismo en magento2?
prasad maganti
Debe hacer esto como una nueva pregunta, ya que es demasiado amplio para ponerlo en un comentario aquí y no es lo que el OP está preguntando
7ochem
3

Supongamos que nuestro nombre de módulo 'CustomSales' y el nombre del paquete "Ejercicio".

Paso 1: Cree un archivo de configuración del módulo en la aplicación / etc / modules / Exercise_CustomSales.xml

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

Paso 2: cree un archivo de configuración en 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>

Paso 3: Cree un archivo php que sobrescriba el archivo view.phtml real, app / code / local / Exercise / CustomSales / Block / Sales / Order / View.php

La clase Exercise_CustomSales_Block_Sales_Order_View extiende Mage_Sales_Block_Order_View
{
    función protegida _construct ()
    {
        padre :: _ construct ();
        $ this-> setTemplate ('customsales / sales / order / view.phtml');
    }
}

Paso 4: debe crear un archivo local.xml dentro de la carpeta de diseño (ruta posible: app / design / frontend / package / theme / layout). Esto es para print.phtml.

por ejemplo (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>

Mueva el archivo view.phtml e print.phtml dentro de "app / design / frontend / package / theme / template / customsales / sales / order".

Borrar caché de magento.

Sohel Rana
fuente
No hay necesidad de reescribir todo el bloque. En mi respuesta, el constructor de Mage_Sales_Block_Order_Viewget se llama primero y establece la plantilla, luego setTemplatese llama iniciado por el diseño XML de mi ejemplo y establece la plantilla personalizada. Me gustaría buscar soluciones que no utilicen reescrituras, ya que potencialmente pueden causar conflictos.
7ochem
7ochem tiene razón. No es necesario configurar la plantilla en bloque. La solución de 7ochem es buena y funcionó para mí.
Rajan Faldu
Depende de ti. Si sobrescribe o agrega algún método php, entonces necesita sobrescribir el bloque; de ​​lo contrario, simplemente cambie la plantilla a través de module.xml o local.xml. Supongo que mi solución no afecta a ninguna versión de magento.
Sohel Rana