Вложенные IF -операторы в шаблонах электронной почты
-
16-10-2019 - |
Вопрос
Я пытаюсь использовать вложенные операторы в моем шаблоне электронной почты, например, следующее:
{{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?
Решение
Если вы посмотрите на начало 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
Вы заметите, что у него есть форма
{{если условие}} текст идет здесь {{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}}
Если это должно быть более сложным, чем это, лучше просто упростить свою логику, используя класс блока для шаблона.
Другие советы
Я никогда не пробовал подобные заявления в гнездование, но одно из возможных решений (хотя, возможно, немного больше работы, чем вы желаете) состоит в том, чтобы включить стандарт .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 Mayout отсюда. Если вы посмотрите на items.phtml
шаблон, первое, что вы заметите, это то, что он назначает $_order
переменная. Это проходит через макет макета электронного шаблона как order=$order
. Анкет Как только вы попадете в items.phtml
, они просто назначают эту переменную, используя $this->getOrder()
.