Почему смена корневого шаблона не работает
И то и другое
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 дважды проверяет корневой шаблон (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
которое вы можете использовать для добавления собственного дескриптора макета XML на страницах CMS. Создайте свое собственное расширение (я сэкономлю некоторые детали здесь) и настройте наблюдатель событий в вашем 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()
без аргументов или делает что-то еще, чтобы повторить все дочерние блоки.
Без дальнейших подробностей я не могу сказать вам, почему ваши блоки не отображаются в левой или правой колонке.
$cmsPageId = '_' . str_replace('-', '_', $observer->getEvent()->getPage()->getIdentifier());
Если кто-то изменил URL-адрес страницы cms, дескриптор не будет работать. В идеале поле для «ключа страницы» должно существовать на странице CMS в системе администратора, тогда URL-адрес страницы, имя и т. Д. Можно изменить, а ключ можно оставить прежним.Относительно того, что вы «не можете добавить блок с помощью
<reference name="left
/>, вы уверены, что на вашей странице CMS есть блок с именем left? Например, если вы рассматриваете домашнюю страницу по умолчанию, которая поставляется с образцами данных Magento, она, кажется, имеет блок с именем осталось.Однако, если вы посмотрите на страницу в серверной части, вы увидите, что она настроена на использование корневого шаблона.
и затем в его области содержимого, левый столбец добавляется с использованием разметки HTML (переключение WYSIWYG в исходное представление)
Этот ориентированный график дает понять, что в названии нет блока,
left
к которому можно подключиться ( щелкните для полноразмерного изображения )Что касается настройки шаблона, если вы посмотрите на источник для «Макет» выпадающего
Когда вы устанавливаете это поле, вы можете увидеть, что фактическое значение сохраняется как-то так
one_column
,two_columns_left
и т. Д. Эти значения основываются на дескрипторах макета с тем же именем.Когда Magento отображает страницу CMS, она ссылается на сохраненные значения и добавляет соответствующий дескриптор макета на страницу. Хотя это касается вопроса, этот дескриптор добавлен здесь
Более важно, хотя это порядок, в котором маркеры макета добавляются в
Как вы можете видеть на скриншоте выше, то
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
вызовом и позволит вам вставить дополнительное имя дескриптора или удалить существующие имена дескрипторов.источник
default
дескрипторе, то макет, заданный в админке, все равно победит (т.е.page_two_columns_right
все равно будет работать потом). Кроме того, терминология Re: вы не переопределяете дескрипторы, ваши дескрипторы всегда сосуществуют с остальными - их порядок влияет на конечный результат.