1

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

我已经检查了免费扩展的代码,它通过将现有模板文件的所有代码复制到覆盖模板中,然后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 几乎无法正常工作,我有点理解大多数块类型只会getChildHtml('subblockname')在块模板中有直接调用时才会呈现子块文件。

是否有一种通用方法可以将块添加到现有页面的任何部分而无需覆盖模板文件?Magneto 模块中添加到页面上现有内容的首选方式是什么,因为我无法相信覆盖核心文件是这样做的方式。

谢谢。

4

2 回答 2

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>
于 2013-10-03T18:59:59.570 回答
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"将块定位在列表中的特定块之前,并将after="block.alias"其定位特定块之后。你可以写信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');您还应该提供有关如何通过在必要时添加来将您的更改集成到第三方模板的文档。

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

于 2013-10-03T20:09:59.233 回答