Bisher haben wir in den ersten Schritten unsere Events direkt in der Plugin Basisklasse angelegt. Das ist für den Anfang sicherlich ausreichend. Das wird aber sehr schnell unübersichtlich, daher werde ich hier kurz den Web über Subscriber aufzeigen.
Struktur
Zuerst benötigen wir den Ordner Resources in unserem Plugin
/custom/plugins/MiHoDetailPageExtension/Resources
dort erstellen wir die Datei services.xml
touch services.xml
Die Grundstruktur sieht wie folgt aus:
<?xml version="1.0" encoding="utf-8"?> <container xmlns="http://symfony.com/schema/dic/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"> <services> <service id="mi_ho_detail_page_extension.subscriber.frontend" class="MiHoDetailPageExtension\Subscribers\Frontend"> <tag name="shopware.event_subscriber" /> </service> </services> </container>
Die beiden Attribute id und class im Knoten service geben den Service Namen an.
Danach legen wir die Subscriber im Ordner Subscribers ab:
In diese können wir nun unsere simple Logik packen:
<?php namespace MiHoDetailPageExtension\Subscribers; use Enlight\Event\SubscriberInterface; class Frontend implements SubscriberInterface { public static function getSubscribedEvents() { return [ 'Enlight_Controller_Action_PostDispatch_Frontend_Detail' => 'onFrontendDetail' ]; } public function onFrontendDetail(\Enlight_Event_EventArgs $arguments){ $view = $arguments->get('subject')->View(); $container = Shopware()->Container(); /** @var \Doctrine\DBAL\Connection $qb */ $qb = $container->get('dbal_connection')->createQueryBuilder(); $qb->select('name') ->from('s_articles') ->where('s_articles.id = :id') ->setParameter('id', 5); $single = $qb->execute()->fetch(); $view->assign('mein_produkt', $single); } }
Wir nutzen hier weiterhin unsere getSubscribedEvents() Methode. Wichtig dabei ist, dass Ihr Enlight\Event\SubscriberInterface; einbindet und eure exakt so in der services.xml eintragt.
Das war es auch schon – nun könnt Ihr je nach Bedarf noch Subscriber für Backend, Search Bundle o.ä. anlegen.