電子メールテンプレートのネストされたifステートメント


7

次のように、メールテンプレートでネストされたifステートメントを使用しようとしています。

{{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}}

メールを受け取ったとき、次のようになります。

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}}

Magentoメールテンプレートでネストされたifステートメントを使用することはできますか?


解決策を見つけたら、私たちと共有してください。
Fabian Blechschmidt 2013年

解決策が見つかりませんでした。問題を回避するために、メールを再度修正する必要がありました:(
Laura

回答:


7

Varien_Filter_Templateクラスの最初を見ると、次の2つの定数があります。

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

CONSTRUCTION_IF_PATTERNあなたの正規表現では、それが

{{if条件}}ここにテキストが表示されます{{else}}他のテキストがここに表示されます{{/ if}}

したがって、if最初に一致{{/if}}したものが正規表現でキャッチされるため、残念ながらステートメントをネストすることはできません 。

クラスは{{if}}ステートメント以外のものも提供しますが、{{depend}}ステートメントです。機能{{if}}がないこと以外はほぼ同じ{{else}}です。

幸いなことに、ネストされた条件は複雑ではなく、を使用して実行できます{{depend}}。したがって、次のようにすることができます。

{{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}}

これよりも複雑にする必要がある場合は、テンプレートのブロッククラスを使用してロジックを単純化するのが最善です。


1

私はそのような制御ステートメントをネストすることを試みたことがありませんが、1つの可能な解決策(多分あなたが望むより少し多くの作業ですが)は.phtml、メールテンプレート内に標準テンプレートを含めることです。

コアはこの機能を使用しており、メールテンプレート内でPHPを実行する必要がある場合に非常に便利です。

見て:

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

と同様:

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

ではorder_new.html、テンプレート、チェックライン97(またはその付近)には、このコールが表示されます:

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

この呼び出しは、ハンドルのレイアウトファイルをチェックしますsales_email_order_items。これsales.xmlは268行目近くにあります。これは、email/order/invoice/items.phtml(特に)テンプレートに読み込まれます。

ここからは、かなり標準的なMagentoレイアウトのものです。items.phtmlテンプレートを見ると、最初に気付くのは、$_order変数が割り当てられていることです。これは、メールテンプレートのレイアウトハンドルでとして渡されorder=$orderます。に入るとitems.phtml、それらはを使用してその変数を割り当てるだけです$this->getOrder()

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.