# Eigenes Plugin: Eigene Smarty Variablen in Bestätigungsemail

**URL:** <https://forum.shopware.com/t/eigenes-plugin-eigene-smarty-variablen-in-bestatigungsemail/37087>\
**Category:** Allgemein\
**Created:** [30. Mai 2016 um 21:23 UTC](https://forum.shopware.com/t/eigenes-plugin-eigene-smarty-variablen-in-bestatigungsemail/37087 "2016-05-30T21:23:13Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![frimipiso](https://avatars.discourse-cdn.com/v4/letter/f/a587f6/32.png) [@frimipiso](https://forum.shopware.com/u/frimipiso)\
**Post date:** [30. Mai 2016 um 21:23 UTC](https://forum.shopware.com/t/eigenes-plugin-eigene-smarty-variablen-in-bestatigungsemail/37087/1 "2016-05-30T21:23:13Z")

</div>

Hallo,

ich schreibe gerade ein Plugin, zur Darstellung von Urlaubsmeldungen in der Bestellbestätigungsmail.&nbsp;  
In der Bootstrap.php Datei habe ich mich in das “Shopware\_Modules\_Order\_SendMail\_BeforeSend” event eingeklemmt:  
&nbsp;

```
         //call before sending email
         $this->subscribeEvent(
             'Shopware_Modules_Order_SendMail_BeforeSend',
             'onFrontendPostDispatch'
         );

```

In der Funktion onFrontendPostDispatch schreibe ich dann in den View Controller mit $view-\>assign meine Smarty Variablen zur&nbsp;  
Verwendung im Email Text:

```
//callback function
     public function onFrontendPostDispatch(Enlight_Event_EventArgs $args)
     {

         /** @var \Enlight_Controller_Action $controller */
         $controller = $args->get('subject');
         $view = $controller->View();
         $view->addTemplateDir($this->Path() . 'Views/');

             $view->assign('vacation_state', 'announce');
             $view->assign('vacation_end', $this->Config()->get('date_end_vacation'));
             $view->assign('vacation_message', $this->Config()->get('text_announce'));

     }

```

Im Backend habe ich dann unter “Email Vorlagen” in der sOrder Vorlage den Smarty Code eingefügt, der auf meine eigenen  
Variablen zugreift:

```
{if $vacation_state == "announce"} 
  {$vacation_message}
{/if}

```

Aber leider bekomme ich in der Email nichts angezeigt. Es funktioniert nicht und es ist extrem schwer zu debuggen.

Hat jemand eine Ahnung, wo das Problem liegt?

Danke,

Jens

---

<div class="post-metadata">

**Author:** ![kellerkinder](https://avatars.discourse-cdn.com/v4/letter/k/7cd45c/32.png) [@kellerkinder](https://forum.shopware.com/u/kellerkinder)\
**Post date:** [4. Juni 2016 um 08:52 UTC](https://forum.shopware.com/t/eigenes-plugin-eigene-smarty-variablen-in-bestatigungsemail/37087/2 "2016-06-04T08:52:25Z")

</div>

Schau mal wie das Event geschmissen wird. Das Setzen der Template-Variablen auf das $subject ist der falsche Ansatz. Es gibt noch $variables und $mail ;-):

```
$this->eventManager->notify(
            'Shopware_Modules_Order_SendMail_BeforeSend',
            array(
                'subject' => $this,
                'mail' => $mail,
                'context' => $context,
                'variables' => $variables,
            )
        );

```

&nbsp;

---

<div class="post-metadata">

**Author:** ![frimipiso](https://avatars.discourse-cdn.com/v4/letter/f/a587f6/32.png) [@frimipiso](https://forum.shopware.com/u/frimipiso)\
**Post date:** [15. Juni 2016 um 08:20 UTC](https://forum.shopware.com/t/eigenes-plugin-eigene-smarty-variablen-in-bestatigungsemail/37087/3 "2016-06-15T08:20:09Z")

</div>

Das klingt gut. Danke.

&nbsp;

Werde ich mal austesten und das Ergebnis hier posten.

---

<div class="post-metadata">

**Author:** ![frimipiso](https://avatars.discourse-cdn.com/v4/letter/f/a587f6/32.png) [@frimipiso](https://forum.shopware.com/u/frimipiso)\
**Post date:** [24. Juli 2016 um 21:02 UTC](https://forum.shopware.com/t/eigenes-plugin-eigene-smarty-variablen-in-bestatigungsemail/37087/4 "2016-07-24T21:02:25Z")

</div>

Hallo Nochmal,

&nbsp;

ich stehe immer noch auf dem Schlauch. Daher meine allgemeine Frage:

Wie bekomme ich per Plugin eigene Smarty Variablen in den sOrder Email-Text, die ich dann in email Text verwenden kann?

Ich kann dazu nix finden.

&nbsp;

Vielen Dank für Eure Hilfe,

&nbsp;

Jens

---

<div class="post-metadata">

**Author:** ![Synonymous](https://avatars.discourse-cdn.com/v4/letter/s/57b2e6/32.png) [@Synonymous](https://forum.shopware.com/u/Synonymous)\
**Post date:** [24. Juli 2016 um 21:08 UTC](https://forum.shopware.com/t/eigenes-plugin-eigene-smarty-variablen-in-bestatigungsemail/37087/5 "2016-07-24T21:08:24Z")

</div>

Hi,

Was enthält $variables denn? Ist das kein Array mit allen Variablen, den Du erweitern könntest?

LG

---

<div class="post-metadata">

**Author:** ![frimipiso](https://avatars.discourse-cdn.com/v4/letter/f/a587f6/32.png) [@frimipiso](https://forum.shopware.com/u/frimipiso)\
**Post date:** [24. Juli 2016 um 21:38 UTC](https://forum.shopware.com/t/eigenes-plugin-eigene-smarty-variablen-in-bestatigungsemail/37087/6 "2016-07-24T21:38:04Z")

</div>

Mir ist nicht ganz klar, wie ich das machen soll. Ich habe bisher nur einfach per Tutorial Smarty Variablen für das&nbsp;  
Frontend eingefügt, nach diesem Tutorial:

[https://developers.shopware.com/developers-guide/plugin-quick-start/](https://developers.shopware.com/developers-guide/plugin-quick-start/)

Hier wird folgende callback Funktion registriert:

```
public function onFrontendPostDispatch(Enlight_Event_EventArgs $args)
{
    /** @var \Enlight_Controller_Action $controller */
    $controller = $args->get('subject');
    $view = $controller->View();

    $view->addTemplateDir(
        __DIR__. '/Views'
    );

    $view->assign('slogan', $this->getSlogan());
    $view->assign('sloganSize', $this->Config()->get('font-size'));
    $view->assign('italic', $this->Config()->get('italic'));

}

```

Es werden also dem “view” die Smarty Variablen zugeteilt. Wie macht man das für den Mailtext. Der ist ja eigentlich kein View.

Danke für Eure Hilfe und sorry für meine Ignoranz.

Gruss,

Jens

---

<div class="post-metadata">

**Author:** ![Synonymous](https://avatars.discourse-cdn.com/v4/letter/s/57b2e6/32.png) [@Synonymous](https://forum.shopware.com/u/Synonymous)\
**Post date:** [25. Juli 2016 um 06:27 UTC](https://forum.shopware.com/t/eigenes-plugin-eigene-smarty-variablen-in-bestatigungsemail/37087/7 "2016-07-25T06:27:01Z")

</div>

$args-\>get(‘variables’)

---

<div class="post-metadata">

**Author:** ![frimipiso](https://avatars.discourse-cdn.com/v4/letter/f/a587f6/32.png) [@frimipiso](https://forum.shopware.com/u/frimipiso)\
**Post date:** [27. Juli 2016 um 22:32 UTC](https://forum.shopware.com/t/eigenes-plugin-eigene-smarty-variablen-in-bestatigungsemail/37087/8 "2016-07-27T22:32:18Z")

</div>

Danke für den Tipp. Leider komme ich immer noch nicht weiter. Nach Lesen der Manuals bin ich darauf gekommen, dass es  
besser ist, sich in ein Filter Event einzuklinken, denn dort kann man laut Manual gut Werte verändern. Also habe ich mich in das Event  
“Shopware\_Modules\_Order\_SendMail\_Filter” folgendermassen in der Install Methode meines Plugins eingeklinkt:

```
         $this->subscribeEvent(
             'Shopware_Modules_Order_SendMail_Filter',
             'mail_callback'
         );

```

Im Listener greife ich auf die “variables” zu und schreibe meine gewünschten Smarty Variablen dazu:

```
     public function mail_callback(Enlight_Event_EventArgs $args)
     {
         $variables = $args->get('variables');

         $variables['vacation_state'] = 'vacation';
         $variables['vacation_end'] = $this->Config()->get('date_end_vacation');
         $variables['vacation_message'] = $this->Config()->get('text_vacation');
      }

```

In meinem Debug file wird der Variables array am Ende des Listeners auch korrekt ausgegeben, aber die Smarty Variablen im Email Text bleiben leer.  
Ich habe gelesen, dass man bei den Listener Funktionen für Filter Events mit “return” einen Wert zurückgeben soll. Aber laut Doku scheint das nicht nötig zu sein.

Hat irgendjemand eine Ahnung, wo das Problem liegt?

Danke und viele Grüsse,

Jens

---

<div class="post-metadata">

**Author:** ![steinsoftware](https://avatars.discourse-cdn.com/v4/letter/s/b487fb/32.png) [@steinsoftware](https://forum.shopware.com/u/steinsoftware)\
**Post date:** [28. Juli 2016 um 06:32 UTC](https://forum.shopware.com/t/eigenes-plugin-eigene-smarty-variablen-in-bestatigungsemail/37087/9 "2016-07-28T06:32:04Z")

</div>

Was ist das denn für ein Event? Siehe [http://community.shopware.com/Shopware-4-Events-und-Hooks\_detail\_981.html#Events](http://community.shopware.com/Shopware-4-Events-und-Hooks_detail_981.html#Events)

und ansonsten natürlich return $variables;

---

<div class="post-metadata">

**Author:** ![Synonymous](https://avatars.discourse-cdn.com/v4/letter/s/57b2e6/32.png) [@Synonymous](https://forum.shopware.com/u/Synonymous)\
**Post date:** [28. Juli 2016 um 08:10 UTC](https://forum.shopware.com/t/eigenes-plugin-eigene-smarty-variablen-in-bestatigungsemail/37087/10 "2016-07-28T08:10:19Z")

</div>

Ja, prüf mal ob der Event überhaupt gefeuert wird… Entweder mit Debugger wenn Du einen nützt oder schmeiß mal ein die(‚SendMailFilter‘) in die&nbsp;mail\_callback() Methode.

---

<div class="post-metadata">

**Author:** ![steinsoftware](https://avatars.discourse-cdn.com/v4/letter/s/b487fb/32.png) [@steinsoftware](https://forum.shopware.com/u/steinsoftware)\
**Post date:** [28. Juli 2016 um 08:26 UTC](https://forum.shopware.com/t/eigenes-plugin-eigene-smarty-variablen-in-bestatigungsemail/37087/11 "2016-07-28T08:26:42Z")

</div>

Naja und siehe Hinweis bei (exemplarisch) Notify-Events:

> Das Notify Event ist ein rein informatives Event, was, im Gegensatz zu den anderen beiden Applikations Events, keinerlei Möglichkeit zur Datenmodifikation oder Abbruch des Prozesses bietet.

---

<div class="post-metadata">

**Author:** ![frimipiso](https://avatars.discourse-cdn.com/v4/letter/f/a587f6/32.png) [@frimipiso](https://forum.shopware.com/u/frimipiso)\
**Post date:** [28. Juli 2016 um 08:44 UTC](https://forum.shopware.com/t/eigenes-plugin-eigene-smarty-variablen-in-bestatigungsemail/37087/12 "2016-07-28T08:44:27Z")

</div>

Das Event wird beim Mailversand gefeuert. Ich lasse mir eine Debugdatei erzeugen.&nbsp;

Laut Manual sind notify filter events dazu da, eine Datenmodifikation durchzuführen. Bei dem event „Shopware\_Modules\_Order\_SendMail\_Filter“ handelt es sich um ein Filter Event. Aber laut Manual gibt es keine return Variablen, die man zur Datenmodifikation verwenden kann.

Ich wundere mich allerdings, dass es so schwer ist, eigene Smarty Variablen für den sOrder Emailtext zu erzeugen. Das sollte doch ein Problem sein, dass schon viele gelöst haben.

Danke,

Jens

---

<div class="post-metadata">

**Author:** ![frimipiso](https://avatars.discourse-cdn.com/v4/letter/f/a587f6/32.png) [@frimipiso](https://forum.shopware.com/u/frimipiso)\
**Post date:** [28. Juli 2016 um 08:56 UTC](https://forum.shopware.com/t/eigenes-plugin-eigene-smarty-variablen-in-bestatigungsemail/37087/13 "2016-07-28T08:56:43Z")

</div>

Hier ist die Definition dieses Filter Notif Events “Shopware\_Modules\_Order\_SendMail\_Filter”: [http://community.shopware.com/Shopware-4-Event-Auflistung-sOrder-Events\_detail\_1075.html](http://community.shopware.com/Shopware-4-Event-Auflistung-sOrder-Events_detail_1075.html) Allesdings ist im Vergleich zu allen anderen Filter Notify Events keine Return Variable definiert, was sehr merkwürdig ist (siehe Listener oder Arguments Dump).

---

<div class="post-metadata">

**Author:** ![frimipiso](https://avatars.discourse-cdn.com/v4/letter/f/a587f6/32.png) [@frimipiso](https://forum.shopware.com/u/frimipiso)\
**Post date:** [28. Juli 2016 um 09:22 UTC](https://forum.shopware.com/t/eigenes-plugin-eigene-smarty-variablen-in-bestatigungsemail/37087/14 "2016-07-28T09:22:51Z")

</div>

Sorry habe mich in meinen Beiträgen vertippt. Das Filter Event heisst:

“Shopware\_Modules\_Order\_SendMail\_FilterVariables”

Gruss,

Jens

&nbsp;

---

<div class="post-metadata">

**Author:** ![Synonymous](https://avatars.discourse-cdn.com/v4/letter/s/57b2e6/32.png) [@Synonymous](https://forum.shopware.com/u/Synonymous)\
**Post date:** [28. Juli 2016 um 10:12 UTC](https://forum.shopware.com/t/eigenes-plugin-eigene-smarty-variablen-in-bestatigungsemail/37087/15 "2016-07-28T10:12:17Z")

</div>

War das der Fehler oder hast Du Dich nur im Forum vertippt?

---

<div class="post-metadata">

**Author:** ![frimipiso](https://avatars.discourse-cdn.com/v4/letter/f/a587f6/32.png) [@frimipiso](https://forum.shopware.com/u/frimipiso)\
**Post date:** [28. Juli 2016 um 11:51 UTC](https://forum.shopware.com/t/eigenes-plugin-eigene-smarty-variablen-in-bestatigungsemail/37087/16 "2016-07-28T11:51:37Z")

</div>

Nur im Forum vertippt.

&nbsp;

Hier wird das Event verwendet:

[https://forum.shopware.com/discussion/12595/neue-felder-in-tabelle-s-order-beim-bestellvorgang-befuellen](https://forum.shopware.com/discussion/12595/neue-felder-in-tabelle-s-order-beim-bestellvorgang-befuellen)

Ich werde heute abend mal testen, ob ich damit weiterkomme und sage dann bescheid.

&nbsp;

Viele Grüsse,

&nbsp;

Jens

&nbsp;

&nbsp;

---

<div class="post-metadata">

**Author:** ![frimipiso](https://avatars.discourse-cdn.com/v4/letter/f/a587f6/32.png) [@frimipiso](https://forum.shopware.com/u/frimipiso)\
**Post date:** [28. Juli 2016 um 22:35 UTC](https://forum.shopware.com/t/eigenes-plugin-eigene-smarty-variablen-in-bestatigungsemail/37087/17 "2016-07-28T22:35:07Z")

</div>

Ich schon wieder 🙂

Also ich taste mich jetzt langsam voran. Ich kann jetzt an die&nbsp;$variables im Mailversand meine eigenen Variablen anhängen und  
das funktioniert auch, wie ich in meinen Debugfiles sehen konnte. Das ging wie oben beschrieben über das Filterevent  
„Shopware\_Modules\_Order\_SendMail\_FilterVariables“ und dann im Listener:

```
         $orderVariables = $args->getReturn();
 
         ...

         return $orderVariables;

```

Aber das bringt mich nicht weiter, denn die $variables scheinen nicht die Smarty Variablen zu sein, die in der Email sichtbar sind.In der Datei „\engine\Shopware\Core\sOrder.php“ kann man den Emailversand in der sendMail Methode sehen:

```
   public function sendMail($variables)
    {
        $variables = $this->eventManager->filter(
            'Shopware_Modules_Order_SendMail_FilterVariables',
            $variables,
            array('subject' => $this)
        );

        $shopContext = $this->contextService->getShopContext();

        $context = array(
            'sOrderDetails' => $variables["sOrderDetails"],

            'billingaddress' => $variables["billingaddress"],
            'shippingaddress' => $variables["shippingaddress"],
            'additional' => $variables["additional"],

            'sTaxRates' => $variables["sTaxRates"],
            'sShippingCosts' => $variables["sShippingCosts"],
            'sAmount' => $variables["sAmount"],
            'sAmountNet' => $variables["sAmountNet"],

            'sOrderNumber' => $variables["ordernumber"],
            'sOrderDay' => $variables["sOrderDay"],
            'sOrderTime' => $variables["sOrderTime"],
            'sComment' => $variables["sComment"],

            'attributes' => $variables["attributes"],
            'sCurrency' => $this->sSYSTEM->sCurrency["currency"],

            'sLanguage' => $shopContext->getShop()->getId(),

            'sSubShop' => $shopContext->getShop()->getId(),

            'sEsd' => $variables["sEsd"],
            'sNet' => $this->sNet,
        );

```

Es gibt also $variables und $context. Ich vermute fast, dass sich die Smarty Variablen in der Email aus dem $context ergeben und der ist hart einkodiert. Es scheint kein Filter Event zu geben, mit dem man den $context direkt beeinflussen könnte, um Variablen hinzuzufügen.

Hat jemand eine Ahnung was der $context und die $variables bedeuten und wie man eigene Smarty Variablen in die Email bekommt?

Danke,

Jens

&nbsp;

&nbsp;

---

<div class="post-metadata">

**Author:** ![frimipiso](https://avatars.discourse-cdn.com/v4/letter/f/a587f6/32.png) [@frimipiso](https://forum.shopware.com/u/frimipiso)\
**Post date:** [28. Juli 2016 um 22:46 UTC](https://forum.shopware.com/t/eigenes-plugin-eigene-smarty-variablen-in-bestatigungsemail/37087/18 "2016-07-28T22:46:17Z")

</div>

Es scheint so zu sein, als ob hier in der sendMail Methode der sOrder Klasse der eigentliche Mailtext erzeugt wird:

&nbsp;

```
        $mail = null;
        if ($event = $this->eventManager->notifyUntil(
            'Shopware_Modules_Order_SendMail_Create',
            array(
                'subject' => $this,
                'context' => $context,
                'variables' => $variables,
            )
        )) {
            $mail = $event->getReturn();
        }

        if (!($mail instanceof \Zend_Mail)) {
            $mail = Shopware()->TemplateMail()->createMail('sORDER', $context);
        }

        $mail->addTo($this->sUserData["additional"]["user"]["email"]);

        if (!$this->config->get("sNO_ORDER_MAIL")) {
            $mail->addBcc($this->config->get('sMAIL'));
        }

        $mail = $this->eventManager->filter('Shopware_Modules_Order_SendMail_Filter', $mail, array(
            'subject' => $this,
            'context' => $context,
            'variables' => $variables,
        ));

        if (!($mail instanceof \Zend_Mail)) {
            return;
        }

```

Ich habe im Event&nbsp;‚Shopware\_Modules\_Order\_SendMail\_Filter‘ mal die $mail Variable ausgegeben und das sind schon alle Smarty Variablen eingesetzt.  
Das Ersetzen der Smarty Variablen im Text muss also vorher erfolgen.

Das hier scheint die Zeile zu sein, in der der Mailtext erzeugt wird und es wird anscheinend nur der $context verwendet.

```
$mail = Shopware()->TemplateMail()->createMail('sORDER', $context);

```

Also ist mein Problem: wie kann ich Variablen zum $context dazufügen über ein Event?

Danke,

Jens

P.S.: und ich dachte das Problem löse ich mal so schnell nebenbei …

---

<div class="post-metadata">

**Author:** ![frimipiso](https://avatars.discourse-cdn.com/v4/letter/f/a587f6/32.png) [@frimipiso](https://forum.shopware.com/u/frimipiso)\
**Post date:** [30. Juli 2016 um 22:59 UTC](https://forum.shopware.com/t/eigenes-plugin-eigene-smarty-variablen-in-bestatigungsemail/37087/19 "2016-07-30T22:59:58Z")

</div>

Hallo Nochmal,

also ich habe es jetzt aufgegeben. Zum Einfügen eigener Smarty Variablen in die sOrder Email, müsste es ein filter event geben,  
mit dem man direkt den Mail $context verändern könnte. Gibt es aber nicht. Es geht dann sicherlich über Hooks, aber das geht mir  
zu tief ins System.

Ich habe das Problem jetzt umgangen, indem ich meine zuätzliche Nachricht einfach in die Variable argument.arguments1 schreibe.  
Die wird nicht genutzt und es funktioniert.

So habe ich es gemacht:

```
     public function install()
     {

         //call before sending email
         $this->subscribeEvent(
             'Shopware_Modules_Order_SendMail_FilterVariables',
             'mail_callback_variables'
         );
     }

     public function mail_callback_variables(Enlight_Event_EventArgs $args)
     {

         $orderVariables = $args->getReturn();

         $orderVariables['attributes']['attribute1'] = "My text";

         return $orderVariables;
     }

```

In der sOrder Email kann ich dann auf meinen Text über diese Smarty Variable zugreifen:

```
{$attributes.attribute1}

```

Vielleicht hilft das ja jemandem.

Danke für alle Beiträge und viele Grüsse,

Jens

---

<div class="post-metadata">

**Author:** ![KatjaP](https://avatars.discourse-cdn.com/v4/letter/k/b5ac83/32.png) [@KatjaP](https://forum.shopware.com/u/KatjaP)\
**Post date:** [4. Juli 2022 um 16:16 UTC](https://forum.shopware.com/t/eigenes-plugin-eigene-smarty-variablen-in-bestatigungsemail/37087/20 "2022-07-04T16:16:41Z")

</div>

Hallo Jens,

gibt es hierzu noch neue Erkenntnisse? 😉

Stehe vor dem gleichen Problem und finde keine richtige Lösung.

Danke und viele Grüße Katja
