# Wie speichere ich Attribut von Order bei onPreDispatchCheckout?

**URL:** <https://forum.shopware.com/t/wie-speichere-ich-attribut-von-order-bei-onpredispatchcheckout/48976>\
**Category:** Programmierung\
**Created:** [21. Oktober 2017 um 14:39 UTC](https://forum.shopware.com/t/wie-speichere-ich-attribut-von-order-bei-onpredispatchcheckout/48976 "2017-10-21T14:39:41Z")\
**Posts on this page:** 9\
**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:** [21. Oktober 2017 um 14:39 UTC](https://forum.shopware.com/t/wie-speichere-ich-attribut-von-order-bei-onpredispatchcheckout/48976/1 "2017-10-21T14:39:41Z")

</div>

Hallo Zusammen,

ich verwende das Event “onPreDispatchCheckout”, um eine Anfrage an einen Lieferanten-Server zu schicken und dadurch sicherzustellen, dass die Bestellung vom Kunden erfüllbar ist. Abhängig von der Antwort setzte ich das&nbsp;Checkout-Prozess fort oder leite den Kunden wieder zum Confirm-Action um:

```
 /**
     * @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')->getArrayCopy();

        // check if order is Fullfillable
        $orderFulfillable = $this->orderFulfillable($orderVariables); 

        if ($orderVariables && !$orderFulfillable) {
            // if not valid, set orderUnfulfillable to true to display an error and return to confirm page
            $orderVariables['orderFulfillable'] = false;
            $this->View()->assign($orderVariables);
            return $controller->forward('confirm');
        }

        // everything is ok, Shopware does its order stuff
    }

```

Dabei muss ich an den Lieferanten einen eindeutigen Ordernummer für diese Bestellung schicken. Problematisch ist dabei, dass Shopware-Ordernummer wird erst viel später generiert und gespeichert. Ich kann also an dieser Stelle die Shopware-Ordernummer nich zugreifen. Von daher habe ich entschieden an diesem Zeitpunkt eine eigene Ordernummer zu erstellen. Dabei ist es problematisch diese eigene Ordernummer irgendwie so zu speichern, dass sie später automatisch im Datenbank gespeichert wird. Ich würde die In Attributen (“s\_order\_attributes” &nbsp;oder&nbsp;Shopware\Models\Attribute\OrderDetail) gerne speichern, aber an diesem Zeitpunkt ist das aus oben genannten Gründen kaum möglich.

Soweit sieht meine Funktion für Erzeugung von der eigenen Ordenummer so aus (sie wird von $this-\>orderFulfullable() aufgerufen):

&nbsp;

```
private function getEETOrderNumber(){
        $ordernumber = uniqid("eet_"); 
        
        // HERE SOLL ICH SICHERSTELLEN, DASS $ordernummer SPÄTER FÜR DIESE BESTELLUNG GESPEICHERT WIRD
 
        return $ordernumber;
    }

```

&nbsp;

Wie könnte ich das gedachte implementieren?

---

<div class="post-metadata">

**Author:** ![arnebecker](https://avatars.discourse-cdn.com/v4/letter/a/3bc359/32.png) [@arnebecker](https://forum.shopware.com/u/arnebecker)\
**Post date:** [23. Oktober 2017 um 06:56 UTC](https://forum.shopware.com/t/wie-speichere-ich-attribut-von-order-bei-onpredispatchcheckout/48976/2 "2017-10-23T06:56:17Z")

</div>

Du kannst sie einfach in der Session speichern und dann von dort wieder auslesen beim Abschluss der Bestellung.

---

<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:** [23. Oktober 2017 um 08:27 UTC](https://forum.shopware.com/t/wie-speichere-ich-attribut-von-order-bei-onpredispatchcheckout/48976/3 "2017-10-23T08:27:31Z")

</div>

Danke, @arnebecker‍.&nbsp;

Soll ich Session-Verwaltung von PHP verwenden oder lieber von Shopware? Wenn das 2., wo kann ich darüber genauer lesen (kann mich nicht auf dieses Thema aus dem Buch erinnern, aber vllt. habe ich es da verpasst).

---

<div class="post-metadata">

**Author:** ![arnebecker](https://avatars.discourse-cdn.com/v4/letter/a/3bc359/32.png) [@arnebecker](https://forum.shopware.com/u/arnebecker)\
**Post date:** [23. Oktober 2017 um 09:21 UTC](https://forum.shopware.com/t/wie-speichere-ich-attribut-von-order-bei-onpredispatchcheckout/48976/4 "2017-10-23T09:21:42Z")

</div>

Nimm die von Shopware. Das macht dein Code oben ja im Prinzip auch schon.&nbsp;$this-\>container-\>get(‚session‘)-\>set() und&nbsp;$this-\>container-\>get(‚session‘)-\>get() wären hier die Methoden.

---

<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:** [25. Oktober 2017 um 14:26 UTC](https://forum.shopware.com/t/wie-speichere-ich-attribut-von-order-bei-onpredispatchcheckout/48976/5 "2017-10-25T14:26:53Z")

</div>

Danke, @arnebecker‍, fürs Tipp, aber $this-\>container-\>get(‘session’) gibt&nbsp;\Enlight\_Components\_Session\_Namespace zürück. Diese Klasse hat keine “set()” methode. Sie hat ber “offsetSet($key, $value)”, die “$this-\>\_\_set($key, $value)” aufruft. Hast du das gemeint?

---

<div class="post-metadata">

**Author:** ![arnebecker](https://avatars.discourse-cdn.com/v4/letter/a/3bc359/32.png) [@arnebecker](https://forum.shopware.com/u/arnebecker)\
**Post date:** [26. Oktober 2017 um 07:27 UTC](https://forum.shopware.com/t/wie-speichere-ich-attribut-von-order-bei-onpredispatchcheckout/48976/6 "2017-10-26T07:27:48Z")

</div>

Ups. Die Klasse hat wirklich gar keine set() Methode. Sorry. Aber du hast recht. Du kannst auch einfach offsetSet() nehmen. Oder du nimmt den magic setter get(‚session‘)-\>dein\_key

---

<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. Oktober 2017 um 16:57 UTC](https://forum.shopware.com/t/wie-speichere-ich-attribut-von-order-bei-onpredispatchcheckout/48976/7 "2017-10-31T16:57:37Z")

</div>

Eigentlich funktioniert es so einfach gar nicht:

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

/* ...do something with $orderVariables... */

$sessionNamespace->offsetSet('sOrderVariables', $orderVariables);

```

Ab hier ist sOrderVariables in Session kein ArrayObject mehr sondern nur ein Array, was später Fatal Error von Shopware-Code&nbsp;erzeugt (beim Aufrufen von ArrayObject::getArrayCopy() ).

Dieses ArrayObject hat in Session Flags gleich 2, was&nbsp;ArrayObject::ARRAY\_AS\_PROPS bedeutet. Ich versuche jetzt so ein ArrayObject in Session zu speichern mit meinen Änderungen dazu. Wenn es funktioniert, schreibe ich. Wenn nicht, schreibe ich auch 🙂

---

<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. Oktober 2017 um 17:05 UTC](https://forum.shopware.com/t/wie-speichere-ich-attribut-von-order-bei-onpredispatchcheckout/48976/8 "2017-10-31T17:05:17Z")

</div>

Ja, die letzte Linie soll so aussehen:

```
$sessionNamespace->offsetSet('sOrderVariables', new \ArrayObject($orderVariables,2));

```

Dann läuft meine Finish-Action bis zur Ende reibungslos 🙂

FRAGE AN ALLE: ist das so genug oder habe etwas wichtige verpasst, was&nbsp;später Etwas zerstören könnte?

---

<div class="post-metadata">

**Author:** ![arnebecker](https://avatars.discourse-cdn.com/v4/letter/a/3bc359/32.png) [@arnebecker](https://forum.shopware.com/u/arnebecker)\
**Post date:** [1. November 2017 um 09:56 UTC](https://forum.shopware.com/t/wie-speichere-ich-attribut-von-order-bei-onpredispatchcheckout/48976/9 "2017-11-01T09:56:46Z")

</div>

Ich denke das passt so. Aber klar! Wenn du ein ArrayObject aus der Session ziehst und ein Array wieder rein schreibst, gibt es natürlich Probleme 😉 Du schon den&nbsp;gleichen Datentyp&nbsp;zurückschreiben. Oder du arbeitest einfach mit dem ArrayObjekt ohne die Konvertierung ins Array.
