Magento扩展在现有/核心页面中添加和定位新块

时间:2013-10-03 17:37:07

标签: php magento templates layout block

我正在尝试创建一个向现有页面添加新内容的模块。出于测试目的,我正在尝试添加到checkout / cart / index页面,但我想要一个通用的解决方案,因为我需要修改其他页面。

我已经检查了通过将现有模板文件的所有代码复制到覆盖模板然后使用getChildHtml('some_block')在适当的位置显示新块来实现此目的的免费扩展代码。我想添加我的块而不必覆盖任何核心模板​​文件,以使我的模块尽可能可编译。

此帖子Magento - Add custom block using custom module on Shopping Cart page显示了如何添加块,但接受的答案对我不起作用。我已经关注了Alan Storms对另一个Stackoverflow问题Magento XML using before/after to place blocks hardly ever works的回答的链接,我理解大多数块类型只会在块模板文件中直接调用getChildHtml('subblockname')时呈现子块。

是否有一种向现有网页的任何部分添加块的一般方法,而不必覆盖模板文件? Magneto模块中添加到页面上现有内容的首选方式是什么,因为我无法相信覆盖核心文件是实现此目的的方法。

感谢。

2 个答案:

答案 0 :(得分:1)

您无需覆盖magento本机模板文件。只需创建自己的主题。 Magento将在您的主题中搜索标记文件,如果他没有找到它,那么他将使用基本主题。

您还可以使用xml布局为此模板设置自己的模板文件名或路径。您需要的所有内容 - 为现有块名称提供参考并添加动作setTemplate。例如:

<layout>
    <checkout_onepage_review>
        <reference name="root">
            <action method="setTemplate">
                <template>my/path/to/template/file.phtml</template>
            </action>
        </reference>
    </checkout_onepage_review>
</layout>

答案 1 :(得分:1)

只需使用自己的布局插入一个块就需要两件事,并在页面中输出块。

首先,您需要使用布局将块插入具有type="core/text_list"属性的现有块 - 或者扩展Mage_Core_Block_Text_List类的块。 core/text_list块的示例包括left,right,content,before_body_end等。

其次,您需要分配给该块的模板才能包含此调用:

echo $this->getChildHtml();
//note that there is no block alias parameter passed in to this function

在没有块别名的情况下调用getChildHtml()将按顺序输出所有子块。如果您的块是这个布局的孩子,那么它也将被输出。

我假设您的模块有自己的布局文件链接自etc/config.xml,在这种情况下,您可以尝试添加此布局更新:

<default><!-- On all pages -->

  <reference name="content"><!-- in the content (middle) column -->

    <block type="your_module/your_block" name="my.test.module" template="your/template/path.phtml" before="-" /><!-- insert your block -->

  </reference>

</default>

一旦你看到它正常工作,你就可以开始挖掘默认布局,找到可以插入你的块。

请注意before="-"属性。 这会导致在该容器中的所有其他块之前插入块。 您还可以使用before="block.alias"在块中的特定块之前定位块,并{/ 1}}在特定块之后将其定位。 您可以编写after="block.alias"将块放在列表底部。

简要介绍Magento layout system here

如果您计划分发您的模块,您会发现大多数人都修改并自定义了您要修改的页面的模板,布局或两者,并且您的非侵入式方法将无效,您将必须修改和覆盖核心模板,使用布局将块的模板更改为您自己的修改模板(不使用文件系统覆盖文件),或者指示最终用户如何添加正确的after="-"命令进入他们现有的模板。

相反,我建议采用这种方法:

将新模板添加到模块的模板文件夹中,这些模板从base / default或default / default模板修改,足以使模块在这些主题中工作。

向您的模块添加自定义布局,以便在安装时进行这些更改 - 覆盖您需要在布局中修改的块的模板:

echo

您还应该在必要时添加<checkout_cart_index><!-- on the cart page --> <reference name="checkout.cart"><!-- in the cart block --> <action method="setTemplate"><!-- change the block's template --> <template>path/to/your/modified/template.phtml</template> </action> </reference> </checkout_cart_index> ,提供有关如何将更改集成到第三方模板的文档。

定制主题的人必须接受他们必须自定义其他功能或调整现有更改,才能在主题中使用它们。