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

时间:2011-01-10 21:45:35

标签: php xml magento

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

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

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

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

但很明显它并没有放在我希望放置的地方。

2 个答案:

答案 0 :(得分:18)

如果您查看page.xml中内容阻止的声明,您会看到以下内容。

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

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

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

阻止阻止>进入

<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。这使它成为一个模板块。模板块会自动呈现他们的孩子。模板块将呈现phtml文件。如果phtml包含对

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

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

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

然后全部将呈现子块。

所以,当你说

<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块中插入 product.info类型的块。但是,因为product.info是模板块而不是文本列表块,所以它不会渲染您插入的块。您需要在主题中添加自定义catalog/product/view.phtml模板(通过复制基本模板),然后在view.phtml的底部添加

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

答案 1 :(得分:0)

如果您想在catalog/product/view action中添加该块,我相信您应该这样做,否则将catalog_product_view替换为所需的操作,或default替换任何操作。

<layout version="0.1.0">
    <catalog_product_view>
        <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>
    </catalog_product_view>
</layout>