Montag früh, 9:00 Uhr: Dein Kunde ruft an und wünscht sich eine spezielle Funktion. Sobald ein Produkt in den Warenkorb gelegt wird, soll automatisch eine E-Mail an das Lager verschickt werden. Ein anderer Kunde möchte, dass bei jedem Bestellabschluss zusätzliche Daten an sein ERP-System übertragen werden. Wieder ein anderer benötigt individuelle Produktdaten in der Listing-Ansicht. All diese Anforderungen haben eines gemeinsam: Sie lassen sich elegant über Shopware Events lösen – wenn du weißt, wie.
Das Shopware Event-System ist wie ein unsichtbares Nervensystem, das durch deinen gesamten Online-Shop verläuft. Es informiert dich über jeden wichtigen Moment: "Gerade wurde ein Produkt aufgerufen", "Ein Kunde hat sich registriert", "Die Warenkorb-Seite wird geladen". Du kannst auf diese Ereignisse reagieren und deine eigene Logik einbauen, ohne den Shopware-Core zu verändern.
Stell dir vor, du betreibst einen physischen Laden. Jedes Mal, wenn ein Kunde die Tür öffnet, klingelt eine Glocke. Diese Glocke ist ein Event – sie signalisiert: "Achtung, ein Kunde kommt!" Du könntest auf dieses Signal reagieren, indem du ihn begrüßt, ihm Hilfe anbietest oder ein spezielles Angebot machst.
Genau so funktionieren Shopware Events: Sie sind Signale, die an bestimmten Stellen im Code ausgelöst werden. Der entscheidende Vorteil: Der Code, der das Event auslöst, muss nicht wissen, wer darauf reagiert. Shopware kann ein "ORDER_FINISHED"-Event mit Informationen wie Bestellsumme und Produkten aussenden. Dein Plugin kann darauf reagieren und diese Daten automatisch an dein ERP-System weiterleiten.
Shopware unterscheidet zwischen vier grundlegenden Event-Typen, die jeweils unterschiedliche Möglichkeiten bieten:
$this->container->get('events')->notify(
'SwagEvent_Product_Added_To_Cart',
[
'productId' => 123,
'quantity' => 2,
'customerId' => 456
]
);
Notify Events informieren dich lediglich über ein Ereignis. Du kannst die übertragenen Daten lesen und basierend darauf eigene Aktionen ausführen – zum Beispiel eine Benachrichtigung versenden oder Statistiken aktualisieren.
Diese Events ermöglichen es dir, Shopware-Prozesse zu stoppen. Perfekt für Validierungen oder Sicherheitsprüfungen:
public function onValidateCheckout(\Enlight_Event_EventArgs $args)
{
$customer = $args->get('customer');
// Sperre den Checkout für gesperrte Kunden
if ($customer->isBlocked()) {
return 'Ihr Konto ist gesperrt. Bitte kontaktieren Sie uns.';
}
// Null zurückgeben = Shopware soll normal fortfahren
return null;
}
Filter Events sind deine Werkzeuge für Datenmanipulation. Sie ermöglichen es, Ergebnisse zu verändern, bevor sie verwendet werden:
public function onFilterProductData(\Enlight_Event_EventArgs $args)
{
$products = $args->getReturn();
// Zusätzliche Bewertungsdaten hinzufügen
foreach ($products as &$product) {
$product['customRating'] = $this->calculateCustomRating($product['id']);
$product['deliveryTime'] = $this->getDeliveryTime($product['id']);
}
return $products;
}
Collect Events sammeln verschiedene Komponenten oder Handler. Ideal für Plugin-Architekturen:
public function onCollectPaymentHandlers(\Enlight_Event_EventArgs $args)
{
return new ArrayCollection([
new CustomPaymentHandler(),
new AnotherPaymentHandler()
]);
}
Die professionelle Art, mit Shopware Events zu arbeiten, sind Event Subscriber. Sie kapseln deine Event-Logik in eigene Klassen und machen deinen Code wartbarer. Ein Shopware Subscriber implementiert das SubscriberInterface und definiert seine Shopware Event Listener zentral:
<?php
namespace SwagCustomExtension\Subscriber;
use Enlight\Event\SubscriberInterface;
class ProductSubscriber implements SubscriberInterface
{
public static function getSubscribedEvents()
{
return [
'Enlight_Controller_Action_PostDispatchSecure_Frontend_Detail' => 'onProductDetail',
'Shopware_Modules_Basket_AddArticle_Start' => 'onAddToCart',
'sOrder::saveOrder::after' => 'onOrderComplete'
];
}
public function onProductDetail(\Enlight_Event_EventArgs $args)
{
$controller = $args->getSubject();
$view = $controller->View();
// Zusätzliche Produktinformationen laden
$productId = (int) $controller->Request()->getParam('sArticle');
$customData = $this->loadCustomProductData($productId);
$view->assign('customProductData', $customData);
}
public function onAddToCart(\Enlight_Event_EventArgs $args)
{
$productId = $args->get('id');
$quantity = $args->get('quantity');
// Lagerbenachrichtigung versenden
$this->notifyWarehouse($productId, $quantity);
}
}
Registrierung in der `services.xml`:
<service id="swag_custom_extension.subscriber.product_subscriber"
class="SwagCustomExtension\Subscriber\ProductSubscriber">
<tag name="shopware.event_subscriber" />
</service>
Eine Shopware Events List der wichtigsten Event-Kategorien:
| Event-Kategorie | Beispiel-Event | Verwendungszweck |
|---|---|---|
| Controller Events | PostDispatchSecure_Frontend_Listing | Template-Variablen erweitern, zusätzliche Daten laden |
| Basket Events | Shopware_Modules_Basket_AddArticle_Start | Warenkorb-Logik anpassen, Validierungen |
| Order Events | sOrder::saveOrder::after | Nach Bestellabschluss: ERP-Integration, E-Mails |
| User Events | Shopware_Modules_Admin_Login_Successful | Nach Login: Begrüßung, Tracking |
| Template Events | Theme_Inheritance_Template_Directories_Collected | Template-Verzeichnisse erweitern |
Shopware Controller Events sind besonders nützlich für Frontend-Anpassungen, während Shopware Backend Events administrative Funktionen erweitern. Für moderne Shopware-Versionen bietet die Shopware 6 Events List zusätzliche Business Events, die als Shopware 6 Business Events bezeichnet werden.
Ein häufiger Anwendungsfall ist die automatische Übertragung von Bestelldaten an ein ERP-System:
<?php
namespace SwagERPIntegration\Subscriber;
class OrderSubscriber implements SubscriberInterface
{
private $erpService;
public function __construct($erpService)
{
$this->erpService = $erpService;
}
public static function getSubscribedEvents()
{
return [
'sOrder::saveOrder::after' => 'onOrderSaved'
];
}
public function onOrderSaved(\Enlight_Hook_HookArgs $args)
{
$orderId = $args->getReturn();
$orderData = $this->loadOrderData($orderId);
try {
$this->erpService->transferOrder($orderData);
$this->logTransfer($orderId, 'success');
} catch (\Exception $e) {
$this->logTransfer($orderId, 'failed', $e->getMessage());
// Optional: Retry-Mechanismus oder Admin-Benachrichtigung
}
}
private function loadOrderData($orderId)
{
// Bestelldaten aus der Datenbank laden
$sql = '
SELECT o.*, od.*, c.email, c.customernumber
FROM s_order o
LEFT JOIN s_order_details od ON o.id = od.orderID
LEFT JOIN s_user c ON o.userID = c.id
WHERE o.id = ?
';
return Shopware()->Db()->fetchAll($sql, [$orderId]);
}
}
Das Finden der richtigen Events kann anfangs herausfordernd sein. Hier sind bewährte Strategien:
Schaue dir den Controller oder die Klasse an, die du erweitern möchtest. Suche nach `notify`, `filter`, `collect` oder Hook-Aufrufen:
// In der sBasket-Klasse findest du:
$this->eventManager->notifyUntil(
'Shopware_Modules_Basket_AddArticle_Start',
array(
'subject' => $this,
'id' => $id,
'quantity' => $quantity
)
);
Erstelle einen universellen Event-Listener für Debugging:
class DebugSubscriber implements SubscriberInterface
{
public static function getSubscribedEvents()
{
return [
'Enlight_Controller_Action_PostDispatchSecure' => 'logEvent'
];
}
public function logEvent(\Enlight_Event_EventArgs $args)
{
$eventName = $args->getName();
$controller = get_class($args->getSubject());
error_log("Event: $eventName, Controller: $controller");
}
}
Im Shopware-Backend siehst du unter dem Symfony Profiler alle gefeuerten Events einer Request. Für eine vollständige Shopware 6 Event List kannst du auch die Dokumentation konsultieren.
Events werden bei jedem Request ausgeführt. Schwere Operationen solltest du in Queues auslagern:
public function onOrderComplete(\Enlight_Event_EventArgs $args)
{
$orderId = $args->get('orderId');
// Schwere ERP-Übertragung in Queue einreihen
$this->queueService->addJob('erp_transfer', ['orderId' => $orderId]);
// Leichte Operationen sofort ausführen
$this->updateOrderStatus($orderId);
}
Events können die User Experience beeinträchtigen, wenn sie fehlschlagen:
public function onCriticalEvent(\Enlight_Event_EventArgs $args)
{
try {
$this->performCriticalOperation($args);
} catch (\Exception $e) {
// Fehler loggen, aber nicht den Shop lahmlegen
$this->logger->error('Critical operation failed', [
'exception' => $e->getMessage(),
'event' => $args->getName()
]);
// Optional: Admin benachrichtigen
$this->notifyAdmin($e);
}
}
Wenn mehrere Plugins auf dasselbe Event hören, kann die Reihenfolge wichtig sein:
<service id="my.subscriber" class="My\Subscriber">
<tag name="shopware.event_subscriber" priority="100" />
</service>
Wenn kein passendes Event existiert, kannst du Hooks verwenden. Sie sind mächtiger, aber auch fehleranfälliger. Ein Shopware Hook Example:
class BasketHook extends \Enlight_Plugin_Bootstrap
{
public function afterInit()
{
$this->subscribeEvent(
'Enlight_Bootstrap_InitResource_Modules',
'onInitResourceModules'
);
}
public function onInitResourceModules()
{
$modules = Shopware()->Modules();
$modules->addHook('sBasket', 'sGetBasket', $this);
}
public function sGetBasket($args)
{
$result = $args->getReturn();
// Warenkorb-Daten modifizieren
$result['customData'] = $this->addCustomData($result);
return $result;
}
}
Entwerfe deine Plugin-Architektur event-getrieben:
class OrderService
{
private $eventManager;
public function processOrder($orderData)
{
// Before-Event für Validierungen
$this->eventManager->notifyUntil('order.before_process', [
'orderData' => $orderData
]);
$order = $this->createOrder($orderData);
// After-Event für Integrationen
$this->eventManager->notify('order.processed', [
'order' => $order
]);
return $order;
}
}
Beim Arbeiten mit Events sind bestimmte Methoden essentiell. Die getSubscribedEvents Shopware-Methode definiert, welche Events ein Subscriber Shopware abhört. Das Shopware Add to Basket Event ist ein häufig genutztes Event für E-Commerce-Anpassungen, während das Shopware subscribeEvent in älteren Plugin-Versionen verwendet wurde.
Events sind das Fundament für saubere, erweiterbare Shopware-Lösungen. Sie ermöglichen es dir, komplexe Anpassungen zu realisieren, ohne den Core zu berühren. Beginne mit einfachen Notify Events, um Abläufe zu verstehen. Entwickle dann schrittweise komplexere Lösungen mit Filter und Collect Events.
Denke immer daran: Ein gut platziertes Event kann dir Stunden der Entwicklungszeit sparen und macht deine Lösung zukunftssicher. Shopware Events sind nicht nur ein technisches Feature – sie sind dein Schlüssel zu individuellen, professionellen E-Commerce-Lösungen, die genau das tun, was deine Kunden brauchen.
Das Event-System verwandelt Shopware von einer starren Software in eine flexible Plattform, die sich an jeden Geschäftsprozess anpassen lässt. Mit dem richtigen Verständnis der Events hast du das mächtigste Werkzeug in der Hand, um aus Shopware genau den Online-Shop zu machen, den dein Kunde sich vorstellt.