Hallo Zusammen,
Ich habe so eine Eregnis-Anmeldung:
public static function getSubscribedEvents()
{
return [
'Enlight_Controller_Action_PreDispatch_Frontend_Checkout' => 'onPreDispatchCheckout',
...
In onPreDispatchChckout() erledige ich einige Sachen. Unter anderem übermittle ich eine Anfrage an einen Server von einem Lieferanten und wenn die Anfrage scheitert oder ein Fehlercode zurückkommt, breche ich den Checkout-Prozess ab:
/**
* @param \Enlight_Event_EventArgs $args
*/
public function onPreDispatchCheckout(\Enlight_Event_EventArgs $args)
{
/** @var \Shopware_Controllers_Frontend_Checkout $controller */
$controller = $args->get('subject');
// DAS IST HIER NOCH NICHT SEHR RELEVANT
// as we only want to change the finishAction, check for it here
// but if it is confirmAction and we've been forwarded here from finishAction
// and during finishAction a session variable orderIsFulfillable == false was set,
// we should assign a template variable orderIsFulfillable to display error to user
// saying that we cannot take the order, because it is unfulfillable.
if ($controller->Request()->getActionName() === 'confirm') {
$sessionNamespace = $this->container->get('session');
$orderIsFulfillable = $sessionNamespace->get('orderIsFulfillable');
if(isset($orderIsFulfillable) && $orderIsFulfillable === false){
$controller->View()->assign('orderIsFulfillable', false);
$sessionNamespace->offsetSet('orderIsFulfillable', null); // reset this variable for not showing the error next time to user
}
return;
}
if ($controller->Request()->getActionName() !== 'finish') {
return;
}
// DAS WICHTIGSTE IST AB HIER
// $this->prepareOrderData() (unter anderem) kommuniziert mit dem externen Server
// und zuweist $orderVariables['orderIsFulfillable'] true/false
$orderVariables = $this->prepareOrderData();
if ($orderVariables['orderIsFulfillable'] !== true) {
return $controller->forward('confirm');
}
// AUCH UNRELEVANT
// reset this session variable to not show the error to the user on the next confirmAction
// I think this is only needed during development, because in production we don't get false
// for this session AND true for $orderVariables['orderIsFulfillable'].
// Anyway this won't harm here, I guess.
$this->container->get('session')->offsetSet('orderIsFulfillable', null);
// WEITER SOLL DIE ZAHLUNG ABGEWICKELT WERDEN UND DIE BESTELLUNG GESPEICHERT
// everything is ok, let
// Shopware do its order stuff
}
Nach meinem Plan (und so funktioniert das bei Nachmahme als Zahlungsart) soll wenn $orderVariables[‘orderIsFulfillable’] !== true weder Zahlungsvorgang noch die Speicherung der Bestellung stattfinden. Leider wenn ich PayPal oder Sofort als Zahlungsart auswähle, startet der Zahlungsvorgang und die Bestellung wird auch gespeichert. Am Ende des Zahlungsvorgangs befinde ich mich auf /checkout/finish/sUniqueID/[hier folgt eine Zeichenkette] und sehe einen Fehler “Sie haben keine Artikel im Warenkorb” und kann in Backend die Bestellung finden.
Es erfolgt also kein $controller->forward(‘confirm’), was bedeutet auch, dass $orderVariables[‘orderIsFulfillable’] == true, aber das ist nicht möglich, weil ich hardcoded habe, dass $orderVariables[‘orderIsFulfillable’] == false. Auch ist es merkwurdig, dass wenn Zahlungsvorgang erfolgreich abgeschlossen wäre und $orderVariables[‘orderIsFulfillable’] == true wäre, dann müsste ich auf die Nachricht weitergeleitet werden, dass die Bestellung stattgefunden ist und nicht dass “keine Artikel im Warenkorb”.
Ich denke, dass die Zahlungsplugins irgendwie mit meinem Plugin schlecht zusammen spielen im Sinne, dass sie sich vllt. für dieselben Ereignisse anmelden und nach Erfolg irgendwas tun, was dann die Funktion von meinem Plugin irgendwie beinträchtigt (eine Weiter/Umleitung?). Was könnte es sein bzw. wie könnte ich es beseitigen?