Где я могу найти полный список событий Magento?

94

Я знаю, что у Magento есть система, похожая на крючок, которая называется events. У кого-нибудь есть полный список или скрипт, который можно использовать для определения того, какие события могут быть вызваны?

benmarks
источник
4
Я использую это как хорошую шпаргалку. Nicksays.co.uk/magento-events-cheat-sheet-1-7
Деррик Ньомо,
1
@DerrikNyomo - вы должны опубликовать это как ответ вместе с кратким изложением информации, которую он предоставляет. :-)
отметки
1
Шпаргалки для событий на самом деле больше хлопот, так как они дают вам ложное ощущение, что «событие, которое я хочу, не существует», и вы можете тратить часы на кодирование, пропустив событие, которое могло быть использовано (так как много создаются динамически) Я разместил ответ на этот вопрос: ссылка и мой ответ также относятся к этому вопросу. Он не дает вам полный «список», но он дает вам полный список событий для действия / загрузки страницы, к которым вы хотите подключиться.
ProxiBlue

Ответы:

102

Нет списка всех событий magento, потому что большинство событий имеют динамическое имя.

Если вы спросите меня, знание этих ключевых событий (и их последствий) является хорошей отправной точкой (помимо списка от Ника):

Каждый объект, расширенный из Mage_Core_Model_Abstract, отправляет множество событий вокруг загрузки, сохранения и удаления:

app/code/core/Mage/Core/Model/Abstract.php:255
Mage::dispatchEvent($this->_eventPrefix.'_load_before', $params);
// e.g. sales_order_load_before, checkout_cart_load_before

Например, чтобы добавить проверки, после того, как объект был загружен

app/code/core/Mage/Core/Model/Abstract.php:267
Mage::dispatchEvent($this->_eventPrefix.'_load_after', $this->_getEventData());
// e.g. cms_page_load_after

добавить дополнительные данные к объекту перед его сохранением

app/code/core/Mage/Core/Model/Abstract.php:391
Mage::dispatchEvent($this->_eventPrefix.'_save_before', $this->_getEventData());
// e.g. catalog_product_save_before

Сохранить другие модели после того, как «родитель» был сохранен

app/code/core/Mage/Core/Model/Abstract.php:466  
Mage::dispatchEvent($this->_eventPrefix.'_save_after', $this->_getEventData());
// e.g. catalogrule_rule_save_after

очистить, прежде чем модель будет удалена

app/code/core/Mage/Core/Model/Abstract.php:501
Mage::dispatchEvent($this->_eventPrefix.'_delete_before', $this->_getEventData());
// e.g. store_delete_before

очистить, прежде чем модель будет удалена - или, может быть, потом? Вы здесь еще в сделке!

app/code/core/Mage/Core/Model/Abstract.php:529
Mage::dispatchEvent($this->_eventPrefix.'_delete_after', $this->_getEventData());
// e.g. website_delete_after

Если вы хотите быть уверены, что объект был удален

app/code/core/Mage/Core/Model/Abstract.php:541
Mage::dispatchEvent($this->_eventPrefix.'_delete_commit_after', $this->_getEventData());
// e.g. customer_delete_commit_after

Коллекции, расширенные из Mage_Core_Model_Resource_Db_Collection_Abstract, также имеют два общих события:

Например: чтобы изменить SQL для загрузки коллекции:

app/code/core/Mage/Core/Model/Resource/Db/Collection/Abstract.php:588
Mage::dispatchEvent($this->_eventPrefix.'_load_before', array(
    $this->_eventObject => $this
));
// e.g. sales_order_status_history_collection_load_before

Например: добавить дополнительные данные к объектам:

