Dove posso trovare un elenco completo degli eventi di Magento?


94

So che Magento ha un sistema ad uncino chiamato eventi. Qualcuno ha un elenco completo o uno script che può essere utilizzato per determinare quali eventi possono essere chiamati?



1
@DerrikNyomo - dovresti postarlo come risposta insieme a un riepilogo delle informazioni che fornisce. :-)
benmarks

1
I cheat sheet per gli eventi sono in realtà più una seccatura, dato che ti danno un falso senso che "l'evento che desidero non esiste" e potresti perdere ore di programmazione, avendo perso un evento che avrebbe potuto essere usato (da molto sono creati dinamicamente) Ho pubblicato una risposta a questa domanda: link e anche la mia risposta riguarda questa domanda. Non ti fornisce un "elenco" completo, ma ti fornisce un elenco completo di eventi per l'azione / il caricamento della pagina a cui sei interessato a collegarti.
ProxiBlue,

Risposte:


102

Non esiste un elenco di tutti gli eventi di Magento, poiché la maggior parte degli eventi ha un nome dinamico.

Se me lo chiedi, conoscere questi eventi chiave (e le conseguenze) è un buon punto di partenza (accanto all'elenco di nick):

Ogni oggetto esteso da Mage_Core_Model_Abstract invia molti eventi riguardanti il ​​caricamento, il salvataggio e l'eliminazione:

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

Ad esempio per aggiungere controlli, dopo che l'oggetto è stato caricato

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

per aggiungere ulteriori dati all'oggetto prima che venga salvato

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

Per salvare altri modelli dopo aver salvato il "genitore"

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

ripulire, prima che il modello venga eliminato

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

ripulire, prima che il modello venga eliminato - o forse dopo? Sei ancora qui nella transazione!

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

Se vuoi essere sicuro che l'entità sia stata eliminata

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

Le raccolte estese da Mage_Core_Model_Resource_Db_Collection_Abstract hanno anche due eventi generici:

Ad esempio: per modificare l'SQL per caricare la raccolta:

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

Ad esempio: per aggiungere ulteriori dati agli oggetti:

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
Molto una buona risposta; sperando in qualcosa che possiamo infilare nella wiki. L'importanza di _eventPrefixper gli eventi del modello, gli eventi di richiesta mirati, gli eventi di blocco generici occasionalmente utili e l'importanza della registrazione per trovare gli eventi
benmarks

1
Eccellente. Volevo notare che in Magento 2 hanno davvero bisogno di assicurarsi che tutte le classi principali abbiano un prefisso di evento definito. In realtà ho riscritto le classi solo per definire il prefisso dell'evento in modo da poter agganciare in modo pulito gli eventi di salvataggio / caricamento. Hmm. In realtà penso che andrò a controllare personalmente la fonte Magento 2.
Tim Reynolds,

3
L'approccio che di solito seguo è, una rapida modifica / salvataggio / ripristino in app/code/core/Mage/Core/Model/App.phpe mage::log($eventName,null,'events.txt',true);al dispatchEventmetodo. Carica la pagina che sto cercando di osservare. Ovviamente non lasciarlo così com'è e ripristina una volta creato var / logs / events.txt. Sporco, si. Veloce, si. :)
B00MER,

2
bene, se vuoi che il tuo osservatore sia su una pagina. Ma attenzione, ci sono eventi che dovrebbero essere inviati, ma potrebbero non esserlo. C'è un evento di ordine o pagamento che non viene generato, se pagato con paypal ...
Fabian Blechschmidt

C'è qualche evento che viene generato dopo la creazione della spedizione in magento @FabianBlechschmidt
Kingshuk Deb

48

Fai il sanguinoso grep 'Mage::dispatchEvent' app/ -rsnQuesto ti fornirà un elenco di eventi specifici per la tua installazione in quanto l'elenco degli eventi può variare a seconda della versione di Magento, delle personalizzazioni e delle estensioni installate.


2
Questo è il miglior consiglio, includerà anche eventi di moduli di terze parti. Di solito, quando voglio sapere a quali eventi posso collegarmi per una determinata pagina, accedo i parametri app: dispatchEvent.
Petar Dzhambazov,

1
Il grep ti darà anche cattive informazioni: ad esempio, afferma che sales_order_place_afterciò accadrà, ma sembra che la chiamata a sparare sia commentata Checkout/Type/Onepage.php.
Kojiro,

Questa è una risposta scadente in quanto raccoglierà solo una frazione degli eventi disponibili in quanto manca completamente tutti gli eventi generati dinamicamente. @PetarDzhambazov dà buoni consigli per accedere al dispatcher e quindi caricare le pagine che ti interessano. La migliore risposta è di gran lunga la risposta accettata data da FabianBlechschmidt
Dom

26

Lo uso come un bel cheat sheet http://www.nicksays.co.uk/magento-events-cheat-sheet-1-7/ . Ha tutti gli eventi che possono essere chiamati in 1.7.


