Условная настройка шаблона в Magento - PullRequest
0 голосов
/ 01 февраля 2012

Я хотел бы сделать часть страницы доступной для получения через AJAX. Я имею в виду использовать параметр URL, bare, который будет указывать Magento представить страницу с другим шаблоном, примененным к блоку root . Шаблон bare выглядит следующим образом:

<?php echo $this->getChildHtml('content'); ?>

Вот и все! Идея состоит в том, что метод JavaScript может захватить только content другой страницы и вставить ее в DOM, где это необходимо. (Я не хочу, чтобы это было возможно только на любой странице - только на страницах, которые были помечены для этого в макете XML.)

Я читал в другом месте, что Мне следует избегать условного макета xml . Единственный другой подход, который я могу придумать, - переопределить сам блок Page / Html, создав модифицированный метод setTemplate, как показано ниже. Инстинктивно меня беспокоит переопределение такой основной части Magento.

public function setTemplate($template, $bareTemplate='')
{
    $bareMode = Mage::app()->getRequest()->getParam('bare');
    $targetTemplate = (!empty($bareTemplate) && $bareMode === '1') ? $bareTemplate : $template;
    return parent::setTemplate($targetTemplate);
}

О каких лучших подходах я не подумал?

1 Ответ

2 голосов
/ 01 февраля 2012

Ключом к получению того, что вы хотите, является удаление root в качестве блока вывода, замена его на content . Выходные блоки - это просто точки входа для renderLayout ();

Чтобы сделать это в Magento без include-path-hacking Mage_Core_Controller_Varien_Action, наблюдайте controller_action_layout_render_before_$this->getFullActionName() события с областью действия, которые запускаются в базовом классе контроллера действий (ref Mage_Core_Controller_Varien_Action::renderLayout() method).

Сначала настройте группу классов вашей модели и наблюдателя событий внешнего интерфейса. Вам нужно будет определить полное имя действия любого маршрута, для которого нужна эта логика. Смотри Mage_Core_Controller_Varien_Action::renderLayout(). Пример конфигурации ниже.

<?xml version="1.0"?>
<config>
    <global>
        <models>
            <your_classgroup>
                <class>Your_Classgroup_Model</class>
            </your_classgroup>
        </models>
    </global>
    <frontend>
        <events>
            <controller_action_layout_render_before_FULL_ACTION_NAME...>
                <observers>
                    <your_observer_config>
                        <type>model</type>
                        <class>your_classgroup/observer</class>
                        <method>makeContentBlockTheOutputBlock</method>
                    </your_observer_config>
                </observers>
            </controller_action_layout_render_before_FULL_ACTION_NAME...>
        </events>
    </frontend>
</config>

Логика наблюдателя событий проста. Сделайте это:

public function makeContentBlockTheOutputBlock($observer)
{
   //Edit: action not passed in to this event; passed in generic generate_blocks event
   if( Mage::app()->getRequest()->getParam('bare') )
   {
        Mage::app()->getLayout()->removeOutputBlock('root')->addOutputBlock('content');
   }
}

НТН.

...