Verschachtelte if-Anweisungen in E-Mail-Vorlagen

7

Ich versuche, verschachtelte if-Anweisungen in meiner E-Mail-Vorlage wie folgt zu verwenden:

{{if subscriber.promo_group}}
    <p>You are one of the first {{var subscriber.promo_group}} subscribers.</p>
{{/if}}

{{if subscriber.coupon_code}}
    <p>Use code {{htmlescape var=$subscriber.coupon_code}} for {{htmlescape var=$subscriber.discount_amount}} off.</p>
    {{if subscriber.partner_coupon_code}}
        <p>Or, code {{var subscriber.partner_coupon_code}} for {{htmlescape var=$subscriber.partner_discount_amount}} off at checkout.</p>
    {{/if}}
{{else}}
    {{if subscriber.partner_coupon_code}}
        <p>Use code {{htmlescape var=$subscriber.partner_coupon_code}} for {{htmlescape var=$subscriber.partner_discount_amount}} off at checkout.</p>
    {{/if}}
{{/if}}

Wenn ich meine E-Mail erhalte, erhalte ich sie jedoch folgendermaßen:

You are one of the first 20 subscribers.

Use code XXXXX-QTEALK15 for $35 off.

Or, code XXXXX10OFF for 10% off at checkout.

{{else}}
Use code XXXXX10OFF for 10% off at checkout.

{{/if}}

Ist es möglich, verschachtelte if-Anweisungen in den Magento-E-Mail-Vorlagen zu verwenden?

Laura
quelle
Wenn Sie eine Lösung gefunden haben, teilen Sie sie uns bitte mit.
Fabian Blechschmidt
Ich habe keine Lösung gefunden. musste die E-Mail erneut auslösen, um das Problem zu umgehen :(
Laura

Antworten:

7

Wenn Sie sich den Beginn der Varien_Filter_TemplateKlasse ansehen, finden Sie die folgenden zwei Konstanten.

const CONSTRUCTION_DEPEND_PATTERN = '/{{depend\s*(.*?)}}(.*?){{\\/depend\s*}}/si';
const CONSTRUCTION_IF_PATTERN = '/{{if\s*(.*?)}}(.*?)({{else}}(.*?))?{{\\/if\s*}}/si';

Im regulären Ausdruck von werden CONSTRUCTION_IF_PATTERNSie feststellen, dass es die Form von hat

{{if Bedingung}} TEXT GEHT HIER {{else}} ANDERER TEXT GEHT HIER {{/ if}}

Daher ist es leider ifnicht möglich, Anweisungen zu verschachteln , da die erste Übereinstimmung {{/if}}im regulären Ausdruck abgefangen wird.

Obwohl die Klasse etwas anderes als die {{if}}Anweisungen bietet , die {{depend}}Anweisung. Es ist fast das gleiche wie das, {{if}}außer dass es keine {{else}}Funktionalität hat.

Glücklicherweise sind die verschachtelten Bedingungen in Ihrem Fall nicht kompliziert und können mit verwendet werden {{depend}}. Sie können also Folgendes haben:

{{if subscriber.promo_group}}
    <p>You are one of the first {{var subscriber.promo_group}} subscribers.</p>
{{/if}}

{{if subscriber.coupon_code}}
    <p>Use code {{htmlescape var=$subscriber.coupon_code}} for {{htmlescape var=$subscriber.discount_amount}} off.</p>
    {{depend subscriber.partner_coupon_code}}
        <p>Or, code {{var subscriber.partner_coupon_code}} for {{htmlescape var=$subscriber.partner_discount_amount}} off at checkout.</p>
    {{/depend}}
{{else}}
    {{depend subscriber.partner_coupon_code}}
        <p>Use code {{htmlescape var=$subscriber.partner_coupon_code}} for {{htmlescape var=$subscriber.partner_discount_amount}} off at checkout.</p>
    {{/depend}}
{{/if}}

Wenn dies komplizierter sein muss, vereinfachen Sie Ihre Logik am besten mit einer Blockklasse für die Vorlage.

Dan
quelle
1

Ich habe noch nie versucht, Steueranweisungen wie diese zu verschachteln, aber eine mögliche Lösung (obwohl vielleicht etwas mehr Arbeit als Sie wünschen) besteht darin, eine Standardvorlage .phtmlin Ihre E-Mail-Vorlage aufzunehmen.

Der Core verwendet diese Funktion und kann sehr praktisch sein, wenn Sie PHP in Ihren E-Mail-Vorlagen ausführen müssen.

Schauen Sie sich an:

app/locale/en_US/template/email/sales/order_new.html

ebenso gut wie:

app/design/frontend/base/default/layout/sales.xml

order_new.htmlÜberprüfen Sie in der Vorlage Zeile 97 (oder so ungefähr), und Sie sehen diesen Aufruf:

{{layout handle="sales_email_order_items" order=$order}}

Dieser Aufruf überprüft Ihre Layoutdateien auf das Handle sales_email_order_items. In sales.xmlfinden Sie dies in der Nähe von Zeile 268. Sie sehen dies email/order/invoice/items.phtml(unter anderem) in der Vorlage .

Von hier aus ist alles ziemlich normales Magento-Layout. Wenn Sie sich die items.phtmlVorlage ansehen , werden Sie als Erstes feststellen, dass sie die $_orderVariable zuweist . Dies wird im Layout-Handle der E-Mail-Vorlage als übergeben order=$order. Sobald Sie sich damit befassen items.phtml, weisen sie diese Variable nur mit zu $this->getOrder().

pspahn
quelle