背景:我正在使用< update />更新自定义操作中的布局句柄.在我的模块的布局xml中标记.
本质上,我想重用内置产品视图操作的布局和块,但为几个块提供自定义模板. (不仅仅是覆盖,这些都需要是全新的模板,只能在我的自定义操作中触发,并且可以自行覆盖).
我的布局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>
product.info.bundle上的setTemplate永远不会起作用;它似乎根本不会影响布局.我试过包装< reference>在其他<参考>来自父块的节点无效.是否可以用这种方式替换块模板?我觉得我的问题源于我正在使用< update />.
两件事情:
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> handle属于第三种类型的布局句柄,这意味着它在< mymodule_product_index>之后处理.处理.
实质上,您在声明块之前引用块product.info.bundle.
要解决此问题,您需要使用< PRODUCT_TYPE_bundle>也处理.当然,这将影响每个捆绑的产品展示.仅使用布局XML,没有干净的方法.
以下是如何解决该问题的一些建议.
您可以在模块中创建单独的路径以显示捆绑的产品,然后包含< PRODUCT_TYPE_bundle>处理使用该页面的更新指令.
在自定义操作控制器中,您可以添加在< PRODUCT_TYPE_bundle>之后处理的另一个布局更新句柄.
如果实例化,您可以使用事件观察器在product.info.bundle块上设置模板.一种可能性是事件controller_action_layout_generate_blocks_after.