レイアウトアップデート用のCMS XMLハンドル
-
16-10-2019 - |
質問
CMSページのレイアウトを更新するためにCMSハンドルを使用しようとしたいくつかのシナリオがありました。たとえば、cms_index_indexハンドル参照ルートを使用してページテンプレートを設定しようとしていました。これは失敗し、HomePage CMSページの表示設定で管理システムを介してこのレイアウトを更新する必要がありました。
また、CMS_Pageハンドルを使用して、左の参照にブロックを追加しようとしました。繰り返しますが、これは失敗し、管理システムを介してレイアウトアップデートを実装する必要がありました。
ルートテンプレートをCMSページに割り当てることができないことを読みました。それは正しいですか、誰かがその理由を説明できますか?
また、CMSハンドルが左、右、ルートなどの標準参照を使用できるようにする方法があるかどうか疑問に思いましたか?頭やコンテンツのようなものをうまく参照できるようです。
解決
ルートテンプレートを変更する理由が機能しない理由
両方
Mage_Cms_IndexController::indexAction()
と
Mage_Cms_IndexController::viewAction()
デフォルトのホームページとCMSページをそれぞれヘルパーに呼び出す責任があります。
Mage::helper('cms/page')->renderPage($this, $pageId)
ヘルパー(App/Code/Core/Mage/CMS/Helper/page.phpにある)にジャンプしてフォローしている場合 renderPage()
保護された方法に _renderPage()
Magentoがルートテンプレートを2回チェックしていることがわかります(Magento CE 1.7.0.2):
if ($page->getRootTemplate()) {
$handle = ($page->getCustomRootTemplate()
&& $page->getCustomRootTemplate() != 'empty'
&& $inRange) ? $page->getCustomRootTemplate() : $page->getRootTemplate();
$action->getLayout()->helper('page/layout')->applyHandle($handle);
}
と
if ($page->getRootTemplate()) {
$action->getLayout()->helper('page/layout')
->applyTemplate($page->getRootTemplate());
}
両方の呼び出しは、「cms_page」のようなレイアウトハンドルの後に発生します。
ルートテンプレートを変更するためにできること
イベントがあります cms_page_render
CMSページに独自のXMLレイアウトハンドルを追加するために使用できます。独自の拡張機能を作成し(ここで詳細をspareしみます)、イベントオブザーバーを構成します config.xml
:
<?xml version="1.0"?>
<config>
<modules>
<Emzee_Cms>
<version>0.0.1</version>
</Emzee_Cms>
</modules>
<global>
<events>
<cms_page_render>
<observers>
<emzee_cms_page_render>
<class>emzee_cms/observer</class>
<method>cms_page_render</method>
</emzee_cms_page_render>
</observers>
</cms_page_render>
</events>
<models>
<emzee_cms>
<class>Emzee_Cms_Model</class>
</emzee_cms>
</models>
</global>
</config>
イベントオブザーバーを追加してください:
<?php
class Emzee_Cms_Model_Observer
{
public function cms_page_render(Varien_Event_Observer $observer)
{
$action = $observer->getEvent()->getControllerAction();
$actionName = strtolower($action->getFullActionName());
$action->getLayout()->getUpdate()
->addHandle($actionName . '_after');
return $this;
}
}
最後に、新しいレイアウトXMLハンドルを追加します(例: local.xml
):
<?xml version="1.0"?>
<layout version="0.1.0">
<cms_index_index_after>
<reference name="root">
<action method="setTemplate"><template>page/1column.phtml</template></action>
</reference>
</cms_index_index_after>
</layout>
この方法も使用して追加できます cms_page_view_after
ページ固有のハンドルを処理または作成します cms_page_render
に合格します $page
オブザーバーに反対します。
「参照左」にブロックを追加できない理由
使用しているテンプレートには左列がありますか?この質問はばかげているように聞こえるかもしれませんが、たとえば、デフォルトの「右バー付きの2列」レイアウトは、「コンテンツ」と「正しい」領域のみを提供します。右の列にブロックを追加することができます cms_page
問題がないので、これが問題になる可能性があります。
一般に、参照にブロックを簡単に追加して、それらをエコーすることができます
- 選択したルートテンプレートは、参照しているブロックを使用します(参照
app/design/frontend/base/default/template/page/*.phtml
) と - どちらかを参照しているブロックはタイプです
core/text_list
, 、電話$this->getChildhtml()
議論なしで、またはすべての子供ブロックを反映するために何か他のことをします。
詳細がなければ、なぜあなたのブロックが左または右の列にエコーされないのかを伝えることはできません。
他のヒント
あなたの「使用を使用してブロックを追加できません <reference name="left
/>、CMSページには左という名前のブロックがあると確信していますか?たとえば、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
, など。これらの値は、同じ名前のレイアウトハンドルに対応しています。
#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
呼び出され、追加のハンドル名をスライドさせたり、既存のハンドル名を削除したりできます。