mortymorty MemberComments: 12 Received thanks: 0 Member since: November 2018 edited December 2018

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!

1 Answer

Answers

  • LukaschelLukaschel MemberComments: 31 Received thanks: 5 Member since: July 2017

    Hallo,

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

    Grüße Lukas

  • mortymorty MemberComments: 12 Received thanks: 0 edited December 2018 Member since: November 2018

    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

  • ahmadsaadahmadsaad MemberComments: 261 Received thanks: 76 Member since: September 2016

    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/blog/2015/11/11/best-practices-of-shopware-plugin-development/#services

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

     

    VG,

    image

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

  • mortymorty MemberComments: 12 Received thanks: 0 edited December 2018 Member since: November 2018

    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

  • ahmadsaadahmadsaad MemberComments: 261 Received thanks: 76 edited December 2018 Member since: September 2016

    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

    Thanked by 1morty
  • ShyimShyim MemberComments: 723 Received thanks: 295 Member since: May 2015
    Thanked by 2ahmadsaad morty
  • mortymorty MemberComments: 12 Received thanks: 0 Member since: November 2018

    @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.

Sign In or Register to comment.