詳細な説明については、Alanstormの本「NoFrillsMagentoLayout」を読むことができます。少し啓発できるように、「簡単な」説明をします。
コントローラでは、を呼び出すと、ハンドル$this->loadLayout();
が自動的に「呼び出され」ます。<default>
後で、すべてのレイアウトxmlのすべてのハンドルがマージされます。
たとえば<default>
、page.xmlにあると<default>
すると、catalog.xmlにもあります。$this->loadLayout()
page.xml<default>
とcatalog.xmlからの呼び出しの後、マージされます。
それがそれらの間の関係です。
私たち<default>
はすべての主なものであると言うことができます。主な構造です。他のレイアウトは通常、そこから「参照」します。
本体(コンテンツ)に何かを追加したいとしましょう。
<reference name="content">
<block type="core/template" name="testing" template="some/test/template.phtml"></block>
</reference>
それらのタグは次のことを意味します:<block type="core/template" name="testing" template="some/test/template.phtml"></block>
名前の内容でブロックの下に置きます。
名前が内容のブロックの定義が表示された場合:
<block type="core/text_list" name="content" as="content" translate="label">
<label>Main Content Area</label>
</block>
タイプがであることがわかりますcore/text_list
。このタイプのブロックは、その下のすべての子をレンダリングし、テンプレートは必要ありません。ご覧のとおり、template = "blabla/blibli.phtml"の定義はありません。
テンプレートを持つブロックのタイプはですcore/block_template
。このタイプのブロックでは、子をレンダリングする場合は、「意識的に」呼び出す必要がありますecho $this->getChildHtml('mykid')
。
わかりますか?
そのため、定義が正しくありません<block type="core/text_list" name="main" as="main" translate="label" template="page/html/main.phtml">
。
core/text_list
テンプレートは必要ありません。「コンテンツ」がcore/block_template
:であるかどうかを想像することができます。「コンテンツ」の下に子を作成するたびに、「意識的に」呼び出す必要がありますecho $this->getChildHtml('mykid')
。100人の子供がいるとしましょう。 、、、 ...、echo $this->getChildHtml('mykid1')
に電話する必要があります。echo $this->getChildHtml('mykid2')
echo $this->getChildHtml('mykid100')
次に、catalog.xmlを見てみましょう。
<default>
<!-- Mage_Catalog -->
<block type="core/template" name="top" template="page/html/top.phtml"></block>
<block type="core/template" name="header" template="page/html/header.phtml"></block>
<block type="core/template" name="main" template="page/html/main.phtml">
<block type="core/template" name="left" template="page/html/left.phtml"></block>
<block type="core/template" name="middle" template="page/html/middle.phtml"></block>
<block type="core/template" name="right" template="page/html/right.phtml"></block>
</block>
<reference name="footer_links">
<action method="addLink" translate="label title" module="catalog" ifconfig="catalog/seo/site_map">
<label>Site Map</label>
<url helper="catalog/map/getCategoryUrl" />
<title>Site Map</title>
</action>
</reference>
<block type="catalog/product_price_template" name="catalog_product_price_template" />
</default>
このcatalog.xmlからあなたが達成しようとしていることはわかりません。<block type="core/template" name="top" template="page/html/top.phtml"></block>
、、などの参照はありません<block type="core/template" name="header" template="page/html/header.phtml"></block>
。
レイアウト(子)を追加する場合は、既存のレイアウトから「参照」する必要があります。「main」という名前のブロックの下に子を追加し、catalog.xmlにコードを配置するとします。
その場合、catalog.xmlは次のようになります。
<default>
<reference name="main">
<block type="core/template" name="i" template="my/new/template1.phtml"></block>
<block type="core/template" name="dont" template="my/new/template2.phtml"></block>
<block type="core/template" name="know" template="my/new/template3.phtml"></block>
</reference>
</default>
これは、「main」という名前のブロックの定義に依存します。
「main」という名前のブロックが次の場合:
<block type="core/text_list" name="main" as="main" translate="label">
...
</block>
次に、それらのブロック(「i」、「dont」、「know」という名前のブロック)が自動的に呼び出されます(レンダリングされます)。
「main」という名前のブロックが次の場合:
<block type="core/template" name="main" as="main" translate="label" template="page/html/main.phtml">
...
</block>
次に、これをあなたのpage/html/main.phtml
:で呼び出す必要があります
echo $this->getChildHtml('i');
echo $this->getChildHtml('dont');
echo $this->getChildHtml('know');
レイアウトの内容がかなり間違っているので、私が説明できる限りでは、要点がわかれば、私の説明を読んで修正することができます。
いくつかのヒント:
ロードされたハンドルを確認するには、このコードをコントローラーの$this->loadLayout();
次の場所に配置します。
$layout = Mage::getSingleton('core/layout');
$updates = $layout->getUpdate();
$handles = $updates->getHandles();
var_dump($handles);
ロードレイアウトから生成されたxmlを確認するには、このコードをコントローラーの次の場所に配置します$this->loadLayout();
。
$layout = Mage::getSingleton('core/layout');
$updates = $layout->getUpdate();
$xml = $updates->asString();
var_dump($xml);
多分あなたはecho "<pre>" / wrap using htmlentities / Mage::log
きちんとした見た目の目的のために必要になるでしょう。