Türchen 12: Events in Magento erstellen

Magento ist ein mächtiges Werkzeug und gibt durch die durchdachte Klassenstruktur dem Entwickler viel Freiheiten. Diese Freiheit wird jedoch in Grenzen gehalten. Es ist nicht möglich, einen Klasse mehrmals zu überschreiben - dies kann nur einmal geschehen. Darum gibt es neben der Möglichkeit, Klassen zu überschreiben, Aktionen an Events zu delegieren und auch neue Events zu registrieren.

Events bieten die Möglichkeit, den Funktionsumfang von Magento zu erweitern, ohne die Flexibilität zu verlieren und sich keine Gedanken darum machen zu müssen, ob andere Extensions auf die gleichen Klassen zugreifen. Dazu ist es nötig zu wissen, wie ein Event ausgelöst und wie man darauf reagiert.

1. Schritt: Events auslösen
Innerhalb von Magento wird durch diese Zeile

Mage::dispatchEvent('webguys_event', array('object'=>$this));
ein Events ausgelöst. Dabei repräsentiert 'object' vom Kontext abhängige Variablen. Diese können z.B. auch Controller, Order oder ähnlich heißen.

2. Schritt: Auf Events reagieren
An dieser Stelle hat man zwei Möglichkeiten, entweder man implementiert die Reaktion in ein bestehendes Modul oder erstellt ein neues. Für den Adventskalender erstellen wir ein neues.
Zuerst die etc/config.xml:

<?xml version="1.0"?>
<config>
    <modules>
        <Webguys_Advent>
            <version>0.0.1</version>
        </Webguys_Advent>
    </modules>
    <global>
        <helpers>
            <advent>
                <class>Webguys_Advent_Helper</class>
            </advent>
        </helpers>
    </global>
    <frontend>
        <events>
            <webguys_advent>
                <observers>
                     <custom_event_handler>
                         <type>model</type>
                         <class>webguys_event/observer</class>
                         <method>adventObserverAction</method>
                   </custom_event_handler>
                </observers>
            </webguys_advent>
        </events>
    </frontend>
</config>

Natürlich benötigen wir noch die verarbeitende Klasse Webguys_Advent/Model/Observer.php:

class Webguys_Event_Model_Observer {
    public function adventObserverAction(Varien_Event_Observer $observer) {
        $object = $observer->getEvent()->getObject();
        /*  magic */
        return $this;
    }
}

Am Ende noch schnell einen leeren Helper Webguys_Advent/Helper/Data.php erstellen, dann kann es schon losgehen.



Ein Beitrag von Ingo Hillebrand
Ingo's avatar

Ingo Hillebrand lebt in Soest und arbeitet als Anwendungsentwickler bei der Firma connect-io. Dort beschäftigt sich der studierte Wirtschaftsinformatiker (Bachelor of Science) weiterhin mit Magento. Sie erreichen ihn per e-Mail an ingo@webguys.de oder über Xing.

Alle Beiträge von Ingo

Kommentare
Sam am

Hallo Tobi,

da muss ich dir recht geben.

Die liste soll ja auch nur eine kleine Hilfestellung geben. Um mal einen groben Überblick zu bekommen.

Der Trick mit Mage::dispatchEvent logging ist ja bekannt. Aber evtl wäre das was, wo man mal genauer drauf schauen könnte.

Gruß, Sam

Tobias Vogt am

Hi Sam,

danke danke. Das Problem an den Listen ist nur das sie leider in der Regel nicht komplett sein können. Jeder Controller generiert z.B. anhand seines Namens und der Action ein eigenes Event automatisch aus dem Source. Vergleichbares gibt es bei Models. Die Event lassen sich leider in der Regel nicht so einfach mittels "grep" finden und bleiben somit versteckt.

Wenn ich ein bestimmtes Event suche, aber nicht kenne, logge ich häufig einfach die Aufrufe von Mage::dispatchEvent. Leider gibt es jedoch kein Event das ausgelöst wird wenn ein Event geworfen wird ..

Tobi

Sam am

ergänzend zu dem thema, hab ich hier noch eine liste von magento events

mach weiter so.

gruß, sam

Simon Sprankel am

Auch wieder sehr nützlich, Danke!

Kleiner Typo: 1. Schritt: Events ausgelösen

Viele Grüße, Simon

Dein Kommentar