Magento Events oder besser: Magento Event-Observers

Ein Programmierer der Magento erweitern möchte, weil eine Funktionalität fehlt oder eine bestehende verändert werden soll, stößt ganz schnell auf den Begriff der „Events“. Im Leben der Magento-Entwickler spielt die Event-Suche daher eine nicht geringe (zeitraubende) Rolle…

Magento ist so konzipiert, dass man die Originalklassen eigentlich (ohne das Wort „eigentllich“ gäbe es keine Programmierung) nicht verändern sollte. Wer schon bereits programmiert und bestehende Programmcodes verändert oder erweitert hat, kennt das Überschreiben von Klassen und findet sicher, dass dies auch hier der naheliegendste Weg ist. Naheliegend jooooo, aber nicht der beste.

Wenn man eine Papierpuppe hat und diese hat Schuhe, Haare, Rock etc. und nun möchte man etwas an dieser Puppe verändern, bedeutet „überschreiben“, dass man einen neuen Rock ausschneidet und über den vorhandenen legt. Wenn nun andere den gleichen Bereich verändern wollen, liegen die Röcke übereinander und es „gewinnt“ der, der oben liegt. Die anderen Outfits funktionieren dann nicht mehr richtig.

Besser ist es also, Events zu benutzen. Im Falle der Papierpuppe könnte der Event „Ausgehen“ heißen und wenn dieser auftritt, wird der lange Rock angezogen, wenn er „Regenwetter“ heißt, die Matschhose.

Einfach ausgedrückt sind Events Ereignisse, die im Shop auftreten, während irgendwas im Shop abgearbeitet wird. Es wird ein Produkt in den Warenkorb hinzugefügt. Der Index wird neu aufgebaut. Der Customer loggt sich ein. Ein Tabellenname wird geladen. Eine CMS Seite wird gelöscht.

Es gibt in Magento dreierlei Arten von Events:

1. Frontend Events: dies sind Events, die auftreten, wenn der Besucher im Shop den Shop bedient.
Bsp.:

sales_quote_item_set_product
sales_convert_quote_to_order
customer_logout

2. AdminHtml Events: diese Events treten auf, während man den Admin-Bereich bedient.
Bsp.:

adminhtml_widget_container_html_before
clean_media_cache_after
cms_page_prepare_save

3. Core Events: diese Events treten auf, wenn „globale“ Funktionen aufgerufen werden.
Bsp:

model_load_before
http_response_send_before
core_block_abstract_prepare_layout_before

Eines will ich nicht verheimlichen: es gibt nicht für alles Events…, es gibt aber immer mehr davon. Mit jeder Magento-Version steigt die Anzahl der Events und es lohnt sich, nachzusehen, welche zu der jeweiligen Version gehören.

Man verbringt durchaus viel Zeit damit herauszufinden, ob es einen Event für die jeweilige Anforderung gibt.

Jeder Event gehört zu einem Model, bzw. einer Datei. Es gibt Events, mit gleichem Namen, die in unterschiedlichen Models Verwendung finden (z.b. checkout_submit_all_after).

Ein Beispiel:
es wird eine Bestellung aufgegeben. Am Ende der Bestellung soll eine E-Mail versendet werden. Mögliche Events sind in diesem Fall:

checkout_onepage_controller_success_action, 
oder checkout_type_onepage_save_order_after 
oder sales_order_save_after

Wenn man den Event glaubt gefunden zu haben und seine Extension soweit angelegt hat, kann man in seiner config.xml je nachdem im global, adminhtml oder frontend-Knoten den Event, den man abfangen möchte, bekannt machen:

<frontend>
    <events>
      <sales_order_save_after > 
        <observers>
         <beschreibung_fuer_diesen_event_listener>
            <type>singleton</type>
            <class>meinmodel/observer</class>
            <method>meine_funktion_ohne_klammern</method>
          </beschreibung_fuer_diesen_event_listener >
        </observers>
      </sales_order_save_after>
    </events>
  </frontend>

<frontend> der „Zuständigkeitsbereich“ des Event-Observers, hier kann man „frontend“, „adminhtml“ oder „global“ einsetzen.

<events> im Element „events“ sind alle Events auf Lager…

<sales_order_save_after> Bezeichnung des Events, das hier abgefangen werden soll.

<observers> Events sind immer vom Typ „Observer“ – zumindest meines Wissens nach…

<beschreibung_fuer_diesen_event_listener> Eindeutiger, eigener Bezeichner für diese Event-Abfang-Konfiguration… Der Name ist im Grunde egal und kann frei gewählt werden, muss aber eindeutig sein.

<type> Typ Singleton = eine Instanzierung mittels Mage::getSingleton() , Typ „model“ = bei jedem Aufruf eine Instanzierung mittels Mage::getModel()

<class> Klasse, die die eigene Methode enthaelt, die nun bei Vorkommen des Events abgearbeitet werden solle

< method> Die Funktion, die in der Observer-Klasse aufgerufen werden soll.

Miss Magenta
Carmen Wingenbach

Zum Ausprobieren gibt’s folgende Anleitungen:
Events in Magento: Export bei neuer Bestellung

Auf Bestellungen reagieren / Event-Observer

Und Übersichten über Magento Events gibt’s hier:
http://www.magentocommerce.com/wiki/5_-_modules_and_development/reference/events

http://www.magentocommerce.com/wiki/5_-_modules_and_development/reference/magento_events

http://it.cjunky.de/article/view/uebersicht-ueber-magento-events

Kontakt
E-Mail: office@neoshops.de
Tel.: +49 [0]151 7000 7107
Carmen Bremen
Magento Certified Developer
Magento Certified Solution Specialist
Magento Certified Frontend Developer
Magento Freelancer


Magento Certified Developer Magento Certified Solution Specialist Magento Certified Frontend Developer



Magento Stammtisch Köln
Magento Stammtisch KölnDer nächste Kölner Magento Stammtisch findet statt am 12. Januar 2017. (Xing eintragen, ich sende eine Rund-E-Mail mit Details kurz vor dem Event!

Kontakt

Carmen Bremen.

In: Xing
In: Skype
In: Twitter
In: Google+
Per: Formular
Innermail: Office (t) neoshops.de
In Köln: In der Lößbörde 1, 50859 Köln
Per Handy: +49 [0]151- 7000 7107

Letzte Beiträge