mortymorty MitgliedKommentare: 5 Danke erhalten: 0 Mitglied seit: 28. November bearbeitet 7. Dezember

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 Antwort

Antworten

  • LukaschelLukaschel MitgliedKommentare: 7 Danke erhalten: 0 Mitglied seit: Juli 2017

    Hallo,

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

    Grüße Lukas

  • mortymorty MitgliedKommentare: 5 Danke erhalten: 0 bearbeitet 6. Dezember Mitglied seit: 28. November

    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 MitgliedKommentare: 197 Danke erhalten: 58 Mitglied seit: 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 MitgliedKommentare: 5 Danke erhalten: 0 bearbeitet 7. Dezember Mitglied seit: 28. November

    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 MitgliedKommentare: 197 Danke erhalten: 58 bearbeitet 7. Dezember Mitglied seit: 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

    Danke von 1morty
  • ShyimShyim MitgliedKommentare: 528 Danke erhalten: 230 Mitglied seit: Mai 2015
    Danke von 2ahmadsaad morty
  • mortymorty MitgliedKommentare: 5 Danke erhalten: 0 Mitglied seit: 28. November

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

Anmelden oder Registrieren, um zu kommentieren.