我正在尝试重新整理右侧边栏。在模板(右2列)中,它调用:<?php echo $this->getChildHtml('right') ?>
在哪里可以找到该变量的内容?
最佳答案
对方法getChildHtml()
的调用将使用传递给该方法的名称加载子块的HTML,因此在这种情况下,我们正在寻找名为right的子块。
为了确定在哪里可以找到该子块,我们需要知道哪个块正在调用此方法。我知道对getChildHtml()
方法的特定调用出现在主页列模板中,因为右边是其中的一列。因此,请查看page.xml
布局文件,并在其中找到方法调用的模板文件中进行搜索,您将发现类似以下内容:
<reference name="root">
<action method="setTemplate"><template>page/2columns-right.phtml</template></action>
<!-- Mark root page block that template is applied -->
<action method="setIsHandle"><applied>1</applied></action>
</reference>
在布局文件中使用
<reference>
标记可以更改目标块,而<action>
标记则可以在正在使用的块中运行块方法。因此,这部分布局将模板设置在根块内。由此我们知道它是调用getChildHtml()
方法的根块。接下来,让我们看一下在布局中定义根块的位置,它在相同的
page.xml
布局文件中,并且应该在顶部附近:<block type="page/html" name="root" output="toHtml" template="page/3columns.phtml">
...
<block type="core/text_list" name="right" as="right" translate="label">
<label>Right Column</label>
</block>
...
</block>
在该块中定义了很多内容,但是您可以看到它的名称为root并定义了很多子块。这些子块之一被命名为right,而这个子块的htmlt由
getChildHtml()
方法输出。重要的是要注意块类型-core/text_list
。这是一种特殊的块类型,这意味着当使用getChildHtml()
方法渲染该块的HTML时,子块也将被渲染。如果块类型像root块一样是page/html
,则添加到正确块中的每个子块都需要它自己的getChildHtml()
方法调用,使用此块类型,您只需要调用getChildHtml('right')
,所有子块也将被呈现。如您所见,此处定义了正确的块,但该块为空。这是因为,与您的标记引用根块(
<reference name="root">
)的方式完全相同,其他布局文件通过引用正确的块将子块添加到正确的块。<reference name="right">
...
</reference>
因此,为了最终回答您的问题(并希望在此过程中有所作为),您需要在
page.xml
之外的布局文件中查找对正确块的引用,在这里您将找到getChildHtml()
方法调用输出的所有子内容。您可以在自己的模块布局文件或
local.xml
布局文件(如果不创建模块)中更改添加到右侧块的内容。我用示例语法简要介绍了我的答案here中的local.xml
布局文件,以添加新块并删除其他布局文件中添加的块。