Добавление блока в макет динамически в наблюдателе событий

8

Я хочу знать, как использовать layout.xml с наблюдателем событий.

Я хочу показать сообщение в нижнем колонтитуле, когда платеж выполнен успешно.

Я знаю, что должен использовать событие checkout_onepage_controller_success_action

Как использовать controller или layout.xml с наблюдателем событий?

Рахул Чаурасия
источник

Ответы:

13

Событие checkout_onepage_controller_success_actionзапускается непосредственно перед рендерингом макета, поэтому вы все равно можете им манипулировать.

Наблюдатель получает идентификатор заказа только в качестве параметра, поэтому вы должны получить макет через модель приложения:

$layout = Mage::app()->getLayout();

Теперь вы можете вносить изменения программно, например:

$messageBlock = $layout->createBlock('core/template', 'payment_message_block');
$messageBlock->setTemplate('payment_message.phtml');
$layout->getBlock('footer')->append($messageBlock);

Если вы используете controller_action_layout_load_beforeсобытие, вы также можете загрузить собственный дескриптор макета, например, на странице успеха:

if ($observer->getAction()->getFullActionName() === 'checkout_onepage_success') {
    $layout = $observer->getLayout();
    $layout->getUpdate()->addHandle('custom_layout_handle');
}

который вы можете определить в XML:

<layout>
  <custom_layout_handle>
     <reference name="footer">
       <block type="core/template" name="payment_message_block" template="payment_message.phtml" />
     </reference>
  </custom_layout_handle>
</layout>

Обновление: блок нижнего колонтитула кэшируется, поэтому мы должны убедиться, что другая версия извлекается из кэша, если сообщение присутствует. Например:

$footer = $layout->getBlock('footer');
$footer->setCacheKey(sha1($footer->getCacheKey() . '-payment-message');

Как передать сформированные данные в файл phtml? который я показываю

Ссылка на ваш блок по имени и использованию setData(). Например:

$block = $layout->getBlock('payment_message_block')->setData('messsage', 'Hello');

И в шаблоне:

echo $this->getData('message');
Фабиан Шменглер
источник
1
Я не уверен, что это работает для блока нижнего колонтитула. Это будет работать практически для любого другого блока, но когда кеш включен, нижний колонтитул кэшируется и может не отображать сообщение.
Мариус
Хороший вопрос @Marius, если это возможно, я бы попытался использовать то, before_body_endчто не кэшируется
Фабиан Шменглер
Да, это должно работать.
Мариус
Если это должно быть в footerцелях дизайна, я добавил решение, которое изменяет ключ кеша.
Фабиан Шменглер
Вот почему я тоже растерялся, потому что в макете ничего не упоминается, относящегося к наблюдателю. который я нашел прежде чем задать вопрос здесь
Rahul Chaurasia