php - 通过 module.xml 文件的 Magento block 注入(inject)

标签 php xml magento

在我正在编写的模块中,我想使用 mymodule.xml 在此 block 之后插入我自己的 block :

<block type="catalog/product_view_media" name="product.info.media" as="media" template="catalog/product/view/media.phtml"/>

嵌套在

<reference name="content">
    <block type="catalog/product_view" name="product.info" template="catalog/product/view.phtml">

可以在app/design/frontend/base/default/layout/catalog.xml中看到

我尝试了很多变体,例如:

<reference name="content">
   <reference name="product.info">
      <block type="mymodule/folder_class" after="media" name="mymodule.folder.class" template="mymodule/folder/class.phtml" as="mymodule_folder_class"></block>
   </reference>
</reference>

只是

<reference name="product.info">
   <block type="mymodule/folder_class" after="media" name="mymodule.folder.class" template="mymodule/folder/class.phtml" as="mymodule_folder_class"></block>
</reference>

<reference name="product.info">
   <block type="mymodule/folder_class" after="media" name="mymodule.folder.class" template="mymodule/folder/class.phtml" as="mymodule_folder_class"></block>
</reference>

但我似乎找不到正确的组合。 唯一呈现我的 block 的是:

<reference name="content">
   <block type="mymodule/folder_class" after="media" name="mymodule.folder.class" template="mymodule/folder/class.phtml" as="mymodule_folder_class"></block>
</reference>

但很明显它没有放在我想放的地方。

最佳答案

如果您查看 page.xml 中内容 block 的声明,您将看到以下内容。

<block type="core/text_list" name="content" as="content" translate="label">

默认情况下,名为 content 的 block 是 core/text_list,转换为 Mage_Core_Block_Text_List

core/text_list block 的目的很简单。它们自动呈现插入其中的任何 block 。这就是您可以成功将 block 插入内容的原因。

您想要插入的 block

<block type="catalog/product_view" name="product.info" template="mymodule/folder/class.phtml" ...

是一个catalog/product_view,转化为一个Mage_Catalog_Block_Product_View,最终继承自Mage_Core_Block_Template。这使它成为一个模板 block 。模板 block 不会自动渲染它们的 child 。模板 block 将呈现一个 phtml 文件。如果 phtml 包含对

的调用
$this->getChildHtml('block_name');

然后将呈现具有该特定名称的 block 。如果 phtml 文件包含对

的调用
$this->getChildHtml(); //no arguments

然后将呈现所有子 block 。

所以,当你说

<reference name="product.info">
   <block type="mymodule/folder_class" after="media" name="mymodule.folder.class" template="mymodule/folder/class.phtml" as="mymodule_folder_class"></block>
</reference>

您正在插入 mymodule/folder_class 类型的 block 到 product.info block 中。但是,因为 product.info 是模板 block 而不是文本列表 block ,所以它不会呈现您插入的 block 。您需要将自定义 catalog/product/view.phtml 模板添加到您的主题(通过复制基本模板),然后在 view.phtml 的底部, 添加

<?php echo $this->getChildHtml('mymodule.folder.class');?>

关于php - 通过 module.xml 文件的 Magento block 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4651859/

相关文章:

php - 在付款捕获后调用 Magento 事件观察器

php - 从下拉列表中选择选项运行 SQL 查询

php - Laravel 上传文件到项目目录外的不同存储

java - 我如何使抽象类与 JAXB 一起工作

attributes - Magento:从没有产品的属性集中获取属性

wordpress - 开设网上商店:我该如何选择?

php - 如何单击图像 href 并转到新页面。并显示来自 phpmyadmin 的信息

javascript - 动态 html/php

c# - 在运行时创建 XML

xml - Blogger URL 条件语句