CMS XML Ручки для оновлення макета


13

У мене було кілька сценаріїв, коли я намагався використовувати ручки cms для оновлення макета сторінки cms. Наприклад, я намагався використовувати ручку cms_index_index, що посилається на корінь і встановлює шаблон сторінки. Це не вдалося, і мені довелося оновити макет через систему адміністрування безпосередньо в налаштуваннях відображення сторінки домашньої сторінки cms.

Я також намагався додати блок до посилання зліва за допомогою ручки cms_page. Знову це не вдалося, і мені довелося реалізувати оновлення макета через адмін-систему.

Я читав, що ви не можете призначити кореневий шаблон для сторінок cms. Це правильно, і хто-небудь може пояснити, чому?

Мене також цікавило, чи існує спосіб увімкнути cms-ручки для використання стандартних посилань, таких як лівий, правий, root тощо? Мені здається, що я можу просто посилатися на такі речі, як голова та вміст.

Відповіді:


20

Чому зміна кореневого шаблону не працює

І те й інше

Mage_Cms_IndexController::indexAction()

і

Mage_Cms_IndexController::viewAction()

які відповідають за відображення домашньої сторінки за замовчуванням та сторінки CMS відповідно, викликають помічника:

Mage::helper('cms/page')->renderPage($this, $pageId)

Якщо ви заскочите в помічник (розташований у додатку / код / ​​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()без аргументів або щось інше, щоб повторити всі дочірні блоки.

Без додаткових деталей я не можу вам сказати, чому ваші блоки не лунають у лівій чи правій колонці.


Привіт Маттіас. Дякуємо за пропозицію додати спостерігача за подією, я погляну з одним із наших розробників і побачу, чи це вийде. Це може бути відповіддю! @Alan також зробив аналогічний момент щодо встановлення правильного шаблону за замовчуванням для сторінок cms та про те, що ручки перекриті. Дякую також за інформацію, я думаю, я зараз це зрозумів.
Марк Вестон

Привіт. Випробував це, і це працює. Також перевірив його на певних сторінках, і він працює, але це не найприємніше рішення, тому що мені потрібен ідентифікатор для сторінок, які не можна змінити. Як тест я використовував ідентифікатор сторінки $cmsPageId = '_' . str_replace('-', '_', $observer->getEvent()->getPage()->getIdentifier()); Якщо хтось змінив URL-адресу сторінки cms, функція обробляти не буде. В ідеалі на сторінці CMS в адміністративній системі буде поле для "ключа сторінки", тоді URL-адресу сторінки, ім'я тощо можна було б змінити, а ключ можна зберегти тим самим.
Марк Вестон

14

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

спрямований графік, сформований із помилкою Commerce

Щодо встановлення шаблону, якщо ви подивитесь на джерело для спадного меню "Макет"

<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викликом і дозволить вам вставити додаткове ім’я ручки або видалити існуючі імена ручки.


Дякую, Алан, ваші коментарі щодо додавання блоків на сторінку cms мають повний сенс. Зазвичай я встановлюю шаблони для різних сторінок, використовуючи різні ручки xml, які надає Magento. Моє трохи краще розуміння сторінок cms дозволило зрозуміти, чому у мене виникли проблеми із використанням посилань на сторінки cms. Мені потрібно переконатися, що ручка за замовчуванням у моїй сторінці.xml має правильний макет для сторінок cms. Здається, я заскрив цю ручку, тому що я зазвичай переставляю її в іншому місці. Це правильно? Чи можу я запитати, як ви створили графік та який інструмент використовуєте для перегляду ручок для конкретного запиту?
Марк Вестон

2
@MarkWeston Діаграми та обробка інтерфейсу користувача з Commerce Bug, комерційного інструменту налагодження, який я створив і продаю. (Див alanstorm.com/find_magento_block_name подробиці) Я не впевнений , що зрозумів ваше запитання про ручки, але якщо ви встановлюєте шаблон в defaultручці, то безліч розкладки в адмінки буде ще виграти (тобто page_two_columns_rightвсе ще буде працювати пізніше). Крім того, Re: термінологія - ви не перекриваєте ручки, ваші ручки завжди співіснують з іншими - це лише той порядок, який вони виконують, приносить кінцевий результат.
Алан Шторм

Ура Алан. Я бачу, що ви маєте на увазі закликати використовувати ручку для встановлення шаблону, який не є перекриттям - хороший момент. Дякуємо за інформацію про Commerce Bug.
Марк Вестон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.