Order Confirmation E-Mail: Eigenen Smarty Modifier verwenden

Hallo zusammen,

in der Bestellbestätigungsmail möchte ich gerne einen eigenen Smartymodiefier verwenden.

Generisch können Modifier im Frontend geladen werden, diese stehen dann aber nicht im Backend oder in den E-Mail-Templates zur Verfüfung.
Für die E-Mail-Vorlagen und die Vorschau im Backend, sowie den Test-Versand dort habe ich das über die eigene Registrierung in Events geschafft.

public static function getSubscribedEvents()
{
    return ['Enlight_Controller_Action_PreDispatch_Backend_Mail' => 'registerSmartyModifier'];
}

Meine Erwartung war nun, dies für die Bestätigungsmail am ende des Bestellprozesses ebenso bewerkstelligen zu können.
Die Nutzung von  Enlight_Controller_Action_PreDispatch_Frontend_Checkout  blieb hier ohne Erfolg (und hätte ja ohnehin über die generische Registrierung funktionieren müssen).

Wie würdet ihr vorgehen?

Herzlichen Dank!

Hallo,

was soll der Modifier in der Bestätigungsmail genau tun?
 

Grüße Lukas

Hallo Lukas,

der Modiefier holt anhand der Artikelnummer eines Produktes den Preis der primären Produktvariante.
Um nicht in jedem Kontext in dem es gebraucht wird (Detailansicht, Warenkorbansicht, Checkout, E-Mail-Templates im Backend, E-Mail-Templates im Frontend) das entsprechende Event bemühen zu müssen habe ich mich für einen Modiefier entschieden.

Vielen Dank,
Morty

Hallo @morty‍,

ich bin nicht sicher, aber wie ich verstehe von Shopware Code:

Email Template benutzen nicht das Frontend View Template Engine, trotzem  TemplateMail  und StringCompiler .

Service Factory erstelle das templatemail Service und sein StringComplier , das benutzen das Shop template Service aber bevor deine Smarty Modifer würde registeriet.

deine Lösung hier ist decorate oder replace ein von diese Services templatemail, template und registeren deine Modifer dort.

mehr info über Service Subscribers findest du hier:

https://developers.shopware.com/developers-guide/legacy-plugin-system/#decorate-a-service

 

VG,

Tel.: +49 755 - 183 990 00 | Web: http://enbit.de/

Hi @ahmadsaad‍,

danke, für deine Antwort und dafür, dass du dir die Mühe gemacht hast einen Blick in den Code zu werfen. Ich habe mich mal auf den Weg gemacht, deinen Hinweisen zu folgen.

Wenn ich dich richtig verstehe, empfielst du die Verwendung eines Decorators für TemplateMail bzw die Factory.
In den Beispielen und auch im Code verwenden die Decorators immer ein das Interface der zu dekorierenden Klasse, das ist hier leider nicht möglich. Weder die Factory noch die TemplateMail Klasse implementieren ein Interface.

Momentan scheint es mir nicht möglich an das Template heranzukommen, da auf dieser Ebene – wenn ich das richtig sehe – auch kein Replace möglich ist.

Gibt es sonst noch Ideen oder habe ich vielleicht etwas nicht beachtet?

Vielen Dank!
Morty

Hallo @morty

Du brauchst hier keine neue class. 

Einfach nehmen die originalen service anderen dass template und dann set das service nochmal zu container.(vielleicht funktioniert ohne reset ich weiß nicht genau probiere die beiden Lösungen) .

 

Hinweis : wie du kannst by factory sehen das Template gehört das stringcompiler nicht das templatemail service. 

Also:

1- get orignial service. 

2- get stringcompiler von diese service => getStringCompiler()

3- get view gehört diese stringcompiler => getView()

Register deine modifer. 

 

Ob nicht funktioniert probier,  das service nochmal zu container hinzufügen.

$this->container->set( $originalService )

 

Vg,

Ahmad

1 Like

Schreib einfach einen CompilerPass der den Ordner hinzufügt

3 Likes

@Shyim‍, herzlichen Dank für den Hinweis. Das funktioniert famos und ist verhältnismäßig schlicht umzusetzen.

@ahmadsaad‍ ‍, danke, für deine Mühe, auch dein Ansatz hat mir gut gefallen und könnte funktionieren, scheint im Vergleich etwas schwergewichtiger.