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

magento.stackexchange https://magento.stackexchange.com/questions/852

  •  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().

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top