app/code/core/Mage/Core/Model/Resource/Db/Collection/Abstract.php:637
Mage::dispatchEvent($this->_eventPrefix.'_load_after', array(
    $this->_eventObject => $this
));
// e.g. sales_order_shipment_collection_load_after
Фабиан Блехшмидт
источник
4
Очень хороший ответ; в надежде на то, что мы можем заправить в вики. Важность _eventPrefixсобытий модели, событий целевого запроса, иногда полезных событий общих блоков и важности ведения журнала для поиска событий
отметки
1
Отлично. Я хотел отметить, что в Magento 2 им действительно нужно убедиться, что все основные классы имеют определенный префикс события. Я на самом деле переписал классы просто для определения префикса события, чтобы я мог аккуратно подключиться к событиям сохранения / загрузки. Хм. На самом деле я думаю, что сам пойду проверю источник Magento 2.
Тим Рейнольдс
3
Подход, который я обычно использую, - это быстрое редактирование / сохранение / возврат к методу app/code/core/Mage/Core/Model/App.phpи mage::log($eventName,null,'events.txt',true);обратно dispatchEvent. Загрузите страницу, которую я пытаюсь наблюдать. Очевидно, не оставляйте это как есть и вернитесь, как только ваш var / logs / events.txt будет создан. Грязно, да. Быстро, да. :)
B00MER
2
хорошо, если вы хотите, чтобы ваш наблюдатель был на одной странице. Но будьте осторожны, есть события, которые должны быть отправлены, но могут и не быть. Существует заказ или платежное событие, которое не выбрасывается при оплате через PayPal ...
Фабиан Блехшмидт
Есть ли какое-либо событие, инициированное после создания отгрузки в magento @FabianBlechschmidt
Кингшук Деб,
48

Do the bloody grep 'Mage::dispatchEvent' app/ -rsnЭто предоставит вам список событий, относящихся к вашей установке, так как список событий может отличаться в зависимости от версии Magento, установленных настроек и расширений.

user487772
источник
2
Это лучший совет, он также будет включать в себя мероприятия сторонних модулей. Обычно, когда я хочу узнать, к каким событиям я могу подключиться для конкретной страницы, я регистрирую параметры app: dispatchEvent.
Петар Джамбазов
1
Grep также даст вам неверную информацию: например, он утверждает, что sales_order_place_afterэто произойдет, но кажется, что призыв к стрельбе закомментирован Checkout/Type/Onepage.php.
Кодзиро
Это плохой ответ, так как он подхватит только часть доступных событий, поскольку он полностью пропускает все динамически генерируемые события. @PetarDzhambazov дает хороший совет, чтобы войти в систему от диспетчера и затем загрузить страницы, которые вас интересуют. Лучший ответ на данный момент - это принятый ответ, данный FabianBlechschmidt
Dom
26

Я использую это как хорошую шпаргалку http://www.nicksays.co.uk/magento-events-cheat-sheet-1-7/ . В нем есть все события, которые можно вызвать в 1.7.

Деррик Ньомо
источник
4
Поскольку вы уже проделали хорошую работу по связыванию контента, лучше всего также предоставить его здесь на тот случай, если Ник скажет «винтик Magento» и удалит свою страницу :-)
benmarks
3
Я не фанат этого списка, потому что 1: он неполный, 2: есть еще 1231 блог о Magento со «всеми» событиями в Magento (+ некоторые вики-страницы на Magento).
FlorinelChis
@benmarks угадай, что произошло в то же время ...
toon81
9

Я знаю, что на этот вопрос ответили, я просто добавляю свой путь здесь:

  • Я готовлю страницу, которую хочу увидеть в своем браузере
  • Я открываю приложение / Mage.php
  • для public static function dispatchEvent(ln: ~ 446) в начале я добавляю //Mage::log($name, null, 'events.log', true);
  • раскомментируйте эту строку,
  • обновить страницу, на которой я нахожусь
  • еще раз прокомментируйте эту строку

Затем вы открываете var / log / events.log (~ 40kb) и видите множество событий только на этой странице! :)

Кресимир Пендик
источник
2
Это пропустит некоторые события, которые запускаются до слияния конфигурации магазина.
отметки
6

Ответ уже принят, но я все равно опубликую свой ответ на будущее:

Если вы хотите увидеть список событий, которые есть у Magento, у вас есть 3 варианта:

1) Google для него, есть много людей, которые составили список событий Magento

2) Создайте модуль, который подключается к controller_action_predispatchсобытию, которое является событием, которое вызывается до вызова любого другого события. Внутри этого модуля вы можете регистрировать некоторые события, которые отправляются:

