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