在布局xml中设置Magento块模板

Nic*_*rty 8 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>
Run Code Online (Sandbox Code Playgroud)

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

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

Vin*_*nai 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>
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

  1. <default>
  2. <[route]_[controller]_[action]>
  3. <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.