Вложенные операторы if в шаблонах электронной почты


Я пытаюсь использовать вложенные операторы 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}}

Можно ли использовать вложенные операторы if в шаблонах электронной почты Magento?

Author: Laura, 2013-02-19

2 answers

Если вы посмотрите на начало класса Varien_Filter_Template, вы найдете следующие две константы.

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

В регулярном выражении CONSTRUCTION_IF_PATTERN вы заметите, что оно имеет вид

{{если условие}} ТЕКСТ ИДЕТ СЮДА {{остальное}} ДРУГОЙ ТЕКСТ ИДЕТ СЮДА {{/если}}

Таким образом, к сожалению, вложенность операторов 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}}

Если это должно быть сложнее, чем это, лучше всего просто упростить свою логику, используя класс блоков для шаблона.

 7
Author: Dan, 2013-04-02 14:17:37

Я никогда не пробовал вложенные управляющие операторы, подобные этому, но одно из возможных решений (хотя, возможно, немного больше работы, чем вы хотите) состоит в том, чтобы включить стандартный шаблон .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().

 1
Author: pspahn, 2013-02-20 19:55:11