Eigenes Plugin: Eigene Smarty Variablen in Bestätigungsemail

Hallo,

ich schreibe gerade ein Plugin, zur Darstellung von Urlaubsmeldungen in der Bestellbestätigungsmail. 
In der Bootstrap.php Datei habe ich mich in das “Shopware_Modules_Order_SendMail_BeforeSend” event eingeklemmt:
 

         //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 
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

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,
            )
        );

 

Das klingt gut. Danke.

 

Werde ich mal austesten und das Ergebnis hier posten.

Hallo Nochmal,

 

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.

 

Vielen Dank für Eure Hilfe,

 

Jens

Hi,

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

LG

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

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

$args->get(‘variables’)

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

Was ist das denn für ein Event? Siehe http://community.shopware.com/Shopware-4-Events-und-Hooks_detail_981.html#Events

und ansonsten natürlich return $variables;

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 mail_callback() Methode.

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.

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

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

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 Allesdings ist im Vergleich zu allen anderen Filter Notify Events keine Return Variable definiert, was sehr merkwürdig ist (siehe Listener oder Arguments Dump).

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

“Shopware_Modules_Order_SendMail_FilterVariables”

Gruss,

Jens

 

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

Nur im Forum vertippt.

 

Hier wird das Event verwendet:

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.

 

Viele Grüsse,

 

Jens

 

 

Ich schon wieder :slight_smile:

Also ich taste mich jetzt langsam voran. Ich kann jetzt an die $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

 

 

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

 

        $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 ‚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 …

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

Hallo Jens,

gibt es hierzu noch neue Erkenntnisse? :wink:

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

Danke und viele Grüße Katja