Action des CheckoutControllers erweitern

Hallo, ich würde gerne die paymentAction des CheckoutControllers dahingehend erweitern, dass nach Ausführung dieser Action eigener Code ausgeführt wird. Ist das mit dem Event/Hooksystem von Shopware machbar? Dabei soll nach der paymentAction ein Api-Aufruf an ein externes System und im Fehlerfall ein Forward z.B. auf den Warenkorb gemacht werden. Ich habe es schon mittels folgendem Code versucht: $event = $this->createEvent( ‚Enlight_Controller_Dispatcher_ControllerPath_Frontend_Checkout‘, ‚myEventHandler‘); $this->subscribeEvent($event); Allerdings wird hier der Code meines Eventhandlers schon VOR der paymentAction ausgeführt. Darüberhinaus habe ich auch keinen Weg gefunden, auf den Controller zuzugreifen und im Fehlerfall das entsprechende ‚forward‘ auszuführen. Ich habe den Code schon testweise ans Ende der Methode paymentAction eingefügt und es funktioniert so, wie ich mir das vorgestellt habe. Jetzt stellt sich mir die Frage, wir ich das ganze ohne Überschreiben des Basiscodes realisieren kann. Gruß Jan

Hi, also ich würde da ehr ein Hook erstellen statt eines Events… Am besten schaust du dir mal das Bsp. an (http://www.shopware.de/wiki/Beispiel-Pl … em_ablegen)… Viele Grüße Thomas

Das Ganze würde dann so aussehen: $event = $this->createHook( ‘Enlight_Controller_Dispatcher_ControllerPath_Frontend_Checkout’, ‘paymentAction’, ‘myPaymentAction’, Enlight_Hook_HookHandler::TypeAfter, 0 ); $this->subscribeHook($event); Musst dann noch entsprechend die Methode myPaymentAction erstellen. Durch den Typ TypeAfter wird die Methode danach ausgeführt.:wink:

Hi, bitte dafür keinen Hook missbrauchen. Das geht auch mit einem Event. :wink: Im MVC-Konzept gibt es dafür eine PreDispatch-Methode. In Shopware gibt es dafür zusätzlich auch ein Event. Diesen gibt es in 2 Ausführungen. 1. “Enlight_Controller_Action_PreDispatch” wird vor jeder Action ausgeführt. 2. “Enlight_Controller_Action_PreDispatch_#Module#_#Controller#” wird nur vor Actions des angegebenen Module+Controller ausgeführt. In diesem Fall solltest du die 2. Ausführung verwenden: <?php $event = $this->createEvent( 'Enlight\_Controller\_Action\_PreDispatch\_Frontend\_Checkout', 'onPreDispatch' ); $this-\>subscribeEvent($event); public static function onPreDispatch(Enlight\_Event\_EventArgs $args) { $request = $args-\>getSubject()-\>Request(); if($request-\>getActionName()!='payment') { // Nur bei der Payment-Action return; } if(true) { // Bei einem Fehler return $args-\>getSubject()-\>forward('confirm'); // Zur Bestätigungs-Seite weiterleiten } } Viele Grüße Heiner