Wo finde ich eine vollständige Liste der Magento-Ereignisse?

94

Ich weiß, dass Magento ein Hook-ähnliches System namens Events hat. Hat jemand eine vollständige Liste oder ein Skript, mit dem bestimmt werden kann, welche Ereignisse aufgerufen werden können?

benmarks
quelle
4
Ich benutze dies als einen schönen Spickzettel nicksays.co.uk/magento-events-cheat-sheet-1-7
Derrik Nyomo
1
@DerrikNyomo - Sie sollten dies als Antwort zusammen mit einer Zusammenfassung der bereitgestellten Informationen posten. :-)
benmarks
1
Spickzettel für Ereignisse sind in der Tat ein größerer Aufwand, da sie Ihnen den falschen Eindruck vermitteln, dass das von mir gewünschte Ereignis nicht existiert, und Sie möglicherweise Stunden mit dem Programmieren verschwenden, nachdem Sie ein Ereignis verpasst haben, das (seit vielen Jahren) hätte verwendet werden können Ich habe eine Antwort auf diese Frage gepostet: Link und meine Antwort bezieht sich auch auf diese Frage. Es gibt Ihnen keine vollständige 'Liste', aber es gibt Ihnen eine vollständige Liste der Ereignisse für die Aktion / das Laden der Seite, an der Sie interessiert sind.
ProxiBlue

Antworten:

102

Es gibt keine Liste aller magento-Ereignisse, da die meisten Ereignisse dynamisch benannt werden.

Wenn Sie mich fragen, ist die Kenntnis dieser Schlüsselereignisse (und der Konsequenzen) ein guter Ausgangspunkt (neben der Liste von nick):

Jedes Objekt, das von Mage_Core_Model_Abstract erweitert wurde, löst viele Ereignisse zum Laden, Speichern und Löschen aus:

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

Zum Beispiel, um Prüfungen hinzuzufügen, nachdem das Objekt geladen wurde

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

um dem Objekt zusätzliche Daten hinzuzufügen, bevor es gespeichert wird

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

Um andere Modelle zu speichern, nachdem das "Eltern" gespeichert wurde

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

bereinigen, bevor das Modell gelöscht wird

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

aufräumen, bevor das modell gelöscht wird - oder vielleicht nachher? Sie sind hier noch in der Transaktion!

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

Wenn Sie sicher sein möchten, dass die Entität gelöscht wurde

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

Die Sammlungen, die von Mage_Core_Model_Resource_Db_Collection_Abstract erweitert wurden, haben auch zwei generische Ereignisse:

Beispiel: So ändern Sie die SQL zum Laden der Auflistung:

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

Beispiel: So fügen Sie den Objekten zusätzliche Daten hinzu:

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
quelle
4
Sehr gute Antwort; Wir hoffen auf etwas, das wir im Wiki finden können. Die Wichtigkeit der _eventPrefixEreignisse für das Modell, der Ereignisse für gezielte Anforderungen, der gelegentlich nützlichen allgemeinen
Blockereignisse
1
Ausgezeichnet. Ich wollte darauf hinweisen, dass in Magento 2 wirklich sichergestellt werden muss, dass alle Kernklassen ein definiertes Ereignispräfix haben. Ich habe tatsächlich Klassen umgeschrieben, nur um das Ereignispräfix zu definieren, damit ich mich sauber in Ereignisse zum Speichern / Laden einhängen kann. Hmm. Eigentlich denke ich, dass ich die Magento 2-Quelle selbst überprüfen werde.
Tim Reynolds
3
Der Ansatz, den ich normalerweise verfolge, ist ein schnelles Bearbeiten / Speichern / Zurücksetzen auf app/code/core/Mage/Core/Model/App.phpund mage::log($eventName,null,'events.txt',true);zu der dispatchEventMethode. Laden Sie die Seite, die ich beobachten möchte. Lassen Sie dies natürlich nicht so wie es ist und kehren Sie zurück, sobald Ihre Datei var / logs / events.txt erstellt wurde. Dreckig, ja. Schnell ja. :)
B00MER
2
gut, wenn Sie möchten, dass sich Ihr Beobachter auf einer Seite befindet. Aber seien Sie vorsichtig, es gibt Ereignisse, die ausgelöst werden sollten, aber möglicherweise nicht. Es gibt eine Bestellung oder ein Zahlungsereignis, das nicht ausgelöst wird, wenn es mit Paypal bezahlt wird ...
Fabian Blechschmidt
Gibt es ein Ereignis, das nach der Erstellung der Sendung in magento @FabianBlechschmidt
Kingshuk Deb
48

