了解Magento中的getChildHtml

从2columns-right.phtml中的以下行开始

<div class="col-main"> <?php echo $this->getChildHtml('global_messages') ?> <?php echo $this->getChildHtml('content') ?> </div> 

我无法理解, <?php echo $this->getChildHtml('content') ?>内容即将到来。

witch .phtml文件被调用来显示数据<?php echo $this->getChildHtml('content') ?>

如果我们正在讨论网站的前端,那么您所问的特定线路……

 <?php echo $this->getChildHtml('content') ?> 

被添加到app / design / frontend / base / default / layout / page.xml中的Magento布局XML中。 在Magento 1.8版中,你会发现它定义在92-94行。

 <block type="core/text_list" name="content" as="content" translate="label"> <label>Main Content Area</label> </block> 

通过查看这个块标签的“types”属性,我们可以知道该部分的布局是什么对象类。 它来自“核心”模块,并且是块types的文本列表。 这个Mage_Core_Block_Text_List的类名。 (应用程序/代码/核心/法师/核心/砌块/文本/ list.php的)。 文本列表只是块容器,目的是在其中存储额外的子块。 您可以将任意数量的子块添加到文本列表中,它们将按照添加顺序或分配顺序进行渲染。

所以,回答你的问题,没有视图脚本(.phtml文件)呈现$ this-> getChildHtml('content')的内容。添加到此块的块本身可能具有与其关联的视图脚本。 为了找出这些脚本是什么,你必须find添加了块的布局XML。

例如,如果我将以下布局文件添加到我的网站主题的前端:

 <?xml version="1.0"?> <layout> <default> <reference name="content"> <block type="core/template" name="my_view_script" template="hello/world.phtml" /> </reference> </default> </layout> 

上面的代码会将带有Mage_Core_Block_Template对象类的块添加到名称为“content”的块(恰好是您询问的块)。 然后,Magento将按以下顺序在以下位置查找脚本:

 app/design/frontend/PACKAGE_NAME/THEME_NAME/template/hello/world.phtml app/design/frontend/PACKAGE_NAME/default/template/hello/world.phtml app/design/frontend/base/default/template/hello/world.phtml 

首先find的是它将使用的一个。 如果没有发现视图脚本,Magento会在var/logs/system.log (默认日志文件设置)中logging一个错误,指出没有find视图脚本。 块将不会输出。

请注意,根据您在系统 – >configuration – >(一般)devise中的设置,可能会有额外的package/theme位置Magento将查找。还有其他情况下,如“自定义主题”字段更改为个人CMS页面,目录类别或目录产品,这些单独模型的视图页面可能会有一个附加的视图脚本位置(与选定的主题相匹配),该位置优先于站点的默认设置。

在寻找翻译文件和布局XML文件时,Magento将遵循这个同样的后备逻辑。

请注意,从app/design/frontend/base/default/template/复制单个视图脚本(避免复制整个目录,只复制实际上想要修改的视图脚本)是完全可以接受的,并且可以自定义他们为您的网站的主题的目的。 但是,为了使升级兼容​​的网站, 布局文件不应该从基地复制到您的本地主题。 这样做,不遵循升级兼容的做法。 相反,您的主题的XML布局更新应该包含在app/design/frontend/PACKAGE_NAME/THEME_NAME/layout/local.xml 。 没有来自app/design/frontend/base/default/layout/*指示,不能通过local.xml中的正确的XML指令来删除/添加/更改。