Событие 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;
    }
Другие вопросы по тегам