我正在尝试重新整理右侧边栏。在模板(右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布局文件,以添加新块并删除其他布局文件中添加的块。

10-04 14:49