4
Dato che hai già fatto un buon lavoro nel collegare il contenuto, meglio fornire anche il contenuto qui nel caso in cui Nick dice "
scopa

3
Non sono un fan di questo elenco, perché 1: è incompleto, 2: ci sono altri 1231 blog su Magento con "tutti" gli eventi in Magento (+ alcune pagine wiki su Magento).
FlorinelChis

@benmarks indovina cosa è successo nel frattempo ...
toon81

9

So che è stata data una risposta a questa domanda. Ho appena aggiunto la mia strada qui:

  • Preparo la pagina che voglio osservare nel mio browser
  • Apro app / Mage.php
  • per public static function dispatchEvent(ln: ~ 446) all'inizio aggiungo //Mage::log($name, null, 'events.log', true);
  • decommenta quella linea,
  • aggiorna la pagina in cui mi trovo
  • commenta ancora quella riga

Quindi apri var / log / events.log (~ 40kb) e vedi molti eventi solo su quella pagina! :)


2
Ciò mancherà alcuni eventi che vengono attivati ​​prima che la configurazione del negozio venga unita.
benmarks

6

La risposta è già stata accettata ma pubblicherò comunque la mia risposta per il futuro:

Se vuoi vedere l'elenco degli eventi che Magento ha, hai 3 opzioni:

1) Google, ci sono molte persone che hanno compilato un elenco di eventi Magento

2) Creare un modulo che si aggancia controller_action_predispatchall'evento che è l'evento che viene chiamato prima che venga chiamato qualsiasi altro evento. All'interno di questo modulo è possibile registrare alcuni eventi che vengono inviati:

Aggiungi quanto segue su 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>

E all'interno del tuo modulo / modello / osservatore:

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

Quanto sopra registra ogni evento che viene inviato ...

3) Se si dispone dell'accesso SSH, è possibile eseguire il comando seguente per ottenere una panoramica di tutti gli eventi (e dei relativi file in cui vengono inviati):

cd /path/to/<magento-root>
grep -nris 'dispatchEvent' app/code/

1
Ci dispiace - mentre il numero 3 è buono, le informazioni in 1 e 2 dalla tua risposta non sono davvero corrette. 1) Ci sono alcuni eventi sparati prima controller_action_predispatch, in particolare controller_front_init_before. 2) Questo approccio semplicemente non registra tutti gli eventi inviati, si tratta di una sezione errata o incompleta?
benmarks

Modificato per "most";)
Kenny il

2
Siamo spiacenti, ancora non molto accurati :-( - ci sono così tanti altri eventi inviati (predispatch, layout, rendering, nonché i carichi di modello e raccolta) ...
benmarks

Aggiornata la risposta ad "alcuni eventi".
Kenny,

4

Sto usando Magento Developer Toolbar che ha una bella funzione di visualizzazione di eventi che possono essere osservati sulla pagina caricata.



4

Ho fatto un grep sul modulo Mage principale di Magento e ho rispettato un elenco,

Elenco esaustivo di eventi Magento

PS Come sottolineato, può contenere eventi che si trovano all'interno di funzioni deprecate di Magento, quindi controlla il riferimento al file e alla linea prima dell'implementazione.

Aperto per suggerimenti!


1
Ti mancano ancora tutti gli eventi magici della sottoclasse. Non si può fare a pezzi.
benmark

Eventi magici come in? Quelli che sono dinamici? Potresti elaborare plz @benmarks
huzefam


@benmarks sono d'accordo, non credo che dobbiamo preparare un elenco esplicitamente per questo
huzefam,

Da qui il mio commento, che è stato offerto in base all'uso di "esaustivo"
benmarks

4
grep "::dispatchEvent" -R * | sort -u

grep "eventPrefix" -R * | sort -u

Il precedente comando grep elencato renderebbe i duplicati (molto) e non copre l'elenco dei prefissi di eventi che sarebbero necessari per comprendere i nomi degli eventi generati dinamicamente. Questi comandi visualizzano entrambi gli elenchi con solo valori univoci. Potresti aggiungere il flag -n come l'altra risposta grep e ottenere il numero di riga suppongo. Ma la domanda non poneva dove fossero nel codice. ~ _ ~


abbiamo una risposta simile qui. Fai riferimento alla risposta di @TimBezhashvyly
Rajeev K Tomy,

sorta di .... il precedente comando grep elencato renderebbe i duplicati (molto) e non copre l'elenco dei prefissi di eventi che sarebbero necessari per comprendere i nomi degli eventi generati dinamicamente. Questi comandi visualizzano entrambi gli elenchi con solo valori univoci. Potresti aggiungere il flag -n come l'altra risposta grep e ottenere il numero di riga suppongo. Ma la domanda non poneva dove fossero nel codice.
mprototype,

potresti per favore aggiungere questa descrizione alla tua risposta. Quindi la tua risposta diventa super cool ... (Sono pronto a fare un voto allora) :-)
Rajeev K Tomy,

Questo aiuta?
mprototype,

Sì. +1 per quello. :)
Rajeev K Tomy,






Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.