了解 Magento 中的 getChildHtml

2022-08-30 09:19:36

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

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

我无法理解进来从何而来。content<?php echo $this->getChildHtml('content') ?>

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


答案 1

如果我们正在讨论网站的前端,那么您询问的特定行....

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

添加到应用/设计/前端/基本/默认/布局/页面的 Magento 布局 XML 中.xml。在Magento版本1.8中,您将在第92-94行中找到它的定义。

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

通过查看此块标记的“type”属性,我们可以知道此布局的这一部分是什么对象类。它来自“核心”模块,属于块类型文本列表。此Mage_Core_Block_Text_List的类名。(应用程序/代码/核心/法师/核心/块/文本/列表.php)。文本列表只是块容器,其目的是在其中存储其他子块。您可以向文本列表中添加任意数量的子块,它们将按照添加顺序或分配顺序呈现出来。

因此,为了回答您的问题,没有视图脚本(.phtml文件)可以呈现$this->getChildHtml('content')的内容。添加到此块中的块本身可能具有与之关联的视图脚本。要找出这些是什么视图脚本,您必须找到添加块的布局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

找到的第一个,是它将要使用的那个。如果未找到视图脚本,Magento 将在(默认日志文件设置)中记录错误,指出找不到视图脚本。不会出现来自该块的输出。var/logs/system.log

请注意,根据您在系统->配置->(常规)设计中的设置,Magento可能会查找其他位置。还有其他一些情况,例如,如果更改了单个 CMS 页面、目录类别或目录产品的“自定义主题”字段,则这些单个模型的视图页面可能具有优先于站点默认设置的其他视图脚本位置(将与所选主题匹配)。package/theme

Magento 在寻找翻译文件以及布局 XML 文件时将遵循相同的回退逻辑。

请注意,将单个视图脚本(避免复制整个目录,仅复制您实际要修改的视图脚本)复制到本地主题是完全可以接受的,并针对您网站的主题进行自定义。但是,为了升级兼容的网站,不应将布局文件从 base 复制到本地主题。这样做,不遵循升级兼容的做法。相反,主题的 XML 布局更新应包含在 中。中没有无法删除/添加/更改的布局说明,您有什么,以及本地.xml中的正确 XML 说明。app/design/frontend/base/default/template/app/design/frontend/PACKAGE_NAME/THEME_NAME/layout/local.xmlapp/design/frontend/base/default/layout/*


答案 2

推荐