Magento扩展需要覆盖模板

时间:2011-11-02 20:35:16

标签: templates layout magento override

我正在为我的商店开发一个简单的扩展程序,它需要覆盖模板文件。

相关模板用于生成订单中商品列表中的每个订单项。要查看我在说什么,您可以转到我的帐户 - >我的订单,选择订单,然后向下滚动以查看“订购的商品”下的表格。我想要替换的默认模板文件是sales / order / items / renderer / default.phtml。

我已成功设置扩展以使用自己的layout.xml文件。例如,我可以关闭页面上的各种块。但是,我更改模板的代码无效。我怀疑我的参考名称是不正确的,但我不确定。

这是我到目前为止所做的:

<?xml version="1.0"?>
<layout version="0.1.0">
    <sales_order_view>
        <reference name="my.account.wrapper">
            <reference name="sales.order.view">
                <reference name="order.items">
                    <reference name="sales.order.item.renderer.default">
                        <action method="setTemplate">
                            <template>groupname_extensionname/sales/order/items/renderer/default.phtml</template>
                        </action>
                    </reference>
                </reference>
            </reference>
        </reference>
    </sales_order_view>
</layout>

任何人都可以在我的xml中提供我需要的更正(如有必要,可以在其他地方提供)吗?提前谢谢。

编辑:

以下是我修改过的Ben的XML版本(他只错过了一个易于添加的参数):

<?xml version="1.0"?>
<layout version="0.1.0">
    <sales_order_view>
        <reference name="order_items">
            <action method="addItemRender">
                <arg1>default</arg1>
                <arg2>sales/order_item_renderer_default</arg2>
                <arg3>groupname_extensionname/sales/order/items/renderer/default.phtml</arg3>
            </action>
        </reference>
    </sales_order_view>
</layout>

编辑:

我发现你可以复制参数的默认xml标签,所以你可以使用type,block,template来代替arg1,arg2,arg3。

<?xml version="1.0"?>
<layout version="0.1.0">
    <sales_order_view>
        <reference name="order_items">
            <action method="addItemRender">
                <type>default</type>
                <block>sales/order_item_renderer_default</block>
                <template>groupname_extensionname/sales/order/items/renderer/default.phtml</template>
            </action>
        </reference>
    </sales_order_view>
</layout>

2 个答案:

答案 0 :(得分:4)

布局<references/>不起作用。外部标记(<sales_order_view/>)称为句柄,然后句柄内的第一级标记是创建或获取对块对象的引用的命令,然后其中的层用于通过<action/>节点调用块方法。 (两个例外是<remove/><update>,它们与块创建过程分开扫描,可以放在任何地方。)

因此,您的布局xml更新将如下所示。

<sales_order_view>
    <reference name="name.of.block.in.layout">
        <action method="setTemplate">                
            <template>groupname_extensionname/sales/order/items/renderer/default.phtml</template>
        </action>
    </reference>
</sales_order_view>

其他一些建议可以帮助您一路走来

  1. 您需要将“name.of.block.in.layout”替换为Magento为具有sales/order/items/renderer/default.phtml模板的块

  2. 的名称替换
  3. 确保将layout xml添加到ADMIN布局中。

  4. 确保在<depends/>中使用app/etc/modules/Foo_Bar.xml以确保在Mage_Adminhtml模块之后加载yoru模块。

  5. Magento有可能在PHP代码中生成您正在寻找的块,这意味着您将无法像使用它一样使用布局

  6. 查看Magento的不同默认管理主题(或使用现代版本的Magento附带的查找主题并且是默认的管理主题)可能更简单,只需通过模板替换phtml文件层次结构。

  7. (Magento布局非常复杂,我需要a small book来解释它们。)

答案 1 :(得分:2)

嘿,关于引用的一个好处是它们通过布局对象的全局空间操作,因此您不需要进行任何嵌套。通过布局xml来完成这个工作的荣誉;它很强大!

我认为,您要做的是替换在销售模块的LXML文件中设置的默认项目渲染器(请参阅sales.xml)。这些是通过来自Mage_Sales_Block_Order_Items的{​​{1}}方法添加到块类sales/order_items(或类组表示法中的addItemRender())。您需要替换存储在Mage_Sales_Block_Items_Abstract数组的default键中的渲染器,您只需执行以下操作即可:

_itemRenderers

如果这不能解决问题,请告诉我,因为除此之外不应该采取更多措施。