Вопрос

У меня было несколько сценариев, в которых я пытался использовать ручки 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, это она появляется иметь блок с именем влево.

is that a left column?

Однако, если вы посмотрите на страницу в бэкэнд, вы увидите, что он настроен на использование корневого шаблона

`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 Чтобы зацепить (Нажмите для полноразмерного изображения)

directed graph generated with Commerce Bug

Что касается установки шаблона, если вы посмотрите на источник для выпадения «макета»

<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);
    }  
    //...
}

Что еще более важно, хотя это заказ Ручки макета добавляются в

Handles Tab of Commerce Bug

Как вы можете видеть на скриншоте выше, 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 вызывается и позволил бы вам сдвинуть дополнительное имя дескриптора или удалить существующие имена ручки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top