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

我正在尝试创建一个模块,为现有页面添加新内容。 出于测试目的,我试图添加到结帐/购物车/索引页面,但我想要一个通用解决方案,因为还有其他页面需要修改。

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

此线程Magento - 使用购物车页面上的自定义模块添加自定义块,显示如何添加块,但接受的答案不适用于我。 我已经遵循链接到Alan Storms的答案另一个Stackoverflow问题Magento XML使用之前/之后放置块几乎永远不会工作,我有点理解,如果有直接调用getChildHtml('subblockname')在块模板文件中。

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

谢谢。


您不需要覆盖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>

您只需使用两种方法只使用您自己的布局来插入块,并将该块输出到页面中。

首先,您需要布局将块插入具有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"将块定位在列表中的特定块之前,并且after="block.alias"将其定位在特定块之后。 您可以after="-"写入after="-"以便将块放置在列表的底部。

这里有对Magento布局系统的简要介绍。

如果您打算分发模块,您会发现大多数人已修改和自定义要修改的页面的模板,布局或两者,并且您的非侵入式方法将无法工作,修改并覆盖核心模板,使用布局将块的模板更改为您自己修改的模板(不使用文件系统覆盖文件),或指导最终用户如何将正确的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>

您还应该提供有关如何通过添加echo $this->getChildHtml('your.block.alias');将您的更改集成到第三方模板echo $this->getChildHtml('your.block.alias'); 在必要时。

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

链接地址: http://www.djcxy.com/p/59485.html

上一篇: Magento extension adding and positioning new blocks in existing/core pages

下一篇: Magento: error for custom module (Class not found in Layout.php)