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).
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.
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:
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?
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.