¿Dónde puedo encontrar una lista completa de eventos de Magento?

94

Sé que Magento tiene un sistema similar a un gancho llamado eventos. ¿Alguien tiene una lista completa o un script que pueda usarse para determinar a qué eventos se puede llamar?

puntos de referencia
fuente
44
Lo uso como una buena hoja de trucos nicksays.co.uk/magento-events-cheat-sheet-1-7
Derrik Nyomo
1
@DerrikNyomo: debe publicar eso como respuesta junto con un resumen de la información que proporciona. :-)
puntos de referencia
1
Las hojas de trucos para eventos son, de hecho, una molestia, ya que le dan una falsa sensación de que "el evento que quiero no existe" y puede perder horas de codificación, ya que se perdió un evento que podría haber sido utilizado (ya que mucho se crean dinámicamente) Publiqué una respuesta a esta pregunta: enlace y mi respuesta también se refiere a esta pregunta. No le da una 'lista' completa, pero le da una lista completa de eventos para la acción / carga de la página a la que está interesado en conectarse.
ProxiBlue

Respuestas:

102

No hay una lista de todos los eventos de magento, porque la mayoría de los eventos se nombran dinámicamente.

Si me preguntas, conocer estos eventos clave (y las consecuencias) es un buen punto de partida (además de la lista de Nick):

Cada objeto extendido desde Mage_Core_Model_Abstract distribuye muchos eventos relacionados con la carga, el guardado y la eliminación:

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

Por ejemplo, para agregar cheques, después de cargar el objeto

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

para agregar datos adicionales al objeto antes de guardarlo

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

Para guardar otros modelos después de que se guardó el "padre"

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

limpiar antes de eliminar el modelo

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

limpiar, antes de que se elimine el modelo, ¿o tal vez después? ¡Todavía estás aquí en la transacción!

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

Si quiere estar seguro de que la entidad fue eliminada

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

Las colecciones extendidas desde Mage_Core_Model_Resource_Db_Collection_Abstract también tienen dos eventos genéricos:

Por ejemplo: para cambiar el SQL para cargar la colección:

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

Por ejemplo: para agregar datos adicionales a los objetos:

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
Fabian Blechschmidt
fuente
44
Muy buena respuesta; esperando algo que podamos meter en la wiki. La importancia de los _eventPrefixeventos para el modelo, los eventos de solicitud específicos, los eventos de bloque genéricos ocasionalmente útiles y la importancia de iniciar sesión para encontrar eventos
puntos de referencia
1
Excelente. Quería señalar que en Magento 2 realmente necesitan asegurarse de que todas las clases principales tengan un prefijo de evento definido. De hecho, he reescrito las clases solo para definir el prefijo del evento para poder conectarme limpiamente a los eventos de guardar / cargar. Hmm De hecho, creo que iré a revisar la fuente de Magento 2 yo mismo.
Tim Reynolds el
3
El enfoque es normalmente tomar, una edición rápida / guardar / a revertir app/code/core/Mage/Core/Model/App.phpy mage::log($eventName,null,'events.txt',true);al dispatchEventmétodo. Cargue la página que estoy tratando de observar. Obviamente, no deje esto como está y revierta una vez que se haya creado su var / logs / events.txt. Sucio sí. Rápido si. :)
B00MER
2
bueno, si quieres que tu observador esté en una página. Pero tenga cuidado, hay eventos que deberían enviarse, pero podrían no serlo. Hay un pedido o evento de pago que no se lanza, cuando se paga con paypal ...
Fabian Blechschmidt
¿Hay algún evento que se dispare después de la creación del envío en magento @FabianBlechschmidt
Kingshuk Deb
48

Haga lo sangriento grep 'Mage::dispatchEvent' app/ -rsnEsto le proporcionará una lista de eventos específicos para su instalación, ya que la lista de eventos puede variar según la versión de Magento, las personalizaciones y las extensiones instaladas.

usuario487772
fuente
2
Ese es el mejor consejo, también incluirá eventos de módulos de terceros. Por lo general, cuando quiero saber a qué eventos puedo conectarme para una página en particular, registro la aplicación: dispatchEvent parámetros.
Petar Dzhambazov
1
El grep también le dará mala información: por ejemplo, afirma que sales_order_place_aftersucederá, pero parece que la llamada para disparar está comentada Checkout/Type/Onepage.php.
kojiro
Esta es una respuesta pobre, ya que solo recogerá una fracción de los eventos disponibles, ya que pierde por completo todos los eventos generados dinámicamente. @PetarDzhambazov da buenos consejos para iniciar sesión desde el despachador y luego cargar las páginas que le interesan. La mejor respuesta es la respuesta aceptada dada por FabianBlechschmidt
Dom
26

Lo uso como una buena hoja de trucos http://www.nicksays.co.uk/magento-events-cheat-sheet-1-7/ . Tiene todos los eventos que se pueden llamar en 1.7.

