【问题标题】:Understanding getChildHtml in Magento了解 Magento 中的 getChildHtml
【发布时间】:2013-10-29 14:42:01
【问题描述】:

来自 2columns-right.phtml 中的以下行

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

我无法理解&lt;?php echo $this-&gt;getChildHtml('content') ?&gt; 中的content 来自哪里。

&lt;?php echo $this-&gt;getChildHtml('content') ?&gt;调用了哪个.phtml文件来显示数据?

【问题讨论】:

  • 没有人能从这两行代码告诉你。它肯定来自此处未提供的 PHP 代码,但包含在页面中
  • Hanky - 熟悉 Magento 的人可以。
  • getChildHtml() 只是从当前块的每个孩子返回渲染的 html。
  • 阅读此stackoverflow.com/questions/16032973/… 可能对您有所帮助

标签: php html magento


【解决方案1】:

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

<?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>

通过查看这个block标签的“type”属性,我们可以知道这部分布局是什么对象类。它来自“核心”模块,是块类型的文本列表。此 Mage_Core_Block_Text_List 的类名。 (app/code/core/Mage/Core/Block/Text/List.php)。文本列表只是块容器,目的是在其中存储额外的子块。您可以将任意数量的子块添加到文本列表中,它们将按照添加顺序或分配顺序呈现出来。

所以,为了回答您的问题,没有呈现 $this->getChildHtml('content') 内容的视图脚本(.phtml 文件)。 已被 添加到这个块,它们本身可能有与之关联的视图脚本。要找出这些是什么视图脚本,您必须找到添加了块的布局 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 对象类的块添加到名称为“内容”的块中(恰好是您询问的那个)。然后 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(默认日志文件设置)中记录一个错误,指出未找到视图脚本。该块不会有任何输出。

请注意,根据您在 System -> Configuration -> (General) Design 中的设置,Magento 可能会查看其他 package/theme 位置。还有其他情况,例如“自定义主题”字段是否为对于单个 CMS 页面、目录类别或目录产品进行了更改,这些单个模型的视图页面可能有一个额外的视图脚本位置(将匹配所选主题),该位置优先于您网站的默认设置。

Magento 在查找翻译文件和布局 XML 文件时将遵循相同的后备逻辑。

请注意,将单个视图脚本(避免复制整个目录,仅复制您实际打算修改的视图脚本)从 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 说明删除/添加到/更改,你有什么。

【讨论】:

  • 多么棒的解释。初学者会喜欢的:)
  • 如果没有参数传递,它指的是什么?即 getChildHtml() ?>
  • @version_0.1 如果没有将块名称的字符串参数传递给&lt;?php echo $this-&gt;getChildHtml() ?&gt;,则$this 的所有子块将按顺序呈现。即使它们已经在同一个视图脚本中被输出到更高的位置。
  • 您在这个全面的答案中有很多关键信息,但我非常需要“...您的主题的 XML 布局更新应该包含在...”部分。惊人的!谢谢。
  • 我在这个主题上找到的最有用的描述,哦,我是如何搜索的。你应该写一篇关于这个的博客文章,互联网缺乏关于这个主题的资源;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-23
  • 1970-01-01
  • 2012-06-09
  • 1970-01-01
  • 1970-01-01
  • 2013-06-01
相关资源
最近更新 更多