# Methode Shopware\_Controllers\_Widgets\_Listing erweitern

**URL:** <https://forum.shopware.com/t/methode-shopware-controllers-widgets-listing-erweitern/21566>\
**Category:** Shopware 3.5\
**Tags:** programming\
**Created:** [26. Juli 2014 um 16:48 UTC](https://forum.shopware.com/t/methode-shopware-controllers-widgets-listing-erweitern/21566 "2014-07-26T16:48:30Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![thomastr](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/thomastr/32/24315_2.png) [@thomastr](https://forum.shopware.com/u/thomastr)\
**Post date:** [26. Juli 2014 um 16:48 UTC](https://forum.shopware.com/t/methode-shopware-controllers-widgets-listing-erweitern/21566/1 "2014-07-26T16:48:30Z")

</div>

Hallo zusammen, ich suche eine Möglichkeit, die Methode Shopware\_Controllers\_Widgets\_Listing zu erweitern / zu überschreiben, um eine klene Änderung möglichst updatesicher unter zu bringen. Ich befürchte ich habe immer noch nicht ganz verstanden wie das Event-System funktioniert, bzw. wie ich den passenden Event herausfinde, um diese Methode zu überschreiben. Im Kern benötige ich die Kundengruppe in den Templates. Das funktioniert auch schon soweit bis auf das Topseller Widget. Dort steht mir die Variable nicht zur Verfügung. Ich habe bereits erfolgreich die Methode topSellerAction in der Klasse Shopware\_Controllers\_Widgets\_Listing modifiziert um das gewünschte zu erreichen: $this-\>View()-\>assign(“sCustomerUserGroup”,Shopware()-\>System()-\>sUSERGROUP); Nun würde ich das ganze gerne Updatesicher unterbringen. Bisher habe ich folgende Events versucht: Enlight\_Controller\_Action\_Widgets\_Listing\_TopSeller, bzw. als Hook Shopware\_Controllers\_Widgets\_Listing::topSellerAction::after Beides jedoch ohne Erfolg.

---

<div class="post-metadata">

**Author:** ![DanielNogel](https://avatars.discourse-cdn.com/v4/letter/d/96bed5/32.png) [@DanielNogel](https://forum.shopware.com/u/DanielNogel)\
**Post date:** [26. Juli 2014 um 17:46 UTC](https://forum.shopware.com/t/methode-shopware-controllers-widgets-listing-erweitern/21566/2 "2014-07-26T17:46:26Z")

</div>

Hi, du brauchst ein Post-Dispatch Event für den genannten Controller. Bitte zeig eben den Code, den du hast, dann sehen wir, wo das Problem liegt. lG Daniel

---

<div class="post-metadata">

**Author:** ![thomastr](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/thomastr/32/24315_2.png) [@thomastr](https://forum.shopware.com/u/thomastr)\
**Post date:** [26. Juli 2014 um 18:50 UTC](https://forum.shopware.com/t/methode-shopware-controllers-widgets-listing-erweitern/21566/3 "2014-07-26T18:50:44Z")

</div>

Hi Daniel, danke für deine Antwort zu später Stunde. Ich habe es jetzt geschafft, die Methode erfolgreich zu hooken. Mein Hauptproblem war, dass ich durch das häufige Plugin neuinstallieren vergessen hatte, es auch zu aktivieren. Mein Code sieht jetzt so aus: ` $this-\>subscribeEvent('Shopware\_Controllers\_Widgets\_Listing::topSellerAction::after', 'afterTopSellerAction'); public function afterTopSellerAction(Enlight\_Hook\_HookArgs $arguments) { $arguments-\>getSubject()-\>View()-\>assign("sCustomerUserGroup",Shopware()-\>System()-\>sUSERGROUP); } ` Den Rest habe ich mit folgendem Code abgedeckt: ` $this-\>subscribeEvent('Enlight\_Controller\_Action\_PostDispatchSecure\_Frontend','onPostDispatchFrontend'); public function onPostDispatchFrontend(Enlight\_Event\_EventArgs $args) { $controller = $args-\>getSubject(); $request = $controller-\>Request(); $response = $controller-\>Response(); $view = $controller-\>View(); if(!$request-\>isDispatched() || $response-\>isException() || !$view-\>hasTemplate()) { return; } $CustomerUserGroup = Shopware()-\>Session()-\>sUserGroup; $args-\>getSubject()-\>View()-\>assign("sCustomerUserGroup",$CustomerUserGroup); } ` Der Griff nur im Widget nicht. Gibt es einen „besseren“ Weg? Viele Grüße Thomas

---

<div class="post-metadata">

**Author:** ![DanielNogel](https://avatars.discourse-cdn.com/v4/letter/d/96bed5/32.png) [@DanielNogel](https://forum.shopware.com/u/DanielNogel)\
**Post date:** [26. Juli 2014 um 19:04 UTC](https://forum.shopware.com/t/methode-shopware-controllers-widgets-listing-erweitern/21566/4 "2014-07-26T19:04:23Z")

</div>

Hi Thomas, bei PostDispatchSecure-Events brauchst du diese Checks nicht: `if(!$request-\>isDispatched() || $response-\>isException() || !$view-\>hasTemplate()) { return; }` Das Event wird eh nur geworfen, wenn es dispatched ist und keine Exception aufgetreten ist. Das Event greift übrigens nicht, weil du ja im Widget Modul bist, nicht im Frontend-Modul. Du hast aber das PostDispatch nur für Frontend registriert. Du kannst also entweder ein zusätzliches Event für Enlight\_Controller\_Action\_PostDispatchSecure\_Widgets registrieren oder global Enlight\_Controller\_Action\_PostDispatchSecure registrieren und dann im Event-Callback checken, ob du im Frontend- oder Widget-Modul bist. lG Daniel

---

<div class="post-metadata">

**Author:** ![thomastr](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/thomastr/32/24315_2.png) [@thomastr](https://forum.shopware.com/u/thomastr)\
**Post date:** [27. Juli 2014 um 12:16 UTC](https://forum.shopware.com/t/methode-shopware-controllers-widgets-listing-erweitern/21566/5 "2014-07-27T12:16:53Z")

</div>

Hi Daniel, danke für die Klarstellung, funktioniert nun so im Frontend und auch im Widget: ` $this-\>subscribeEvent('Enlight\_Controller\_Action\_PostDispatchSecure','onPostDispatchSecure'); public function onPostDispatchSecure(Enlight\_Event\_EventArgs $args) { $args-\>getSubject()-\>View()-\>assign( "sCustomerUserGroup", $CustomerUserGroup = Shopware()-\>Session()-\>sUserGroup ); } ` Grüße Thomas

---

<div class="post-metadata">

**Author:** ![thomastr](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/thomastr/32/24315_2.png) [@thomastr](https://forum.shopware.com/u/thomastr)\
**Post date:** [27. Juli 2014 um 14:11 UTC](https://forum.shopware.com/t/methode-shopware-controllers-widgets-listing-erweitern/21566/6 "2014-07-27T14:11:08Z")

</div>

Kommando zurück: Enlight\_Controller\_Action\_PostDispatchSecure scheint bei einem Widget nicht gefeuert zu werden, und noch schlimmer: wirft einen Fehler im Backend direkt beim laden, da es dort auch aufgerufen wird und dort Shopware() wohl nicht zur verfügung steht. Ich habe auch noch Enlight\_Controller\_Action\_PostDispatch\_Widget und Enlight\_Controller\_Action\_PostDispatchSecure\_Widget getestet. Scheinen beide bei dem Topseller Widget nicht zu funktionieren. Zumindestens hat ein die() in der aufgerufenen Methode keinerlei Auswirkung. Grüße Thomas

---

<div class="post-metadata">

**Author:** ![DanielNogel](https://avatars.discourse-cdn.com/v4/letter/d/96bed5/32.png) [@DanielNogel](https://forum.shopware.com/u/DanielNogel)\
**Post date:** [27. Juli 2014 um 14:16 UTC](https://forum.shopware.com/t/methode-shopware-controllers-widgets-listing-erweitern/21566/7 "2014-07-27T14:16:26Z")

</div>

Hi, das globale PostDispatch-Event wird auch im Backend geworfen, da musst du natürlich sicher stellen, dass es keine Aufrufe gibt, die im Backend nicht zur Verfügung stehen - sowas wie Shopware()-\>Shop(). Ansonsten musst du mit einem Check auf das Modul ausschließen, dass dein Code auch im Backend ausgeführt wird. Das Shopware-Singleton (“Shopware()”) ist aber auch im Backend verfügbar, das benutzen wir da selbst an einigen Stellen. Die beiden von dir genannten Events enden auf “Widget” (Singular). Da könnte der Fehler liegen, es mus “Widgets” heißen, wenn ich das gerade richtig im Kopf habe. Greift der globale PostDispatch (ohne Secure) auch nicht für die Widgets? lG Daniel

---

<div class="post-metadata">

**Author:** ![thomastr](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/thomastr/32/24315_2.png) [@thomastr](https://forum.shopware.com/u/thomastr)\
**Post date:** [28. Juli 2014 um 17:05 UTC](https://forum.shopware.com/t/methode-shopware-controllers-widgets-listing-erweitern/21566/8 "2014-07-28T17:05:04Z")

</div>

Hmmm, Widgets wollte bei mir auch nicht so richtig. Ich habe es dann durch gezieltes Hooken der Methoden geschafft, die Variable an alle Stellen zu bringen. Ist jetzt aber auch nicht das Problem, da ich festgestellt habe, dass der Artikelslider der Einkaufswelt wohl ein sehr aggresives Cachingverhalten aufweist. Konkret geht es darum, das für eine bestimmte Marke für normale Shopkunden keine Preise und kein Warenkorb-Button erscheinen dürfen. Ich wäre jetzt soweit durch, nur beim Template slide-articles.tpl klappt es nur, wenn ich jedesmal den Shopcache lösche. Ich bin gerade dabei das Plugin Business Essentials zu testen, da sich die extra Registrierung mit Freischaltung für bestimmte Kundengruppen dafür anbieten würde. Aber auch diese Variable ändert sich nach erfolgtem Einloggen in diesem Template nicht. Gibt es hier evtl. einen Trick? Grüße Thomas