Verdammt noch grep 'Mage::dispatchEvent' app/ -rsnmal ! Hier finden Sie eine Liste der Ereignisse, die für Ihre Installation spezifisch sind. Die Liste der Ereignisse kann je nach Magento-Version, installierten Anpassungen und Erweiterungen variieren.

user487772
quelle
2
Das ist der beste Rat, es werden auch Veranstaltungen mit Modulen von Drittanbietern angeboten. Normalerweise protokolliere ich app: dispatchEvent-Parameter, wenn ich wissen möchte, an welche Ereignisse ich mich für eine bestimmte Seite binden kann.
Petar Dzhambazov
1
Das grep gibt Ihnen auch schlechte Informationen: Zum Beispiel wird behauptet, dass sales_order_place_afterdies passieren wird, aber es scheint, dass der Aufruf zum Feuern auskommentiert ist Checkout/Type/Onepage.php.
Kojiro
Dies ist eine schlechte Antwort, da nur ein Bruchteil der verfügbaren Ereignisse erfasst wird, da alle dynamisch generierten Ereignisse vollständig übersehen werden. @ PetarDzhambazov gibt gute Ratschläge, sich beim Dispatcher anzumelden und dann die Seiten zu laden, an denen Sie interessiert sind. Die mit Abstand beste Antwort ist die von FabianBlechschmidt
Dom
26

Ich benutze dies als einen schönen Spickzettel http://www.nicksays.co.uk/magento-events-cheat-sheet-1-7/ . Es hat alle Ereignisse, die in 1.7 aufgerufen werden können.

Derrik Nyomo
quelle
4
Da du die Inhalte bereits gut verlinkt hast, solltest du sie auch hier bereitstellen, falls Nick "screw Magento" sagt und seine Seite löscht :-)
benmarks
3
Ich bin kein Fan dieser Liste, weil 1: es ist unvollständig, 2: es gibt andere 1231 Blogs über Magento mit "allen" Ereignissen in Magento (+ einige Wiki-Seiten in Magento).
FlorinelChis
@benmarks rate mal, was in der Zwischenzeit passiert ist ...
toon81
9

Ich weiß, dass diese Frage beantwortet wurde. Ich füge meinen Weg hierher hinzu:

  • Ich bereite eine Seite vor, die ich in meinem Browser beobachten möchte
  • Ich öffne app / Mage.php
  • für public static function dispatchEvent(ln: ~ 446) am anfang füge ich hinzu //Mage::log($name, null, 'events.log', true);
  • kommentiere diese Zeile aus,
  • Aktualisiere die Seite, auf der ich mich befinde
  • Kommentar noch einmal diese Zeile

Dann öffnest du var / log / events.log (~ 40kb) und siehst eine ganze Menge Ereignisse nur auf dieser Seite! :)

Kresimir Pendic
quelle
2
Dadurch werden einige Ereignisse übersehen, die ausgelöst werden, bevor die Speicherkonfiguration zusammengeführt wird.
benmarks
6

Die Antwort wurde bereits angenommen, aber ich werde meine Antwort trotzdem für die Zukunft posten:

Wenn Sie die Liste der Ereignisse in Magento anzeigen möchten, haben Sie drei Möglichkeiten:

1) Für Google gibt es eine Menge Leute, die eine Liste von Magento-Ereignissen zusammengestellt haben

2) Erstellen Sie ein Modul, controller_action_predispatchdas das Ereignis einbindet, das aufgerufen wird, bevor ein anderes Ereignis aufgerufen wird. In diesem Modul können Sie einige Ereignisse protokollieren, die ausgelöst werden:

