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.phtml
, 3columns.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)的方式来解决这个问题,我会有兴趣知道…
before
和after
属性只能用于以下两种情况之一:
- 当你插入一个
core/text_list
块 - 当你的
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
调用。 因此, before
和after
属性不会做你(包括我在内的许多人)所希望的。