magento - 在布局 xml 中设置 Magento block 模板

标签 magento

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

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

本质上,我想重用内置产品 View 操作的布局和 block ,但为几个 block 提供自定义模板。 (不仅仅是覆盖,这些需要是全新的模板,仅在我的自定义操作上触发并且它们本身是可覆盖的)。

我的布局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>
setTemplateproduct.info.bundle从不工作;它似乎根本不影响布局。我试过包装 <reference>在其他 <reference>来自父 block 的节点无效。是否可以以这种方式替换 block 模板?我觉得我的问题源于我使用 <update /> 的事实。 .

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

最佳答案

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

<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>

这应该以一种干净的方式处理产品 View 模板。

2.办理加工订单
如果您查看查看 block 的位置product.info.bundle对于捆绑产品的声明,您将看到它发生在 bundle.xml 文件中,在名为 <PRODUCT_TYPE_bundle> 的布局更新句柄中.

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

这里要注意的是处理订单布局句柄。
大致是:
  • <default>
  • <[route]_[controller]_[action]>
  • <custom_handles>
  • <PRODUCT_TYPE_bundle>句柄属于第三种布局句柄,即在<mymodule_product_index>之后处理。处理。
    本质上,您引用的是 block product.info.bundle在它被宣布之前。

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

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

    您可以在模块中创建一个单独的路线来显示捆绑的产品,然后包含 <PRODUCT_TYPE_bundle>使用 update 处理该页面的指令也是如此。

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

    您可以使用事件观察器在 product.info.bundle 上设置模板。如果它被实例化,则阻塞。一种可能性是事件 controller_action_layout_generate_blocks_after .

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

    关于magento - 在布局 xml 中设置 Magento block 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9543732/

    相关文章:

    php - Magento 如何 getLinkFile()

    css - Magento 顶级菜单突然停止写入 "Active"类

    Magento2 为接口(interface)编写插件

    magento - getAllVisibleItems(), getAllItems 两次返回项目

    php - 为什么图片让 Magento 变慢?

    php - magento 模型检索错误而不是对象 - 以编程方式创建订单

    javascript - 通过自定义布局更新在某些类别上按 "Color"属性隐藏商店

    magento - Nginx 在 https 域上提供非安全资源

    magento - Magento 主题中左栏的 block 类型是什么?

    mysql - Magento DB 客户订单映射