Добавьте следующее в config.xml

<events>
    <controller_action_postdispatch>
        <observers>
            <controller_action_after>
                <class>yourmodule/observer</class>
                <method>hookToControllerActionPostDispatch</method>
            </controller_action_after>
        </observers>
    </controller_action_postdispatch>
</events>

А внутри вашего модуля / модели / наблюдателя:

public function hookToControllerActionPostDispatch($observer) {
    Mage::log($observer->getEvent()->getControllerAction()->getFullActionName());
}

Выше будет регистрировать каждое событие, которое отправляется ...

3) Если у вас есть доступ по SSH, вы можете запустить следующую команду, чтобы получить обзор всех событий (и их файлов, куда они отправляются):

cd /path/to/<magento-root>
grep -nris 'dispatchEvent' app/code/
Kenny
источник
1
Извините - хотя № 3 и хорошо, информация в 1 и 2 из вашего ответа действительно неверна. 1) Есть несколько событий, прежде controller_action_predispatchвсего controller_front_init_before. 2) Этот подход просто не будет регистрировать каждое событие, которое отправлено, это опечатка или неполный раздел?
отметки
Отредактировал его для «большинства»;)
Кенни
2
Извините, все еще не очень точный :-( - отправлено так много событий (предварительная отправка, макет, рендеринг, а также загрузка моделей и коллекций) ...
отметки
Обновлен ответ на «некоторые события».
Кенни
4

Я использую панель инструментов Magento Developer, которая имеет хорошую функцию отображения событий, которые можно наблюдать на загруженной странице.

Дамир Митрович
источник
4

Я сделал grep для основного модуля Mage Magento и составил список,

Исчерпывающий список событий Magento

PS Как указывалось, могут содержать события, которые находятся внутри устаревших функций Magento, поэтому проверяйте ссылку на файл и строку перед реализацией.

Открыт для предложений!

huzefam
источник
1
Вы все еще пропускаете все подклассовые магические события. Не может быть оплачен.
отметки
Волшебные события как в? Те, которые являются динамическими? Не могли бы вы разработать плз @benmarks
huzefam
@benmarks я согласен, я не думаю, что нам нужно специально подготовить список для этого
huzefam
Отсюда мой комментарий, который был предложен на основе использования «исчерпывающего»
отметки
4
grep "::dispatchEvent" -R * | sort -u

grep "eventPrefix" -R * | sort -u

Предыдущая перечисленная команда grep выдает дубликаты (много), и она не охватывает список префиксов событий, которые потребуются для понимания динамически генерируемых имен событий. Эти команды отображают оба списка только с уникальными значениями. Вы можете добавить флаг -n, как и другой ответ grep, и получить номер строки, я полагаю. Но вопрос не спрашивал, где в коде они все были. ~ _ ~

mprototype
источник
у нас есть аналогичный ответ здесь. См @TimBezhashvyly ответ «s
Раджив K Tomy
вроде .... предыдущая команда grep выдает дубликаты (много), и она не охватывает список префиксов событий, которые потребуются для понимания динамически генерируемых имен событий. Эти команды отображают оба списка только с уникальными значениями. Вы можете добавить флаг -n, как и другой ответ grep, и получить номер строки, я полагаю. Но вопрос не спрашивал, где в коде они все были.
прототип
не могли бы вы добавить это описание к вашему ответу. Тогда ваш ответ станет супер крутым ... (тогда я готов сделать голосование) :-)
Rajeev K Tomy
Это помогает?
прототип
Да. +1 за это. :)
Rajeev K Tomy
3

здесь также есть шпаргалка http://mikebywaters.wordpress.com/2012/07/23/magento-event-observer-list/

Рейчел Галлен
источник
1
Одинокая ссылка считается плохим ответом (см. Часто задаваемые вопросы ), поскольку она сама по себе бессмысленна, и целевой ресурс не гарантированно будет жив в будущем . Было бы предпочтительно включить основные части ответа здесь и предоставить ссылку для справки.
JOK