2012-02-01 2 views
0

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

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

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

Я читал в другом месте, что I should avoid conditional layout 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); 
} 

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

+0

Это поможет понять цель и увидеть примеры желаемых результатов, если мы предложим «лучшие подходы» :) В противном случае любой совет может быть немного общим, да? Какова же цель? Вы действительно хотите, чтобы страница выглядела так, как будто она принадлежит к другой теме? Или вы пытаетесь получить какой-то индивидуальный макет, созданный для определенного продукта/категории/продажи? – Kato

+0

@ Kato, отредактированный, добавив пример шаблона * bare * и для чего он будет использоваться. – kojiro

+0

Рассматривали ли вы только выбор страницы по HTTP и извлечение полезного раздела? Если это всего лишь простой HTML-код, который вам нужен, это должен быть тонкий/простой ответ и сэкономить массу проблем при создании дополнительных шаблонов или изменении ядра. – Kato

ответ

2

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

Для этого в Magento без включает траекторию взлома Mage_Core_Controller_Varien_Action, наблюдать controller_action_layout_render_before_$this->getFullActionName() контекстного события, которые обжигали в базовом классе действий контроллера (исй Mage_Core_Controller_Varien_Action::renderLayout() метода).

Сначала сконфигурируйте группу классов модели и внешний наблюдатель событий. Вам нужно будет определить полное имя действия любого маршрута, который нуждается в этой логике. См. 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'); 
    } 
} 

HTH.

Смежные вопросы