Hallo zusammen, ich versuche in einem Plugin die Forward-Methode der gehookten Klasse zu verwenden. Dies funktioniert aber nicht wie erwartet. Im konkreten Fall möchte ich den Abschluß einer Bestellung verhindern und stattdessen auf die vorgelagerte Action (confirm) weiterleiten. Keines der unten aufgeführten Beispiele funktioniert. Die Bestellung wird trotzdem abgeschlossen. Die Weiterleitung scheint erst danach ausgeführt zu werden. Ich kann das Problem natürlich mit PHP-Bordmitteln umgehen (ein Redirect wäre auch eine Lösung), trotzdem stellen sich folgende Fragen: Mache ich was falsch? Ist das ein Bug? Gibt es eine funktionierende Lösung? class Shopware\_Plugins\_Frontend\_MyPlugin\_Bootstrap extends Shopware\_Components\_Plugin\_Bootstrap { public function install() { // Checkout $this-\>subscribeEvent( 'Shopware\_Controllers\_Frontend\_Checkout::finishAction::before', 'beforeFinishAction' ); return true; } public function beforeFinishAction(Enlight\_Event\_EventArgs $args) { // geht nicht: $args-\>getSubject()-\>forward('confirm'); // geht nicht: return($args-\>getSubject()-\>forward('confirm')); // geht auch nicht: $args-\>setReturn($args-\>getSubject()-\>forward('confirm')); } // ... }
Gruß, Boris
Hey Boris, dein Code müsste eigentlich funktionieren. Bist du dir sicher, dass deine beforeFinishAction überhaupt aufgerufen wird?
Ja, absolut, das habe ich geprüft.
Hmm, probier doch mal ob das hier bei dir funktioniert: public function install() { $this-\>subscribeEvent( 'Shopware\_Controllers\_Frontend\_Checkout::confirmAction::before', 'beforeFinishAction' ); return true; } public function beforeFinishAction(Enlight\_Event\_EventArgs $args) { $args-\>getSubject()-\>forward('cart'); }
Hallo Philipp, da macht keinen Unterschied, das hier funktioniert ist aber ein unschöner Workaround: EDIT: funktioniert doch nicht, bzw. wird der redirect auch hier erst nach der finish action ausgeführt. class Shopware\_Plugins\_Frontend\_MyPlugin\_Bootstrap extends Shopware\_Components\_Plugin\_Bootstrap { public function install() { // Checkout $this-\>subscribeEvent( 'Shopware\_Controllers\_Frontend\_Checkout::finishAction::before', 'beforeFinishAction' ); return true; } public function beforeFinishAction(Enlight\_Event\_EventArgs $args) { // geht $args-\>getSubject()-\>redirect('checkout'); } // ... }
Gruß Boris
Hey Boris, wieso macht das keinen Unterschied? , es kann doch gut sein das einen die confirmAction zur finishAction weiterleitet, sofern der User bestimmte Bedingungen(Cookies, Referrer etc.) erfüllt. Ein Shopware Forward wird darüber hinaus serverseitig realisiert, wodurch auch die URL gleichbleibt.
Hallo Phillipp, [quote=“pwoerdehoff”] wieso macht das keinen Unterschied?[/quote] Soll heißen: funktioniert auch nicht. [quote=“pwoerdehoff”] es kann doch gut sein das einen die confirmAction zur finishAction weiterleitet, sofern der User bestimmte Bedingungen(Cookies, Referrer etc.) erfüllt.[/quote] Theoretisch ja, praktisch nein. Im dem mir vorliegendem Quelltext ist das nicht der Fall (class Shopware_Controllers_Frontend_Checkout). Ich vermute mal, da hast Du noch nicht reingeschaut. [quote=“pwoerdehoff”] Ein Shopware Forward wird darüber hinaus serverseitig realisiert, wodurch auch die URL gleichbleibt. [/quote] Ja, deshalb wäre ein forward auch eleganter. Gruß, Boris
Hmm okay, wirklich sehr komisch, da ich das von mir aufgeführte Beispiel selber ohne Probleme in einem meiner Plugins verwende…