在我正在编写的模块中,我想使用 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/