Welches Event für meinen Anwendungszweck?

Hallo zusammen, ich suche das richtige Event, um per GET-Parameter den Subshop zu ändern. Mein momentanes Plugin funktioniert zwar schon tadellos, indem es in einem Event-Listener per Shopware()->Shop()->setShop($shopID) die entsprechende Einstellung trifft. Das Problem ist nur, dass bei Verwendung von z. B. Enlight_Controller_Action_PreDispatch die Kategorie-Pfade nicht mehr adäquat aufgelöst werden können. Ziel der Übung ist es, das http://shop.de/englishCategory/?L=en bzw. http://shop.de/deutscheKategorie/?L=de nicht erst nach einem reload die korrekten Ergebnisse liefern. Was mir fehlt, ist eine Dokumentation der Auslöse-Zeitpunkte der verschiedenen Events. Momentan kann ich nur raten, wann und ob welches Event ausgelöst wird. Die unten stehende Liste an Events gibt es wohl - aber eben unkommentiert. Ich bräuchte ein Event, bei zwar die Modulkonfigurationen (z. B . Shopware()->Plugins()->Frontend()->ShopChooser()->Config()) schon auszulesen sind, aber die Änderung des Subshops noch Auswirkungen auf das Listing hat. Kann mir da jemand weiterhelfen? Shopware()->Events()->getEvents() array(32) { [0]=> string(36) „Enlight_Bootstrap_InitResource_Adodb“ [1]=> string(34) „Enlight_Bootstrap_InitResource_Api“ [2]=> string(35) „Enlight_Bootstrap_InitResource_Auth“ [3]=> string(35) „Enlight_Bootstrap_InitResource_Cron“ [4]=> string(38) „Enlight_Bootstrap_InitResource_License“ [5]=> string(35) „Enlight_Bootstrap_InitResource_Menu“ [6]=> string(38) „Enlight_Bootstrap_InitResource_Modules“ [7]=> string(35) „Enlight_Bootstrap_InitResource_Shop“ [8]=> string(37) „Enlight_Bootstrap_InitResource_System“ [9]=> string(39) „Enlight_Bootstrap_InitResource_Template“ [10]=> string(38) „Enlight_Controller_Action_PostDispatch“ [11]=> string(37) „Enlight_Controller_Action_PreDispatch“ [12]=> string(57) „Enlight_Controller_Dispatcher_ControllerPath_Backend_Cron“ [13]=> string(42) „Enlight_Controller_Front_AfterSendResponse“ [14]=> string(45) „Enlight_Controller_Front_DispatchLoopShutdown“ [15]=> string(36) „Enlight_Controller_Front_PreDispatch“ [16]=> string(38) „Enlight_Controller_Front_RouteShutdown“ [17]=> string(37) „Enlight_Controller_Front_RouteStartup“ [18]=> string(38) „Enlight_Controller_Front_StartDispatch“ [19]=> string(34) „Enlight_Controller_Router_Assemble“ [20]=> string(46) „Enlight_Controller_Router_FilterAssembleParams“ [21]=> string(35) „Enlight_Controller_Router_FilterUrl“ [22]=> string(41) „Enlight_Plugins_ViewRenderer_FilterRender“ [23]=> string(31) „Shopware_CronJob_ArticleComment“ [24]=> string(29) „Shopware_CronJob_ArticleStock“ [25]=> string(25) „Shopware_CronJob_Birthday“ [26]=> string(37) „Enlight_Controller_Front_PostDispatch“ [27]=> string(44) „Enlight_Controller_Front_DispatchLoopStartup“ [28]=> string(30) „Enlight_Controller_Action_Init“ [29]=> string(37) „Enlight_Controller_Front_SendResponse“ [30]=> string(40) „Enlight_Bootstrap_InitResource_SessionID“//keine Rkt [31]=> string(31) „Enlight_Controller_Router_Route“ }

Moin, das modifizieren des Shops musst du eigentlich wie folgt durchführen: $shop = Shopware()-\>Shop(); $shop-\>setShop($ID); $shop-\>registerResources(Shopware()-\>Bootstrap()); Dann müsste es passen, bzw. was funktioniert denn konkret aktuell nicht? Schreibt er die falschen URLs in das Frontend? Ansonsten wird es in den nächsten Tagen eine komplette Event-Dokumentation geben…

Und du solltest einen Event nehmen, der vor dem Routing ausgeführt wird - also z.B. Enlight_Controller_Front_RouteStartup

1 Like

[quote=“Stefan Hamann”]Und du solltest einen Event nehmen, der vor dem Routing ausgeführt wird - also z.B. Enlight_Controller_Front_RouteStartup[/quote] Das ist genau der Punkt wo ich noch etwas schwimme… Es wäre sicher hilfreich, wenn der Event-Ablauf beim Aufruf des Shops etwas beschrieben würde: In welcher Reihenfolge geschehen welche Events? Welche Events sind wofür verantwortlich? usw.

Hi, eine kleine Liste von Events hatte ich hier schon gepostet: viewtopic.php?f=41&t=669&p=3613&hilit=events#p3613 Ein Wiki-Artikel dazu wird aber sicher noch kommen. Viele Grüße Heiner

1 Like

Vielen Dank für die Antworten, ich habe es nun mit Enlight_Controller_Front_RouteStartup versucht. Das resultiert allerdings in ‘Method “Shopware::Shop” not found failure’ - wohl weil beim Aufruf von Shopware()->Shop() das Shop-Model noch nicht initialisiert ist - gibt es denn dann überhaupt ein Event, dass zwar nach der Initialisierung des Shop-Modells aber vor dem Routing verwendet wird?

Hi, ein solches Event gibt es nicht. Das System muss ja erst wissen wo es hingeht, bevor es was ausführen kann. Das sollte aber nicht das Problem sein. Der Shop kann ja auch nach dem Routing geändert werden. In Shopware findet z.B. der Shop-Wechsel so statt: $event = $this-\>createEvent( 'Enlight\_Controller\_Front\_PreDispatch', 'onPreDispatch', -50 ); public static function onPreDispatch(Enlight\_Event\_EventArgs $args) { $request = $args-\>getSubject()-\>Request(); if($request-\>getModuleName()&&$request-\>getModuleName()!='frontend'){ return; } $response = $args-\>getSubject()-\>Response(); if($response-\>isException()) { return; } $shop = Shopware()-\>Shop(); if($request-\>getPost('sLanguage')!==null) { $shop-\>setShop($request-\>getPost('sLanguage')); $shop-\>setHost($request-\>getHttpHost()); } } Viele Grüße Heiner