使用之前/之后放置块的Magento XML几乎不起作用

时间:2013-01-23 16:48:40

标签: xml magento

我是一个前端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之前/之后不工作”的地方,并开始怀疑它是否只是我发生这种情况......任何人都可以解释我什么时候可以使用之前/之后不能使用位置块?上面的例子有什么问题?

我在magento 1.7.0.2(发布时最新版)

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

2 个答案:

答案 0 :(得分:85)

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

  1. 当您插入core/text_list
  2. 模板块调用getChildHtml时没有任何参数
  3. 当你说

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

    你告诉Magento

      

    Hey 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调用。因此,beforeafter属性不会影响您(包括我在内的许多其他人)希望他们做的事情。

答案 1 :(得分: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) ?>