在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正在加载并且没有错误,文件的其余部分工作正常,缓存被禁用,无论如何都清除了缓存等等。
答案 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>
。
这里需要注意的是布局句柄的处理顺序。 大致是:
<default>
<[route]_[controller]_[action]>
<custom_handles>
<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。