CMS XML обрабатывает обновления макета
-
16-10-2019 - |
Вопрос
У меня было несколько сценариев, в которых я пытался использовать ручки CMS, чтобы обновить макет страницы CMS. Например, я пытался использовать CMS_INDEX_INDEX, направляющий root и настройка шаблона страницы. Это не удалось, и мне пришлось сделать это обновление макета через систему администратора непосредственно в настройках дисплея страницы 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 проверяет два раза на корневой шаблон (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()
Без аргументов или что -то еще, чтобы повторить все детские блоки.
Без дополнительной информации я не могу сказать вам, почему ваши блоки не эхо в левом или правом столбце.
Другие советы
Относительно вашего «не удается добавить блок, используя <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
Ваш код будет работать, но затем Mayout Update XML -код в page_two_columns_right
Буду бежать за этим.
Я всегда подозревал, что это за дизайном, чтобы убедиться, что шаблон, установленный в пользовательском интерфейсе, всегда правильный. В предыдущей версии Magento <action method="setIsHandle"><applied>1</applied></action>
Метод вызов, кажется, существовал по тем же причинам.
Таким образом, нет никакого способа сделать то, что вы хотите, используя Cure Mayout XML -код. Если вам удобно создавать пользовательские модули и код наблюдателя, затем посмотрите на cms_page_render
мероприятие. Это стреляет прямо перед loadLayoutUpdates
вызывается и позволил бы вам сдвинуть дополнительное имя дескриптора или удалить существующие имена ручки.