# Bearbeitung der Bestellung gerade nach dem Drucken von "Jetzt Kaufen"

**URL:** <https://forum.shopware.com/t/bearbeitung-der-bestellung-gerade-nach-dem-drucken-von-jetzt-kaufen/47924>\
**Category:** Programmierung\
**Created:** [30. August 2017 um 09:28 UTC](https://forum.shopware.com/t/bearbeitung-der-bestellung-gerade-nach-dem-drucken-von-jetzt-kaufen/47924 "2017-08-30T09:28:35Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![rreimche](https://avatars.discourse-cdn.com/v4/letter/r/71c47a/32.png) [@rreimche](https://forum.shopware.com/u/rreimche)\
**Post date:** [30. August 2017 um 09:28 UTC](https://forum.shopware.com/t/bearbeitung-der-bestellung-gerade-nach-dem-drucken-von-jetzt-kaufen/47924/1 "2017-08-30T09:28:35Z")

</div>

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&nbsp;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?

&nbsp;

Danke im Vorab!

---

<div class="post-metadata">

**Author:** ![rreimche](https://avatars.discourse-cdn.com/v4/letter/r/71c47a/32.png) [@rreimche](https://forum.shopware.com/u/rreimche)\
**Post date:** [31. August 2017 um 16:15 UTC](https://forum.shopware.com/t/bearbeitung-der-bestellung-gerade-nach-dem-drucken-von-jetzt-kaufen/47924/2 "2017-08-31T16:15:05Z")

</div>

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?

---

<div class="post-metadata">

**Author:** ![Michael\_Telgmann](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/michael_telgmann/32/20289_2.png) [@Michael\_Telgmann](https://forum.shopware.com/u/Michael_Telgmann)\
**Post date:** [1. September 2017 um 12:38 UTC](https://forum.shopware.com/t/bearbeitung-der-bestellung-gerade-nach-dem-drucken-von-jetzt-kaufen/47924/3 "2017-09-01T12:38:03Z")

</div>

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

![cool](http://forum.shopware.com/plugins/CKEditor/plugins/smiley/images/shopware.png "cool")&nbsp;Michael Telgmann

---

<div class="post-metadata">

**Author:** ![rreimche](https://avatars.discourse-cdn.com/v4/letter/r/71c47a/32.png) [@rreimche](https://forum.shopware.com/u/rreimche)\
**Post date:** [4. September 2017 um 10:03 UTC](https://forum.shopware.com/t/bearbeitung-der-bestellung-gerade-nach-dem-drucken-von-jetzt-kaufen/47924/4 "2017-09-04T10:03:05Z")

</div>

[@Michael Telgmann](https://forum.shopware.com/profile/17553/Michael%20Telgmann "Michael%20Telgmann"), 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](https://www.dropbox.com/s/3eiv2f5lvadbhun/Screenshot%202017-09-04%2012.04.11.png?dl=0) gefunden werden.

Was bedeutet das und wie kann das beseitigt werden?

---

<div class="post-metadata">

**Author:** ![Michael\_Telgmann](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/michael_telgmann/32/20289_2.png) [@Michael\_Telgmann](https://forum.shopware.com/u/Michael_Telgmann)\
**Post date:** [4. September 2017 um 11:43 UTC](https://forum.shopware.com/t/bearbeitung-der-bestellung-gerade-nach-dem-drucken-von-jetzt-kaufen/47924/5 "2017-09-04T11:43:49Z")

</div>

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:&nbsp;$orderVariables[‘sBasket’] oder&nbsp;$orderVariables[‘sUserData’] , etc.

Viele Grüße aus Schöppingen

![cool](https://europe1.discourse-cdn.com/flex013/uploads/shopware/original/1X/86c57fbace799dd4eb1f1b8a2d3bdc1733f0aea1.png "cool")&nbsp;Michael Telgmann

---

<div class="post-metadata">

**Author:** ![rreimche](https://avatars.discourse-cdn.com/v4/letter/r/71c47a/32.png) [@rreimche](https://forum.shopware.com/u/rreimche)\
**Post date:** [5. September 2017 um 09:16 UTC](https://forum.shopware.com/t/bearbeitung-der-bestellung-gerade-nach-dem-drucken-von-jetzt-kaufen/47924/6 "2017-09-05T09:16:59Z")

</div>

Danke, [@Michael Telgmann]([http://forum.shopware.com/profile/17553/Michael](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:&nbsp;

```
 $orderVariables = $this->container->get('session')->get('sOrderVariables')->getArrayCopy();

```

&nbsp;