Fügen Sie in config.xml Folgendes hinzu

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

Und innerhalb des yourmodule / Model / Observer:

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

Das obige würde jedes Ereignis protokollieren, das ausgelöst wird ...

3) Wenn Sie über SSH-Zugriff verfügen, können Sie den folgenden Befehl ausführen, um eine Übersicht über alle Ereignisse (und deren Dateien, an die sie gesendet werden) zu erhalten:

cd /path/to/<magento-root>
grep -nris 'dispatchEvent' app/code/
Kenny
quelle
1
Entschuldigung - während # 3 gut ist, sind die Informationen in 1 & 2 aus Ihrer Antwort wirklich nicht korrekt. 1) Es wurden bereits einige Ereignisse ausgelöst controller_action_predispatch, insbesondere controller_front_init_before. 2) Dieser Ansatz protokolliert einfach nicht jedes Ereignis, das ausgelöst wird. Ist dies ein Tippfehler oder ein unvollständiger Abschnitt?
benmarks
Bearbeitet zu "am meisten";)
Kenny
2
Es tut uns leid, aber immer noch nicht sehr genau :-( - es werden so viele weitere Ereignisse gesendet (Vorabversand, Layout, Rendering sowie Modell- und Sammlungsladungen) ...
am
Die Antwort auf "Einige Ereignisse" wurde aktualisiert.
Kenny
4

Ich verwende die Magento Developer Toolbar, die eine nette Funktion zum Anzeigen von Ereignissen bietet, die auf geladenen Seiten beobachtet werden können.

Damir Mitrovic
quelle
4

Ich habe ein Grep für das Magier-Kernmodul von Magento durchgeführt und eine Liste befolgt,

Vollständige Liste der Magento-Ereignisse

PS Wie bereits erwähnt, können Ereignisse enthalten sein, die sich in veralteten Funktionen von Magento befinden. Überprüfen Sie daher vor der Implementierung die Datei- und Zeilenreferenz.

Offen für Vorschläge!

huzefam
quelle
1
Sie vermissen immer noch alle untergeordneten magischen Ereignisse. Kann nicht für gegriffen werden.
benmarks
Magische Ereignisse wie in? Diejenigen, die dynamisch sind? Könnten Sie bitte @benmarks
huzefam
@benmarks Ich stimme zu, ich glaube nicht, dass wir eine Liste explizit dafür
erstellen müssen
Daher meine Bemerkung, die auf der Verwendung anhand von „erschöpfend“ angeboten wurde
benmarks
4
grep "::dispatchEvent" -R * | sort -u

grep "eventPrefix" -R * | sort -u

Der zuvor aufgeführte Befehl grep rendert Duplikate (viele) und deckt nicht die Liste der Ereignispräfixe ab, die zum Verständnis der dynamisch generierten Ereignisnamen erforderlich sind. Diese Befehle rendern beide Listen nur mit eindeutigen Werten. Sie könnten das -n-Flag wie die andere grep-Antwort hinzufügen und die Zeilennummer erhalten, nehme ich an. Aber die Frage stellte keine Frage, wo in dem Code sie sich alle befanden. ~ _ ~

mprototype
quelle
Wir haben hier eine ähnliche Antwort. Siehe @TimBezhashvyly ‚s Antwort
Rajeev K Tomy
Art von ... Der zuvor aufgeführte Befehl grep rendert Duplikate (viel) und deckt nicht die Liste der Ereignispräfixe ab, die zum Verständnis der dynamisch generierten Ereignisnamen erforderlich sind. Diese Befehle rendern beide Listen nur mit eindeutigen Werten. Sie könnten das -n-Flag wie die andere grep-Antwort hinzufügen und die Zeilennummer erhalten, denke ich. Aber die Frage stellte keine Frage, wo in dem Code sie sich alle befanden.
mprototype
Könnten Sie bitte diese Beschreibung zu Ihrer Antwort hinzufügen? Dann wird deine Antwort super cool ... (bin dann bereit, eine positive Bewertung abzugeben) :-)
Rajeev K Tomy
Hilft das?
mprototype
Ja. +1 dafür. :)
Rajeev K Tomy