在布局xml中设置Magento块模板

时间:2012-03-03 05:21:37

标签: magento

在Magento的布局xml中设置块模板时遇到问题。我正在尝试设置子块的模板,而不是整个页面布局(几乎所有文档都解释了如何设置布局模板)。

背景:我在我的自定义操作中更新布局句柄,使用模块布局xml中的<update />标记。

基本上,我想重用内置产品视图操作的布局和块,但为几个块提供自定义模板。 (不仅仅是覆盖,这些都需要是全新的模板,只能在我的自定义操作中触发,并且可以自行覆盖)。

我的布局html:

<?xml version="1.0"?>
<layout version="0.1.0">
<mymodule_product_index>
    <update handle="catalog_product_view" />
    <reference name="content">
        <block type="catalog/product_view" 
        name="product.info" output="toHtml" template="mymodule/product.phtml" />
        </reference>

    <reference name="product.info.bundle">
        <action method="setTemplate"><template>mymodule/customtemplate.phtml</template></action>
    </reference>
</mymodule_product_index>
</layout>

setTemplate product.info.bundle永远不会有效;它似乎根本不影响布局。我已经尝试从父块中将<reference>包装在其他<reference>节点中而不起作用。是否可以用这种方式替换块模板?我觉得我的问题源于我使用的<update />

顺便说一句,我知道我的布局xml正在加载并且没有错误,文件的其余部分工作正常,缓存被禁用,无论如何都清除了缓存等等。

1 个答案:

答案 0 :(得分:18)

你的方法几乎是正确的 两件事:
1。设置新模板而不是实例化新块
您只是创建一个具有相同名称的新实例,替换原始实例,然后在其上设置新模板,而不是仅仅为product.info块分配不同的模板。而是使用它:

<mymodule_product_index>
    <update handle="catalog_product_view" />
    <reference name="product.info">
        <action method="setTemplate">
            <template>mymodule/product.phtml</template>
        </action>
    </reference>
</mymodule_product_index>

这应该以干净的方式处理产品视图模板。

<强> 2。处理处理订单
如果查看声明捆绑产品的视图块product.info.bundle的位置,您将看到它发生在bundle.xml文件中,名为<PRODUCT_TYPE_bundle>的布局更新句柄中。

您的代码引用了<[route]_[controller]_[action]>布局句柄中的块,即<mymodule_product_index>

这里需要注意的是布局句柄的处理顺序。 大致是:

  1. <default>
  2. <[route]_[controller]_[action]>
  3. <custom_handles>
  4. <PRODUCT_TYPE_bundle>句柄属于第三种布局句柄,这意味着它在<mymodule_product_index>句柄之后处理。
    实质上,您在声明块product.info.bundle之前就引用它。

    要解决此问题,您还需要使用<PRODUCT_TYPE_bundle>句柄。当然,这将影响每个捆绑的产品展示。仅使用布局XML,没有干净的方法。

    以下是如何解决该问题的一些建议。

    您可以在模块中创建单独的路径以显示捆绑的产品,然后使用<PRODUCT_TYPE_bundle>指令包含update句柄。

    在自定义操作控制器中,您可以添加另一个在 <PRODUCT_TYPE_bundle>之后处理的布局更新句柄。

    如果实例化了product.info.bundle块,您可以使用事件观察器来设置模板。一种可能性是事件controller_action_layout_generate_blocks_after

    你明白了,有很多方法可以解决这个问题,但它们需要PHP。