Falsche Event-Namen? Plugin-Funktionen werden nicht aufgerufen.

Hallo Zusammen,

ich wollte mein Plugin etwa verbessern. Ich verwnde jetzt diefolgenden Eregnisse:

  • Enlight_Controller_Action_PreDispatch_Frontend_Checkout
  • Enlight_Controller_Action_PostDispatch_Frontend_Checkout

Ich brauche aber dabei unter checkoutAction, paymentAction und finishAction zu unterscheiden. Ich habe meinen Code so umgeschrieben, dass ich jetzt die Eregnisse verwenden soll:

  • Enlight_Controller_Action_PreDispatch_Frontend_Checkout_Confirm
  • Enlight_Controller_Action_PreDispatch_Frontend_Checkout_Payment
  • Enlight_Controller_Action_PreDispatch_Frontend_Checkout_Finish
  • Enlight_Controller_Action_PostDispatch_Frontend_Checkout_Finish

So sieht mein Code besser aus, aber irgenwie werden meine Methoden gar nicht aufgerufen. Woran könnte das liegen?

Oder gibt es gar keine Action-Events?

  

Du musst das pre und post dispatch aus der mitte rausnehmen. Du möchtest vermutlich genau die eine Action hooken? Der Hook wird dann immer VOR der Action ausgeführt. Damit ist es quasi immer ein PreDispatch Hook.

Hallo @rreimche‍,

ich versuche hier nochmal Licht ins Dunkle zu bringen.

Du nutzt “PreDispatch”  und “PostDispatch” Events, erkenntlich an dem folgenden Teil:
Enlight_Controller_Action_ PostDispatch _Frontend_Checkout

Diese Events können nicht mit einer Action versehen werden. _Enlight_Controller_Action_PostDispatch_Frontend_Checkout_Index _ist also kein valides Event in Shopware.

Du hast jetzt zwei Möglichkeiten, um dein Vorhaben dennoch umzusetzen:

  1. Du lässt, wie von @arnebecker‍ vorgeschlagen, das “PostDispatch” bzw. “PreDispatch” im Event weg:
    In diesem Fall könntest du eine Action mit angeben und würde in deinem Fall bspw. wiefolgt aussehen:
    Enlight_Controller_Action_Frontend_Checkout_Confirm

Hierbei gilt es jedoch zwei Punkte zu beachten.
Erstens, findet dieses Event  vor  der originalen Action statt - du kannst also nicht  auf das Verhalten der originalen Action reagieren, dein Code wird ja vorher aufgerufen.
Zweitens, wenn du bei diesen Events ein “return true” ausführst, wird die originale Action  garnicht  ausgeführt - du ersetzt quasi die originale Action.
Muss man wissen & beachten!

  1. Du greifst auf den Request selbst zu, der den Action-Namen kennt.
    In diesem Beispiel nutzt du also weiterhin die PostDispatch / PreDispatch Events, jedoch, wie erwähnt, ohne Action im Event Namen!
    Enlight_Controller_Action_PreDispatch_Frontend_Checkout

Nun kannst du in dem Event Listener den Controller auslesen und über diesen Controller dann auf das Request Objekt zugreifen.
Das Request Objekt kennt die aufgerufene Action, sodass du darauf reagieren kannst.
Viel Text, hier mal ein Beispiel:

 

public function onPreDispatchCheckout(\Enlight_Controller_ActionEventArgs $args)
{
    /* @var \Enlight_Controller_Action $subject */
    $controller = $args->getSubject();

    if ($controller->Request()->getActionName() === 'confirm') {
        // Tue Dinge, wenn die Action "confirmAction" war
    }
}

Übrigens:
Bei den PostDispatch Events gibt es noch  PostDispatchSecure Events - diese sind noch etwas sicherer und werden sicher nur ausgeführt, wenn kein Fehler aufgetreten ist und ein Template existiert.

Helfen dir diese Informationen weiter?

Gruß,
Patrick  Shopware

4 „Gefällt mir“

How to get the customer shipping & billing address details in onPreDispatchCheckout() function ? 

 

You can either use the session or get the data from the view in post dispatch.

Kind regards
https://www.digitvision.de/

@EikeWarneke schrieb:

You can either use the session or get the data from the view in post dispatch.

Kind regards
https://www.digitvision.de/

Review my code. 

I have implemented country code and code validation in custom code. How to get the order confirmation page customer billing & shipping addrers details. Please review my below code.

public static function getSubscribedEvents ()  
    {  
        return array (  
            ‚Enlight_Controller_Action_PreDispatch_Frontend_Checkout‘ => ‚onFrontendPreDispatchCheckout‘,  
        ); 
    }

 

public function onFrontendPreDispatchCheckout (\ Enlight_Controller_ActionEventArgs $ args)  
 {  
           
               $ subject = $ args-> getSubject (); 
           
               
            $ request = $ subject-> Request (); 
            $ response = $ subject-> Response (); 
            $ action = $ request-> getActionName (); 
            $ view = $ subject-> View (); 
            
             //// How to get user data & user address here. 
            
            if (! $ Request-> isDispatched () || $ response-> isException () ||   
            // only in case action is payment or confirm it should be chcek it  
            ($ action! = ‚payment‘ && $ action! = ’ confirm ') ||  
            ! $ view-> 

            }

   }

 

Please let me know how to get customer order billing & shipping details.

 

As @EikeWarneke‍ stated above. 

No one will review your code if you command that in this forum. Please use the code element for further code postings (4th button in this texteditor i am writing at the moment).

As seen in your code above you already have the view object obtained. Just compare with the *tpl file the correspondend structure and naming if you prefer the second way from @EikeWarneke‍ 's solutions. For the other one, just drop the session in a frontend file to look at the data for the right choice.

@BestShopPossible schrieb:

As @EikeWarneke stated above. 

No one will review your code if you command that in this forum. Please use the code element for further code postings (4th button in this text editor i am writing at the moment).

As seen in your code above you have already received the view object obtained. Just compare with the * tpl file the corresponding structure and naming if you prefer the second way from @EikeWarneke 's solutions. For the other one, just drop the session in a frontend file to look at the data for the right choice.

 

Please review source code file url 

https://files.fm/u/cpupendv

 

Im going to quote BestShopPossible on this:
no one will review your code

Please have a look at the developer documentation and ask specific questions.

Kind regards
https://www.digitvision.de/