1. ホーム
  2. php

[解決済み] MagentoのgetChildHtmlを理解する

2022-02-09 06:27:13

質問

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

解決方法は?

ウェブサイトのフロントエンドの話であれば、ご質問の特定の行は......。

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

このブロックタグの "type" 属性を見れば、レイアウトのこのセクションがどのオブジェクトクラスであるかがわかります。これは"Core"モジュールに由来し、ブロック・タイプはText Listです。この 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 のブロックを、名前が '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

最初に見つかったものが使用されます。ビュースクリプトが見つからなかった場合は var/logs/system.log (デフォルトのログファイル設定) に、ビュースクリプトが見つからなかったと記載されています。このブロックからの出力は発生しません。

システム -> 構成 -> (一般)設計での設定によっては、さらに別の package/theme の場所を探します。また、個々の CMS ページ、カタログカテゴリ、またはカタログ商品について "Custom Theme" フィールドが変更された場合、これらの個々のモデルのビューページには、サイトのデフォルト設定よりも優先される追加のビュースクリプトの場所(選択したテーマに一致する)があるかもしれないといったシナリオもあります。

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 命令で可能です。