43

我是一个前端 Magento 开发人员,已经构建了很多自己的主题,我想更好地理解 Magento 的 XML 块定位...

我通常使用local.xml文件来操作所有内容,我可以如下定义一个块:

<cms_index_index>
   <reference name="root">
      <block type="core/template" name="example_block" as="exampleBlock" template="page/html/example-block.phtml"/>
   </reference>
</cms_index_index>

这会cms_index_index在主页(root

<?php echo $this->getChildHtml('exampleBlock') ?>

...到1column.phtml(或2columns-left/right.phtml3columns.phtml)。cms_index_index通过替换适当的页面标签,可以将块放置在任何页面上。

我在核心 XML 文件和教程中看到如下内容:

<reference name="root">
   <block type="core/template" name="example_block" before="content" template="page/html/example-block.phtml"/>
</reference>

content是一个块,它是magento的一般页面结构的一部分,据我了解,before="content"应该将它放在你期望的地方,而不需要使用getChildHtml('exampleBlock'),到目前为止这么好......但是,之前/之后似乎几乎没有工作我,而且我经常发现自己求助于 getChildHtml 方法作为备份,这并不总是理想的,并且意味着编辑更多的 .phtml 文件而不是必要的。

我试过了:

<reference name="root">
   <block type="core/template" name="example_block" before="content" template="page/html/example-block.phtml"/>
</reference>

什么都没有出现...

<reference name="root">
   <block type="core/template" name="example_block" after="header" template="page/html/example-block.phtml"/>
</reference>

仍然没有....我也知道在它的父块内的所有内容之前使用before="-"after="-"放置一些东西。我偶尔会有一些运气,但通常只是感到困惑和沮丧。

我已经到处搜索“magento xml before/after not working”,并开始怀疑是否只是我发生了这种情况……谁能解释我什么时候可以和不能使用 before/after 来定位块?上面的例子有什么问题?

我在 magento 1.7.0.2 (发布时最新可用)

这样做的主要动机是减少我需要编辑的核心 .phtml 文件的数量getChildHtml(),所以如果有另一种(XML)方法来解决这个问题,我很想知道......

4

2 回答 2

87

beforeand属性仅适用于以下after两种情况之一:

  1. 当你插入一个core/text_list
  2. 当您的模板块调用getChildHtml不带任何参数时

当你说

<reference name="root">
   <block type="core/template" name="example_block" before="content" template="page/html/example-block.phtml"/>
</reference>

你在告诉 Magento

嘿,Magento,把块放在example_block里面root

当您将许多不同的块放入父级中时,这些块具有隐式顺序。对于模板块,这个顺序无关紧要,因为这些块是显式渲染的。

<?php echo $this->getChildHtml('example_block') ?>

但是,有两种情况下顺序很重要。首先,如果你打电话

<?php echo $this->getChildHtml() ?>

从模板中,然后 Magento 将按顺序渲染所有子块。

其次,有一种特殊类型的块,称为“文本列表”(core/text_list/ Mage_Core_Block_Text_List)。这些块再次按顺序自动渲染所有子块。该content块就是一个例子

<block type="core/text_list" name="content"/>

这就是为什么您可以将块插入content并自动渲染的原因。

因此,在上面的示例中,您将块插入root块中。该root块是一个模板块,其 phtml 模板使用getChildHtml带有显式参数的调用。因此,beforeandafter属性不会像您(以及包括我在内的许多其他人)希望他们做的那样。

于 2013-01-23T18:38:33.330 回答
0

我想知道,但似乎Mage_Core_Block_Abstract

public function getChildHtml($name = '', $useCache = true, $sorted = false)

由于$sorted = false.

所以最后块的顺序/排序默认情况下只考虑在Core/Block/Text/List- 块中。

如果要确保以正确的顺序输出子块,则必须使用:

<?php echo $this->getChildHtml('', true, true) ?>
于 2020-06-29T12:17:00.503 回答