Event Anfängerfrage

Guten Tag,

ich möchte, dass wenn ich im Backend eine Bestellung speicher, mein Event gefeuert wird.

Mit “Enlight_Controller_Action_PostDispatchSecure_Backend_Order_SaveAction”

funktioniert es leider nicht, wie schreibt man das sonst ? 

MfG, Fensterscheibe

Moin @Fensterscheibe‍,

du hast hier genau zwei Möglichkeiten:

  1. Event:  Enlight_Controller_Action_PostDispatchSecure_Backend_Order
    Bei diesem Event hängst du dich erstmal generell an den Order Controller, nicht an eine spezifische Action.
    Ergo: Dein Code wird für  jede  Action ausgeführt.
    Aushilfe:

    public function deinEventListener(Enlight_Event_EventArgs $args)
    {
    /** @var Shopware_Controllers_Backend_Order $controller */
    $controller = $args->getSubject();
    $request = $controller->Request();

    if ($request->getActionName() !== 'save') {
        return;
    }
    
    // dein Code hier
    

    }

Du liest dir die gewünschte Action aus und steigst aus, sofern die Action nicht deiner saveAction entspricht.
Beachte : Der Code deines Events wird dann  nach  der originalen Action ausgeführt.

  1. Event:  Enlight_Controller_Action_Backend_Order_saveAction
    Hier entfällt das “PostDispatchSecure” im Event Namen.
    Zu beachten gilt es hier: Dein Event wird  vor  der originalen Action ausgeführt.
    Du hast darüber hinaus die Möglichkeit die anschließende Ausführung der originalen Action zu verhindern, indem du in deinem Event Listener  true zurückgibst.

Hilft dir das weiter?
Ich habe das jetzt aus dem Kopf heraus und in Eile runtergetippert, verzeih’ mir also bitte eventuelle (Tipp-)Fehler.

Gruß,
Patrick  Shopware

1 Like

@Patrick Stahl schrieb:

Moin @Fensterscheibe‍,

du hast hier genau zwei Möglichkeiten:

  1. Event:  Enlight_Controller_Action_PostDispatchSecure_Backend_Order
    Bei diesem Event hängst du dich erstmal generell an den Order Controller, nicht an eine spezifische Action.
    Ergo: Dein Code wird für  jede  Action ausgeführt.
    Aushilfe:

public function deinEventListener(Enlight_Event_EventArgs $args)
{
/** @var Shopware_Controllers_Backend_Order $controller */
$controller = $args->getSubject();
$request = $controller->Request();

if ($request->getActionName() !== ‘save’) {
return;
}

// dein Code hier
}

Du liest dir die gewünschte Action aus und steigst aus, sofern die Action nicht deiner saveAction entspricht.
Beachte : Der Code deines Events wird dann  nach  der originalen Action ausgeführt.

  1. Event:  Enlight_Controller_Action_Backend_Order_saveAction
    Hier entfällt das “PostDispatchSecure” im Event Namen.
    Zu beachten gilt es hier: Dein Event wird  vor  der originalen Action ausgeführt.
    Du hast darüber hinaus die Möglichkeit die anschließende Ausführung der originalen Action zu verhindern, indem du in deinem Event Listener  true zurückgibst.

Hilft dir das weiter?
Ich habe das jetzt aus dem Kopf heraus und in Eile runtergetippert, verzeih’ mir also bitte eventuelle (Tipp-)Fehler.

Gruß,
Patrick 

Vielen Dank für die schnelle Antwort. Die zweite Variante funktioniert aber leider nicht :

 'onBeforeSaveAction'
			];
		}	
		
		
		public function OnBeforeSaveOrder(\Enlight_Event_EventArgs $args)
		{
			mail("hans.schmiodt125.de","Hook ist aktiv","test");
			return true;
		}
}

Wissen Sie, was die einfachste Möglichkeit ist, eine Ausgabe auf dem Bildschirm zu erzeugen z.B. eine alert box ? 

Moin @Fensterscheibe‍,

dein Event Listener hat einen anderen Namen als deine tatsächliche Methode.
Dein Listener heißt  onBeforeSaveAction , deine tatsächliche Methode heißt jedoch  onBeforeSaveOrder.
Dann dürfte es auch einwandfrei laufen! :slight_smile:

Eine Alert-Box ist ja erstmal Javascript.
Du kannst schlichtweg ein Echo zusammen mit einem Exit() verbinden - dann musst du dir die Response in der Browser Entwickler-Konsole anschauen.

echo "meine Ausgabe";
exit();

Hilft dir das?

Gruß,
Patrick  Shopware

@Patrick Stahl schrieb:

Moin @Fensterscheibe‍,

dein Event Listener hat einen anderen Namen als deine tatsächliche Methode.
Dein Listener heißt  onBeforeSaveAction , deine tatsächliche Methode heißt jedoch  onBeforeSaveOrder.
Dann dürfte es auch einwandfrei laufen! :slight_smile:

Eine Alert-Box ist ja erstmal Javascript.
Du kannst schlichtweg ein Echo zusammen mit einem Exit() verbinden - dann musst du dir die Response in der Browser Entwickler-Konsole anschauen.

echo „meine Ausgabe“;
exit();

Hilft dir das?

Gruß,
Patrick  Shopware

Habe den Funktionsnamen nun angepasst, allerdings funktioniert es leider trotzdem nicht.

Den Benutzer möchte ich etwas anzeigen, also z.B. eine Box, wo steht „Fehlgeschlagen, es muss der Vorname hinterlegt werden“ 

@Patrick Stahl schrieb:

Moin @Fensterscheibe‍,

du hast hier genau zwei Möglichkeiten:

  1. Event:  Enlight_Controller_Action_PostDispatchSecure_Backend_Order
    Bei diesem Event hängst du dich erstmal generell an den Order Controller, nicht an eine spezifische Action.
    Ergo: Dein Code wird für  jede  Action ausgeführt.
    Aushilfe:

public function deinEventListener(Enlight_Event_EventArgs $args)
{
/** @var Shopware_Controllers_Backend_Order $controller */
$controller = $args->getSubject();
$request = $controller->Request();

if ($request->getActionName() !== ‘save’) {
return;
}

// dein Code hier
}

Du liest dir die gewünschte Action aus und steigst aus, sofern die Action nicht deiner saveAction entspricht.
Beachte : Der Code deines Events wird dann  nach  der originalen Action ausgeführt.

  1. Event:  Enlight_Controller_Action_Backend_Order_saveAction
    Hier entfällt das “PostDispatchSecure” im Event Namen.
    Zu beachten gilt es hier: Dein Event wird  vor  der originalen Action ausgeführt.
    Du hast darüber hinaus die Möglichkeit die anschließende Ausführung der originalen Action zu verhindern, indem du in deinem Event Listener  true zurückgibst.

Hilft dir das weiter?
Ich habe das jetzt aus dem Kopf heraus und in Eile runtergetippert, verzeih’ mir also bitte eventuelle (Tipp-)Fehler.

Gruß,
Patrick  Shopware

Die erste Möglichkeit funktioniert leider auch nicht bei mir, bei mir sieht es derzeit folgendermaßen aus :

 "test"
				];
				
			}
			
			public function test(\Enlight_Event_EventArgs $args)
			{
				exit();
			}
		
	}

 Das ist nur zum testen, er müsste es ja direkt abbrechen.