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.
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
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
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
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
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
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
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