Derrik Nyomo
fuente
44
Como ya ha hecho un buen trabajo al vincular el contenido, lo mejor es proporcionar también el contenido aquí en caso de que Nick diga "atornille Magento" y elimine su página :-)
puntos de referencia
3
No soy fanático de esta lista, porque 1: está incompleto, 2: hay otros 1231 blogs sobre Magento con "todos" los eventos en Magento (+ algunas páginas wiki en Magento).
FlorinelChis
@benmarks adivina lo que sucedió mientras tanto ...
toon81
9

Sé que esta pregunta ha sido respondida, solo agrego mi camino aquí:

  • Preparo la página que quiero observar en mi navegador.
  • Abro la aplicación / Mage.php
  • para public static function dispatchEvent(ln: ~ 446) al principio agrego //Mage::log($name, null, 'events.log', true);
  • descomentar esa línea,
  • actualizar la página en la que estoy
  • comentar de nuevo esa línea

¡Luego abre var / log / events.log (~ 40kb) y ve un montón de eventos solo en esa página! :)

Kresimir Pendic
fuente
2
Esto perderá algunos eventos que se activan antes de fusionar la configuración de la tienda.
puntos de referencia del
6

La respuesta ya ha sido aceptada pero publicaré mi respuesta de todos modos para el futuro:

Si desea ver la lista de eventos que Magento tiene, tiene 3 opciones:

1) Google para ello, hay muchas personas que han compilado una lista de eventos de Magento

2) Cree un módulo que se enganche en el controller_action_predispatchevento que es el evento que se llama antes de que se llame cualquier otro evento. Dentro de este módulo puede registrar algunos eventos que se envían:

Agregue lo siguiente en 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>

Y dentro de yourmodule / Model / Observer:

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

Lo anterior registraría cada evento que se envía ...

3) Si tiene acceso SSH, puede ejecutar el siguiente comando para obtener una descripción general de todos los eventos (y sus archivos donde se envían):

cd /path/to/<magento-root>
grep -nris 'dispatchEvent' app/code/
Kenny
fuente
1
Lo sentimos, aunque el número 3 es bueno, la información en 1 y 2 de su respuesta realmente no es correcta. 1) Hay algunos eventos disparados antes controller_action_predispatch, en particular controller_front_init_before. 2) Este enfoque simplemente no registrará todos los eventos que se envían, ¿es un error tipográfico o una sección incompleta?
puntos de referencia
Editado a "la mayoría";)
Kenny
2
Lo sentimos, aún no es muy preciso :-( - hay muchos más eventos enviados (predispatch, diseño, renderizado, así como cargas de modelos y colecciones) ...
puntos de referencia
Se actualizó la respuesta a "algunos eventos".
Kenny
4

Estoy usando Magento Developer Toolbar que tiene una buena característica de mostrar eventos que se pueden observar en la página cargada.

Damir Mitrovic
fuente
4

Hice un grep en el módulo principal de Mage de Magento, y cumplí una lista,

Lista exhaustiva de eventos de Magento

PD Como se señaló, puede contener eventos que están dentro de las funciones obsoletas de Magento, por lo tanto, verifique el archivo y la referencia de línea antes de la implementación.

Abierto para sugerencias!

huzefam
fuente
1
Todavía te faltan todos los eventos mágicos subclasificados. No se puede desear.
Benmarks
¿Eventos mágicos como en? ¿Los que son dinámicos? ¿Podría elaborar por favor @benmarks
huzefam
@benmarks estoy de acuerdo, no creo que necesitemos preparar una lista explícitamente para esto
huzefam
De ahí mi comentario, que se ofreció en base al uso de "exhaustivo"
Benmarks
4
grep "::dispatchEvent" -R * | sort -u

grep "eventPrefix" -R * | sort -u

El comando grep enumerado anteriormente generaría duplicados (mucho) y no cubre la lista de prefijos de eventos que se requerirían para comprender los nombres de eventos generados dinámicamente. Estos comandos representan ambas listas con solo valores únicos. Podría agregar la bandera -n como la otra respuesta grep y obtener el número de línea, supongo. Pero la pregunta no preguntaba en qué parte del código estaban todos. ~ _ ~

mprototype
fuente
Tenemos una respuesta similar aquí. Consulte la respuesta de @TimBezhashvyly
Rajeev K Tomy
más o menos .... el comando grep enumerado anteriormente generaría duplicados (mucho) y no cubre la lista de prefijos de eventos que serían necesarios para comprender los nombres de eventos generados dinámicamente. Estos comandos representan ambas listas con solo valores únicos. Podría agregar la bandera -n como la otra respuesta grep y obtener el número de línea, supongo. Pero la pregunta no preguntaba en qué parte del código estaban todos.
mprototype
¿podría agregar esta descripción a su respuesta? Entonces su respuesta se vuelve súper genial ... (estoy listo para hacer un voto a favor entonces) :-)
Rajeev K Tomy
¿Eso ayuda?
mprototype
Si. +1 por eso. :)
Rajeev K Tomy