Относительно того, что вы «не можете добавить блок с помощью <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
и т. Д. Эти значения основываются на дескрипторах макета с тем же именем.
#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
вашем коде, он запустится, но page_two_columns_right
после него будет запущен код обновления макета XML .
Я всегда подозревал, что это сделано для того, чтобы шаблон, заданный в пользовательском интерфейсе, всегда был правильным. В предыдущей версии Magento <action method="setIsHandle"><applied>1</applied></action>
вызов метода, по-видимому, существовал по тем же причинам.
Таким образом, нет никакого способа сделать то, что вы хотите, используя чистый XML-код макета. Если вам удобно создавать собственные модули и код наблюдателя, посмотрите на cms_page_render
событие. Это срабатывает непосредственно перед loadLayoutUpdates
вызовом и позволит вам вставить дополнительное имя дескриптора или удалить существующие имена дескрипторов.