「<reference name="left
/> を使用してブロックを追加できない場合、CMSページにleftという名前のブロックがありますか?たとえば、Magentoサンプルデータに付属するデフォルトのホームページを検討する場合、表示されるという名前のブロックを持っています左。
ただし、バックエンドのページを見ると、ルートテンプレートを使用するように設定されていることがわかります。
`2 columns with right bar`
次に、そのコンテンツ領域に、HTMLマークアップを使用して左列が追加されます(WYSIWYGをソースビューに切り替えます)
<div class="col-left side-col">
<p class="home-callout"><a href="{{store direct_url="apparel/shoes/womens/anashria-womens-premier-leather-sandal.html"}}"><img src="{{skin url='images/ph_callout_left_top.gif'}}" alt="" border="0" /></a></p>
<p class="home-callout"><img src="{{skin url='images/ph_callout_left_rebel.jpg'}}" alt="" border="0" /></p>
{{block type="tag/popular" template="tag/popular.phtml"}}</div>
この有向グラフはleft
、フックする名前のブロックがないことを明確にします(ますフルサイズの画像をクリックします)
テンプレートの設定に関して、「レイアウト」ドロップダウンのソースを見ると
<select id="page_root_template" name="root_template" class=" required-entry select">
<option value="empty">Empty</option>
<option value="one_column">1 column</option>
<option value="two_columns_left">2 columns with left bar</option>
<option value="two_columns_right" selected="selected">2 columns with right bar</option>
<option value="three_columns">3 columns</option>
</select>
このフィールドを設定すると、保存される実際の値は次のようone_column
になります。two_columns_left
これらの値は、同じ名前のレイアウトハンドルにcorespondなど、。
#File: app/design/frontend/default/modern/layout/page.xml
<page_one_column translate="label">
<label>All One-Column Layout Pages</label>
<reference name="root">
<action method="setTemplate"><template>page/1column.phtml</template></action>
<!-- Mark root page block that template is applied -->
<action method="setIsHandle"><applied>1</applied></action>
<action method="setLayoutCode"><name>one_column</name></action>
</reference>
</page_one_column>
...
<page_two_columns_left translate="label">
<label>All Two-Column Layout Pages (Left Column)</label>
<reference name="root">
<action method="setTemplate"><template>page/2columns-left.phtml</template></action>
<!-- Mark root page block that template is applied -->
<action method="setIsHandle"><applied>1</applied></action>
<action method="setLayoutCode"><name>two_columns_left</name></action>
</reference>
</page_two_columns_left>
MagentoがCMSページをレンダリングするとき、保存された値を参照し、適切なレイアウトハンドルをページに追加します。それは質問の接線ですが、そのハンドルはここに追加されます
#File: app/code/core/Mage/Cms/Helper/Page.php
protected function _renderPage(Mage_Core_Controller_Varien_Action $action, $pageId = null, $renderLayout = true)
{
//...
$action->addActionLayoutHandles();
if ($page->getRootTemplate()) {
$handle = ($page->getCustomRootTemplate()
&& $page->getCustomRootTemplate() != 'empty'
&& $inRange) ? $page->getCustomRootTemplate() : $page->getRootTemplate();
$action->getLayout()->helper('page/layout')->applyHandle($handle);
}
//...
}
さらに重要なのは、レイアウトハンドルが追加される順序です
あなたは上のスクリーンショットで見ることができるように、page_two_columns_right
ハンドルが追加された後cms_index_index
のハンドル。つまり、レイアウトxml更新コードを追加しcms_index_index
てコード内のテンプレートを変更すると、実行されますが、その後にレイアウト更新xmlコードpage_two_columns_right
が実行されます。
ユーザーインターフェイスで設定されたテンプレートが 常に正しい。Magentoの以前のバージョンで<action method="setIsHandle"><applied>1</applied></action>
は、同じ理由でメソッド呼び出しが存在していたようです。
そのため、純粋なレイアウトxmlコードを使用して目的のことを行う方法はありません。カスタムモジュールとオブザーバーコードの作成に慣れている場合は、cms_page_render
イベントを調べてください。これloadLayoutUpdates
は呼び出される直前に発生し、追加のハンドル名をスライドさせたり、既存のハンドル名を削除したりできます。