如何从自定义模块覆盖核心模板文件?


10

我想覆盖两个文件。即销售订单的view.phtmlprint.phtml
(路径:app/design/frontend/base/default/template/sales/order/

我正在创建一个模块,在其中要创建路径,app/design/frontend/base/default/template/<My Module Name>/sales/order/以免内核view.phtmlprint.phtml文件被覆盖。

因此,请指导我如何完成这项任务。

Answers:


13

您可以使用模块内部的布局XML文件来执行此操作。您需要在模块中有一个这样的部分,config.xml以使Magento加载模块的布局XML(路径:)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>

在此布局XML文件中,您可以引用特定的块并更改其模板。

<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,如何在magento2中实现相同?
prasad maganti 2015年

您应该将其作为一个新问题提出,因为它太宽泛而无法在此处发表评论,而不是OP的要求
7ochem 2015年

3

假设我们的模块名称为“ CustomSales”,而程序包名称为“ Exercise”。

步骤1:在app / etc / modules / Exercise_CustomSales.xml中创建一个模块配置文件

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

步骤2:在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>

第3步:创建一个php文件,该文件将覆盖实际的view.phtml文件,app / code / local / Exercise / CustomSales / Block / Sales / Order / View.php

class Exercise_CustomSales_Block_Sales_Order_View扩展了Mage_Sales_Block_Order_View
{
    受保护的函数_construct()
    {
        parent :: _ construct();
        $ this-> setTemplate('customsales / sales / order / view.phtml');
    }
}

步骤4:您应在布局文件夹中创建一个local.xml文件(可能路径:app / design / frontend / package / theme / layout)。这是用于print.phtml。

例如(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>

将view.phtml和print.phtml文件移动到“ app / design / frontend / package / theme / template / customsales / sales / order”中。

清除magento缓存。


无需重写整个块。在我的回答中,Mage_Sales_Block_Order_View首先调用get的构造函数并设置模板,然后setTemplate由示例中的布局XML初始化get的调用并设置自定义模板。我想寻求不使用重写的解决方案,因为它们可能会引起冲突。
7ochem 2015年

7ochem是正确的。无需在模板中设置模板。7ochem的解决方案很好,对我有用。
Rajan Faldu

这取决于你。如果覆盖或添加一些php方法,则需要覆盖块,否则只需通过module.xml或local.xml更改模板即可。我猜我的解决方案不会影响任何magento版本。
Sohel Rana 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.