# Formularfeld an Smarty Variable übergeben für sOrder Mailvorlage

**URL:** <https://forum.shopware.com/t/formularfeld-an-smarty-variable-ubergeben-fur-sorder-mailvorlage/43988>\
**Category:** Programmierung\
**Created:** [23. Februar 2017 um 14:31 UTC](https://forum.shopware.com/t/formularfeld-an-smarty-variable-ubergeben-fur-sorder-mailvorlage/43988 "2017-02-23T14:31:26Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![Wilson82](https://avatars.discourse-cdn.com/v4/letter/w/e274bd/32.png) [@Wilson82](https://forum.shopware.com/u/Wilson82)\
**Post date:** [23. Februar 2017 um 14:31 UTC](https://forum.shopware.com/t/formularfeld-an-smarty-variable-ubergeben-fur-sorder-mailvorlage/43988/1 "2017-02-23T14:31:26Z")

</div>

Hallo zusammen,

&nbsp;

ich hoffe jemand kann mir einen Tipp geben.

&nbsp;

**Folgende Aufgabenstellung:**

&nbsp;

In der confirm Seite möchte ich ein Formularfeld(Email) einbauen und sobald der Kunde auf „Zahlungspflichtig bestellen“ geht, soll der Wert aus dem Formularfeld in die SmartyVariable der sOrder Mail Vorlage $sMailGarantie geschrieben werden:

&nbsp;

In dem **confirm.tpl** sieht das so bei mir aus:

&nbsp;

&nbsp;

In der **order.php** wird unter

&nbsp;

**public function sSaveOrder()** folgender Wert angelegt:

&nbsp;

$variables = array(

“sMailGarantie”=\>$this-\>sMailGarantie,

);

&nbsp;

und unter **public function sendMail($variables)** wird dieser Wert angelegt:

&nbsp;

$context = array(

‘sMailGarantie’ =\> $variables[“sMailGarantie”],

);

&nbsp;

Die Smarty Variable $sMailGarantie wird mir in der sOrder Email Vorlage geliefert, aber ohne Inhalt.

&nbsp;

Wo, bzw. wie bekomme ich die Zuweisung hin? Jemand eine Hilfestellung?

---

<div class="post-metadata">

**Author:** ![derwunner](https://avatars.discourse-cdn.com/v4/letter/d/e5b9ba/32.png) [@derwunner](https://forum.shopware.com/u/derwunner)\
**Post date:** [23. Februar 2017 um 14:48 UTC](https://forum.shopware.com/t/formularfeld-an-smarty-variable-ubergeben-fur-sorder-mailvorlage/43988/2 "2017-02-23T14:48:12Z")

</div>

Hallo,

&nbsp;

also Core Dateien werden im Normalfall schonmal gar nicht angefasst, bzw. müssen im Normalfall gar nicht angefasst werden. Würde ich Dir auch nicht empfehlen, weil Deine Änderung mit dem nächsten Shopware Update verloren geht.

Du musst dich in Deinem Plugin auf das Event Shopware\_Modules\_Order\_SaveOrder\_ProcessDetails registrieren. Darin kannst Du dann via&nbsp;\Enlight\_Event\_EventArgs::getDetails() alle Bestellpositionen als array abrufen und zu jeder Position nach Belieben Variablen hinzufügen, entfernen oder ändern.

Hier ein Komplettbeispiel als 5.2 Plugin:

```
 'onOrderMailAddDetails'
        ];
    }

    /**
     * Manipulates the order E-Mail template and adds the description field data.
     *
     * @param \Enlight_Event_EventArgs $args
     *
     * @return void
     */
    public function onOrderMailAddDetails(\Enlight_Event_EventArgs $args)
    {
        /*
         * e. g.:
         * array (
         * 'id' => '685',
         * 'sessionID' => '7n5pbek4m6cf9uiqmfcssaeh25',
         * 'userID' => '3',
         * 'articlename' => 'Badeshort',
         * 'articleID' => '281',
         * 'ordernumber' => 'SW00001',
         * 'shippingfree' => '0',
         * 'quantity' => '2',
         * 'price' => '141,61',
         * 'netprice' => '119',
         * 'tax_rate' => '19',
         * 'datum' => '2017-02-13 16:34:32',
         * 'modus' => '0',
         * 'esdarticle' => '0',
         * 'partnerID' => '',
         * 'lastviewport' => 'checkout',
         * 'useragent' => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
         * 'config' => '',
         * 'currencyFactor' => '1',
         * 'packunit' => 'Stück',
         * 'mainDetailId' => '836'
         * )
         */
        $details = $args->getDetails();
        $mainDetails = array();
        foreach ($details as $index => $detail) {
            $mainDetails[] = $detail['mainDetailId'];
        }

        // fictive Query result:
        $descriptions = array(
            0 => array(
                'mainDetailId' => 1,
                'description' => 'Berschreibung 1'
            ),
            1 => array(
                'mainDetailId' => 2,
                'description' => 'Beschreibung 2'
            )
        );

        foreach ($details as $index => $detail) {
            foreach ($descriptions as $description) {
                if ($description['mainDetailId'] == $detail['mainDetailId']) {
                    $details[$index]['description'] = $description['description'];
                    $detail['description'] = $description['description'];
                    break;
                }
            }

            if (!array_key_exists('description', $detail['description'])) {
                $details[$index]['description'] = 'k. A.';
            }
        }

        // re set it
        $args->setDetails($details);
        /**
         * @var \sOrder $sOrder
         */
        $sOrder = $args->getSubject();
        // TODO: FIXME not sure why we need this to set it twice. But otherwise it would not have been in the mail template
        $sOrder->sBasketData['content'] = $details;
    }
}

```

Danach muss nur noch das sOrder E-Mail Template angepasst werden, damit auch etwas mit der eben definierten Variable gemacht wird. Das kannst Du auch prima über „Test E-Mail an Shopbetreiber senden“ testen. Also es muss dafür keine Testbestellung generiert werden.

&nbsp;

&nbsp;

MFG

&nbsp;

derwunner

---

<div class="post-metadata">

**Author:** ![Wilson82](https://avatars.discourse-cdn.com/v4/letter/w/e274bd/32.png) [@Wilson82](https://forum.shopware.com/u/Wilson82)\
**Post date:** [24. Februar 2017 um 13:34 UTC](https://forum.shopware.com/t/formularfeld-an-smarty-variable-ubergeben-fur-sorder-mailvorlage/43988/3 "2017-02-24T13:34:23Z")

</div>

…sehr cool, vielen Dank! Das hat mich weitergebracht. Mein zusammengeschustertes PlugIn funktioniert und gibt in der SOrderMail die Variable = \>&nbsp; **{$sOrderDetails.MailGarantie}: meinWert** &nbsp;aus.&nbsp;

Aber mein JugendForscht Projekt&nbsp; &nbsp;ist noch nicht beendet. Denn wie&nbsp;bekomme ich aus meinem Formularfeld in der confirm.tpl Seite -\>

```
{block name='frontend_checkout_confirm_garantieverlängerung'}

{/block}

```

den Wert, der dort eingegeben wird an die&nbsp;Smarty Variable&nbsp; **{$sOrderDetails.MailGarantie} ?**

**Für Tipps in jegliche Richtung wäre ich sehr dankbar!!!**

```
 'mailgarantie'
        ];
    }

     
public function mailgarantie(Enlight_Hook_HookArgs $args) {
        
        $variables = $args->getReturn();
            
        $variables["sOrderDetails"]['MailGarantie'] = 'meinWert';
        
        return $variables;
        
    }
}

```

&nbsp;

---

<div class="post-metadata">

**Author:** ![Wilson82](https://avatars.discourse-cdn.com/v4/letter/w/e274bd/32.png) [@Wilson82](https://forum.shopware.com/u/Wilson82)\
**Post date:** [16. März 2017 um 14:23 UTC](https://forum.shopware.com/t/formularfeld-an-smarty-variable-ubergeben-fur-sorder-mailvorlage/43988/4 "2017-03-16T14:23:50Z")

</div>

Hallo zusammen,

mittlerweile funktioniert es und ich weiß, welche Zeilen im Core(ich weiß, da sollte es nicht rein) verantwortlich sind --\>

sOrder.php -\>&nbsp;public function sSaveOrder()

**_$variables = [  
„sMailGarantie“ =\> $this-\>sMailGarantie,  
];_**

&nbsp;

sOrder.php -\>&nbsp;public function sendMail($variables)

_**$context = [  
‚sMailGarantie‘ &nbsp; &nbsp; =\> $variables["sMailGarantie“],  
];**_

sCheckOut.php -\> public function finishAction()

_**if ($this-\>Request()-\>getParam(‚sMailGarantie‘)!==null) {  
$this-\>session[‚sMailGarantie‘] = trim(strip\_tags($this-\>Request()-\>getParam(‚sMailGarantie‘)));  
&nbsp; &nbsp; &nbsp; &nbsp; }**_

sCheckOut.php -\> public function saveOrder()

_**$order = Shopware()-\>Modules()-\>Order();**_

_**$order-\>sMailGarantie = isset($this-\>session[‚sMailGarantie‘]) ? $this-\>session[‚sMailGarantie‘] : ‚‘;**_

_**&nbsp;return $order-\>sSaveOrder();**_

Zugegeben, dass ist ziemlich ScriptKiddie like, aber funktioniert!

Den Teil mit der Variable bekomme ich noch in mein PlugIn, aber der entscheidende Teil passiert ja in der sCheckpout.php. Dort wird aus meinem Formularfeld, dass ich im confirm.tpl angelegt habe, der Wert gezogen und an die Variable sMailGarantie übergeben, so dass ich mit ihr dann in der sOrder arbeiten kann.&nbsp;

Nun natürlich die Frage, ob das, bzw. wie das in ein PlugIn noch eingearbeitet werden kann?!

Beste Grüße

Christian&nbsp;
