通过module.xml文件进行Magento Block Injction

epe*_*leg 8 php xml magento

在我写的模块中,我想使用mymodule.xml在这个块之后插入我自己的块:

<block type="catalog/product_view_media" name="product.info.media" as="media" template="catalog/product/view/media.phtml"/>
Run Code Online (Sandbox Code Playgroud)

嵌套在里面

<reference name="content">
    <block type="catalog/product_view" name="product.info" template="catalog/product/view.phtml">
Run Code Online (Sandbox Code Playgroud)

可以在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>
Run Code Online (Sandbox Code Playgroud)

只是

<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>
Run Code Online (Sandbox Code Playgroud)

<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>
Run Code Online (Sandbox Code Playgroud)

但我似乎无法找到正确的组合.渲染我块的唯一一个是:

<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>
Run Code Online (Sandbox Code Playgroud)

但显然它不是放在我希望放置的地方.

Ala*_*orm 18

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

<block type="core/text_list" name="content" as="content" translate="label">
Run Code Online (Sandbox Code Playgroud)

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

core/text_list块的目的很简单.它们会自动渲染插入其中的任何块.这就是为什么你可以成功地将一个块插入内容.

插入的块

<block type="catalog/product_view" name="product.info" template="mymodule/folder/class.phtml" ...
Run Code Online (Sandbox Code Playgroud)

是一个catalog/product_view,转换为a Mage_Catalog_Block_Product_View,最终继承自Mage_Core_Block_Template.这使它成为一个模板块.模板块不会自动呈现其子项.模板块将呈现phtml文件.如果phtml包含调用

$this->getChildHtml('block_name');
Run Code Online (Sandbox Code Playgroud)

然后将呈现具有该特定名称的块.如果phtml文件包含调用

$this->getChildHtml(); //no arguments
Run Code Online (Sandbox Code Playgroud)

然后将呈现所有子块.

所以,当你说的时候

<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>
Run Code Online (Sandbox Code Playgroud)

你正在块中插入一个类型mymodule/folder_classproduct.info块.但是,因为product.info是模板块而不是文本列表块,所以它不会渲染您插入的块.您需要为catalog/product/view.phtml主题添加自定义模板(通过复制基本模板),然后在底部view.phtml添加

<?php echo $this->getChildHtml('mymodule.folder.class');?>
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用local.xml [trick](http://inchoo.net/ecommerce/magento/using-local-xml-for-overriding-or-updating-xml-structure/)来复制基本模板,而不是复制基本模板.覆盖布局. (2认同)