Shopware 5.3 Plugin 101 | Das Event-System

Hier möchte ich kurz auf die verschiedenen Events von Shopware eingehen und deren Funktionsweise kurz erklären…

Globale Events

Diese werden automatisiert von Shopware erstellt und wurden bereits kurz in Shopware Plugin 101 | Einfaches Plugin erstellen genutzt und erwähnt.

Enlight_Controller_Action_PostDispatchSecure_Frontend_Detail

Bezieht sich dabei auf den Zeitpunkt nachdem die Controller Action der Artikel Detailseite ausgeführt wurde.

Das Event wird mit der getSubscribedEvents() Methode auf den jeweiligen Controller registriert (in unserem Fall der Artikel-Controller).

Jedes Post-Dispatch-Event beginnt mit:

Enlight_Controller_Action_PostDispatchSecure

lässt man die Definition am Ende weg, wird das Plugin nach jedem Seitenaufruf informiert. Was man tunlichst vermeiden sollte, daher hier eine Liste der verfügbaren Calls.

Shopware PostDispatch Event Liste

Man könnte auch ein komplettes Modul zum Listener hinzufügen, zum Beispiel mit Enlight_Controller_Action_PostDispatchSecure_Backend (anbei noch ein Teil der Backend Events)

Referenz zur Controller Action

Das ist alles schön und gut, aber woher bekommen wir jetzt die Informationen welche wir für das arbeiten mit den versch. Controllern brauchen?

Beim aufrufen der getSubscribedEvents Methode zeigen wir im unten stehenden Beispiel auf die Methode onFrontendDetail

public static function getSubscribedEvents() {
		return [
			'Enlight_Controller_Action_PostDispatch_Frontend_Detail' => 'onFrontendDetail'
		];
	}

 

public function onFrontendDetail(\Enlight_Event_EventArgs $arguments){

		$controller = $arguments->get('subject');


		$qb = $this->container->get('dbal_connection')->createQueryBuilder();

		$qb->select('name')
			->from('s_articles')
			->where('s_articles.id = :id')
			->setParameter('id', 2);

		$single = $qb->execute()->fetch();
		$view->assign('mein_produkt', $single);

	}

Über die Enlight_Event_EventArgs erhalten wir ein Kontext-Objekt, welches Informationen über den Detail-Controller enthält.

Wir können zum Beispiel folgende Zugriffe tätigen

in den meisten Fällen benötigen wir View(), Response(), Request(). In unserem Fall nutzen wir nur den View() und assignen diesem dann am Ende noch den Namen eines Artikels mit

$view->assign('mein_produkt', $single);

Application Events

Notify Events

Notify Events werden, wie der Name schon sagt, zur einfachen Benachrichtigung genutzt.

<?php
/**
 * Created by PhpStorm.
 * User: Micha
 * Date: 16.10.17
 * Time: 19:50
 */

namespace MiHoEvents;

class MiHoEvents extends \Shopware\Components\Plugin {

	public static function getSubscribedEvents()
	{
		return [
			'Shopware_Modules_Admin_Logout_Successful' => 'onLogout',
		];
	}

	public function onLogout(\Enlight_Event_EventArgs $args)
	{
		$this->logError('User logged out');

	}

	private function logError($message)
	{
		$container = Shopware()->Container();
		$logger = $container->get('pluginlogger');
		$logger->error($message);
	}

}

Wir loggen hier einfach das Event im Plugin Log, indem wir beim call der Methode ein Log Entry anlegen. Dazu holen wir uns erst den DI-Container (Shopware’s zentraler Dreh- und Angelpunkt) – getten uns den pluginlogger und schreiben eine Nachricht hinein.

Notify Until Events

Diese werden benutzt um gewisse Vorgänge abzubrechen in unserem Fall wenn ein Gutscheincode mit dem Wert „test“ in den Warenkorb gelegt wird

<?php

namespace MiHoEvents;

class MiHoEvents extends \Shopware\Components\Plugin {

   public static function getSubscribedEvents()
   {
      return [
         'Shopware_Modules_Basket_AddVoucher_Start' => 'onAddVoucer',
      ];
   }

   public function onAddVoucer(\Enlight_Event_EventArgs $args)
   {
      $ordernumber = $args->get('code');

      if ($ordernumber == 'test') {
         return true;
      }

   }

}

Dieser Event wurde manuell in sBasket.php gesetzt:

    /**
     * Add voucher to cart
     * Used in several places
     *
     * @param string $voucherCode Voucher code
     * @param string $basket
     *
     * @return array|bool True if successful, false if stopped by an event, array with error data if one occurred
     */
    public function sAddVoucher($voucherCode, $basket = '')
    {
        if ($this->eventManager->notifyUntil(
            'Shopware_Modules_Basket_AddVoucher_Start',
            ['subject' => $this, 'code' => $voucherCode, 'basket' => $basket]
        )) {
            return false;
        }

........

und gibt gewöhnlich false zurück.

Filter Events

Das Filter Event ist da um bestimmte Daten vor der Auslieferung im Frontend zu verändern. In unserem Fall nutzen wir das Paymentmeans-Filter Event

Shopware_Modules_Admin_GetPaymentMeans_DataFilter
<?php

namespace MiHoEvents;

class MiHoEvents extends \Shopware\Components\Plugin {

	public static function getSubscribedEvents()
	{
		return [
			'Shopware_Modules_Admin_GetPaymentMeans_DataFilter' => 'onPaymentView',
		];
	}

	public function onPaymentView(\Enlight_Event_EventArgs $args)
	{
		$getPaymentMeans = 0;
		return $getPaymentMeans;
	}

}
Vorher

Nachher

 

Collect Events

Diese Events werden eher selten genutzt. Besondere Fälle in denen diese Collect Events oft gebraucht werden ist die Suche und deren Facets (ProductNumberSearch.php) oder Less Files in Plugins (Compiler.php)

Theme_Compiler_Collect_Plugin_Less

Mit diesem Collect Event können Plugins einfach mit Less Files erweitert werden.

Hier findet Ihr einige Beispiele für das Collect Event. Ich nutze zum Beispiel in einem Plugin das oben beschrieben Theme_Compiler_Collect_Plugin_Less Event.

MiHoEvents – ZIP File mit Collect Event Plugin Beispiel

 

 

 

2 Antworten auf „Shopware 5.3 Plugin 101 | Das Event-System“

  1. Super Erklärungen hier, tiptop.
    Wie hast du allerdings die Auflistung der Events bekommen?

    Ich steige da noch nicht so ganz hinter, wie ich eine Auflistung aller Events hole ggf. gegliedert nach listing, detail etc. sodass ich eben weiß, auf welche Events ich lauschen muss.

    Kannst du mir sagen, wie du die Event Liste angezeigt bekommen hast? 🙂

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert