Hallo,
nachdem der Benutzer sich endgültig für das Kaufen entschieden hat und “Zahlungspflichtig bestellen” gedruckt hat, möchte ich prüfen, ob die Bestellung wirklich erfüllbar ist. Das möchte ich vor der Zahlung und möglichst vor der Speicherung der Bestellung vornehmen. Ich habe das buch Shopware (teilweise) gelesen und den Profiler installiert. Profiler liefert ein Unmenge von Ereignissen, von der ich diefolgenden als sinvolle gesehen habe:
- Enlight_Controller_Action_PreDispatch_Frontend_Checkout
- Enlight_Controller_Action_Frontend_Checkout_Finish
- Shopware_Modules_Order_SaveOrder_
Ich bin aber nicht sicher, ob die wirklich passen… erstens möchte ich das gedachte VOR der Zahlung erledigen und zweitens, wenn die Prüfung fehlschlagt, möchte ich den Vorgang komplett abbrechen und eine Fehlermeldung dem Benutzer zeigen. Dafür scheint mir dieser Hook sinvoll zu sein: “Shopware_Controllers_Frontend_Checkout::finishAction::before”. Aber ich kann nicht finden, wie ich nach meinem Code gerade zu View gelingen kann, ohne dass Checkout.finishAction() selbst ausgeführt werden. Ich könnte “::replace” anstatt “::before” nutzen, um die ganze Methode zu überschreiben, aber davon wird im Buch aus mehreren Gründen abgeraten.
Wie erledige ich am besten das gedachte?
Danke im Vorab!
Ich habe inzwischen so einen Gedanken. Ich kann das Ereignis “Shopware_Modules_Order_SendMail_Send” verwenden. Dieses, nach meinem Verständnis passiert schon nach Speicherung von der Bestellung sowie nach dem Bezahlvorgang. Hier kann ich:
- Die Bestellung stornieren
- View-Variablen entsprechend ändern, sodass fehlermeldung angezeigt wird
- Eine Meldung dem Shop-Betreiber schicken, dass er für diese Bestellung das Geld zurück schicken muss
Kann das letzte irgendwie automatisch erfolgen?
Hi @rreimche
public static function getSubscribedEvents()
{
return [
'Enlight_Controller_Action_PreDispatch_Frontend_Checkout' => 'onPreDispatchCheckout',
];
}
/**
* @param \Enlight_Event_EventArgs $args
*/
public function onPreDispatchCheckout(\Enlight_Event_EventArgs $args)
{
/** @var \Shopware_Controllers_Frontend_Checkout $controller */
$controller = $args->get('subject');
// as we only want to change the finishAction, check for it here
if ($controller->Request()->getActionName() !== 'finish') {
return;
}
$orderVariables = $this->container->get('session')->get('sOrderVariables');
if ($orderVariables /* check here if order is valid*/) {
// if not valid, return to confirm page
return $controller->forward('confirm');
}
// everything is ok, Shopware does its order stuff
}
Dies sollte ein Ansatz sein, der dich zum Ziel führen könnte. Ist jetzt aus dem Kopf runter geschrieben und ungetestet. Vor dem Forward kannst du noch versuchen, etwas ans Template zu assignen, um eben deine Fehlermeldung anzuzeigen.
Viele Grüße aus Schöppingen
Michael Telgmann
1 „Gefällt mir“
@Michael Telgmann, danke, das sieht funktionierend aus, aber ich habe bei diesem Vorgehen so ein Problem… In $orderVariables kann ich leider keine nützliche Daten finden. Hier ein Copypaste aus xdebug:
$orderVariables = {ArrayObject} [1]
storage = {array} [22]
! can not get property
Ein Screenshot kann hier gefunden werden.
Was bedeutet das und wie kann das beseitigt werden?
Hallo @rreimche
$orderVariables ist in dem Fall ein ArrayObject. Wenn du dir das mal mit einem print_r oder so was ausgeben lässt, siehst du auch, dass das befüllt ist. Du kannst dann ganz normal mit Array-Syntax auf den Inhalt zugreifen: $orderVariables[‘sBasket’] oder $orderVariables[‘sUserData’] , etc.
Viele Grüße aus Schöppingen
Michael Telgmann
1 „Gefällt mir“
Danke, [@Michael Telgmann](http://forum.shopware.com/profile/17553/Michael Telgmann „Michael Telgmann“), das wissen hat geholfen. Aber ich habe eine Kopie des Array erzeugt, um einfacher die Inhalte zu sehen:
$orderVariables = $this->container->get('session')->get('sOrderVariables')->getArrayCopy();