Що стосується того, що ви "не можете додати блок за допомогою <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
і т.д. Ці значення 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
викликом і дозволить вам вставити додаткове ім’я ручки або видалити існуючі імена ручки.