Loose Kopplung von plugins mit Event

Lukas [Pimcore, Tricks und Tools]

Wir haben unterdessen mehrer Plugins im Einsatz. Zum Beispiel eines, mit welchem mir sämtliche Front-End Logins und die dazugehörigen Funktionen wie Passwort vergessen machen. Dieses verwenden wir natürlich auch in anderen Plugins wieder, schliesslich sind diese Funktionen ja genau die gleichen. Jetzt kann es aber vorkommen, dass unser Zweitplugin bei bestimmten Aktionen wie nach erfolgreichem Login oder Logout auch Aktionen ausführen sollte. Dies wollen wir so bewerkstelligen, dass das Authentifizierungsplugin nicht verändert werden muss und auch läuft, wenn das Zweitplugin nicht vorhanden ist. Dafür gibt es Events!

Konkret

Jetzt noch etwas konkreter. In der Anforderung handelt es sich um ein Shop-Plugin. Da wir das Login nicht neuschreiben wollen, verwenden wir unser Authentifizierungsplugin. Nun aber soll nach dem Logout der aktuelle Warenkorb gelöscht werden, da sich darin Rabatte befinden könnten die man aufgrund des Logins erhalten hat. Sobald man sich wieder einloggt, holen wir den neusten Warenkorb zurück, so dass man mit der letzten Bestellung weiterfahren kann.

Events sind die Lösung

Als erstes erweitern wir das Auth-Plugin und triggern über den EventManager einen Event beim Login und Logout an jeweils geeigneter Stelle.

Pimcore::getEventManager()->trigger("nambuauth.logout", $user);
Pimcore::getEventManager()->trigger("nambuauth.login", $user);

Nun kann unser Shop-Plugin diesen Event registrieren und dann die gewünschte Aktion ausführen. Dem Authentifizierungsplugin ist das egal, es läuft auch weiter wenn keines oder zehn andere Plugins den Event registriert haben.

Unser Shop-Plugin löscht nun die aktuelle Bestellung und versucht die neuste nicht abgeschlossene zu laden, falls der Benutzer nicht schon damit angefangen hat seinen Warenkorb vor dem Login zu füllen.

class nambushop_Plugin extends nambu_PluginAbstract {
  public function init() {
    pimcore::getEventManager()->attach("nambuauth.login", array($this, "customerLogin"));
    Pimcore::getEventManager()->attach("nambuauth.logout", array($this, "customerLogout"));
  }

  public function customerLogin(Zend_EventManager_EventDescription $e) {
    $object = $e->getTarget();
    if ($object instanceof Object\AuthUser) {
      $session = nambushop_Session::get();
      $order = $session->getOrder();
      if (!$order instanceof Object\ShopOrder) {
        $orders = new Object\ShopOrder\Listing();
        $orders->setCondition("customer__id = ? AND orderstate = ?", array($object->getId(), "created"));
        $orders->setUnpublished(true);
        $orders->setLimit(1);
        $orders->setOrderKey("o_creationDate");
        $orders->setOrder("DESC");

        $oldOrder = $orders->current();
        if ($oldOrder instanceof Object\ShopOrder) {
          $session->setOrder($oldOrder);
        }
      }
    }
  }

  public function customerLogout(Zend_EventManager_EventDescription $e) {
    $session = nambushop_Session::get();
    $session->clearOrder();
  }

zurück