Событие Magento на любой странице
Мне интересно, есть ли событие, которое запускается один раз при каждой загрузке страницы перед рендерингом в HTML в magento?
Это может быть полезно, если вы хотите создать некоторую бизнес-логику для полустатических атрибутов, которые не зависят от пользовательских сессий.
Например, я буду использовать это для доставки канонического тега в заголовок magento.
4 ответа
Существует несколько событий, связанных с запросами, которые отправляются для большинства запросов на создание страниц / содержимого. Ниже приведен частичный список в порядке обработки некоторых полезных, и я ожидаю, что другие могут прокомментировать этот пост с некоторыми другими. Многие из них не подходят для ваших нужд (я выделил жирным шрифтом ниже, где вы должны начать обдумывать). Есть также несколько событий, связанных с созданием экземпляров блоков, которые, хотя и могут наблюдаться для вашей цели, являются общими для каждого блока и действительно не подходят.
Первое практическое одиночное мероприятие
controller_front_init_before
, Это событие отправляется при инициализации Front Controller в ответ на все отправленные запросы. Поскольку он отправляется до вызова контроллеров действий, только глобальные наблюдатели смогут наблюдать за этим событием.Предполагая, что запрос направляется от фронтального контроллера через маршрутизаторы к контроллеру действий, есть некоторые события, которые можно наблюдать перед отображением в
preDispatch()
- обратите внимание на общийcontroller_action_predispatch
дескриптор события, который можно использовать для всех событий по сравнению с двумя дескрипторами динамического события:Mage::dispatchEvent('controller_action_predispatch', array('controller_action' => $this)); Mage::dispatchEvent('controller_action_predispatch_' . $this->getRequest()->getRouteName(), array('controller_action' => $this)); Mage::dispatchEvent('controller_action_predispatch_' . $this->getFullActionName(), array('controller_action' => $this));
То, как выполняется ответ, может повлиять на доступные события; основные изменения будут зависеть от того, используются ли обновления макета для визуализации ответа (и как). Например,
core_layout_update_updates_get_after
может использоваться для добавления файла обновления макета в список сконфигурированных файлов обновления макета модуля (редкий, но потенциально полезный случай). Действия контроллера тесно связаны с моделированием макета, поэтому есть несколько событий, которые могут сработать:controller_action_layout_load_before
controller_action_layout_generate_xml_before
controller_action_layout_generate_blocks_before
а такжеcontroller_action_layout_generate_blocks_after
- последний из которых будет первым применимым к вашим потребностям
При условии, что renderLayout()
используется во всех действиях, которые вас волнуют, есть два события (одно общее и одно для конкретного маршрута), которые оно отправляет:
Mage::dispatchEvent('controller_action_layout_render_before');
Mage::dispatchEvent('controller_action_layout_render_before_'.$this->getFullActionName());
После того, как все маршрутизация, диспетчеризация, конфигурирование представления, создание экземпляра блока и рендеринг выполнены, существует одно событие последнего сброса, которое отправляется Front Controller перед отправкой ответа: controller_front_send_response_before
, Это мероприятие не подходит для ваших нужд, но это хороший выходной для controller_front_init_before
событие, с которого начался этот ответ.
http://www.nicksays.co.uk/magento-events-cheat-sheet-1-7/ это поможет.
app/code/core/Mage/Core/Controller/Varien/Action.php
это событие
controller_action_layout_load_before
уволен
app/code/core/Mage/Core/Block/Abstract.php
событие
core_block_abstract_to_html_before
выше два события могут быть полезны.
Мы можем использовать событие controller_front_init_routers, используя наблюдателя. В этом методе наблюдателя вы можете получить объект запроса следующим образом.
$request = $observer->getEvent()->getData('front')->getRequest();
Я думаю, что вы ищете это событие controller_action_layout_render_before_RouteName_ControllerName_ActionName
Вы также можете регистрировать все события, которые происходят на любой странице загрузки с Mage
класс в функции ниже
public static function dispatchEvent($name, array $data = array())
{
Mage::log($name);
Varien_Profiler::start('DISPATCH EVENT:'.$name);
$result = self::app()->dispatchEvent($name, $data);
Varien_Profiler::stop('DISPATCH EVENT:'.$name);
return $result;
}