Magento XML使用之前/之后放置块几乎不可行

我是一个前端的Magento开发者,已经构build了很多我自己的主题,我想更好地理解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> 

这将在主页上创build一个块( cms_index_index ),并且由于该块是在root下创build的,所以我通常会通过添加以下内容来调用块:

 <?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之前/之后不工作',并开始怀疑它是否只是我这发生…任何人都可以解释我什么时候可以和不能之前/之后定位块吗? 上面的例子有什么问题?

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

主要的动机是减less我需要编辑的核心.phtml文件的数量只是为了添加一个getChildHtml() ,所以如果有另一种(XML)的方式来解决这个问题,我会有兴趣知道…

beforeafter属性只能用于以下两种情况之一:

  1. 当你插入一个core/text_list
  2. 当你的getChildHtml没有任何参数调用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将呈现所有的孩子块,按顺序。

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

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

这就是为什么你可以插入块的content ,他们自动渲染。

所以,在你上面的例子中,你将块插入到root块中。 root块是一个模板块,其phtml模板使用带显式参数的getChildHtml调用。 因此, beforeafter属性不会做你(包括我在内的许多人)所希望的。