Twig — шаблонизатор, на котором RetailCRM формирует тексты писем, SMS, сообщений в мессенджеры и печатные формы документов. Он отделяет вёрстку от данных: в шаблон подставляются поля заказа и клиента, а логику вывода задают управляющие теги.
Где RetailCRM использует Twig
Twig — это стандартный PHP-шаблонизатор от SensioLabs, адаптированный в RetailCRM для генерации контента. В отличие от PipeLang, который вычисляет отдельные значения, Twig собирает целые документы и сообщения из шаблона и данных события. Такой подход разделяет ответственность: разработчик описывает структуру документа один раз, а платформа подставляет данные каждого конкретного заказа при отправке.
- Email-уведомления — тело письма клиенту или менеджеру;
- SMS и сообщения в мессенджеры — короткие тексты с подстановкой данных заказа;
- Печатные формы — накладные, счета, ярлыки, где вёрстка на HTML;
- Тексты действий триггеров — например, комментарий к заказу.
Шаблон срабатывает в контексте события: смена статуса заказа, регистрация клиента, наступление даты. Именно событие определяет, какие данные окажутся доступны в шаблоне.
Синтаксис: вывод, теги, комментарии
Twig оперирует тремя видами разделителей:
| Конструкция | Синтаксис | Назначение |
|---|---|---|
| Вывод | {{ order.number }} | Печатает значение |
| Управление | {% if ... %} | Логика, циклы, присваивание |
| Комментарий | {# ... #} | Не попадает в вывод |
Простейший шаблон приветствия: Здравствуйте, {{ order.firstName }}! Ваш заказ {{ order.number }} принят. К значениям применяют фильтры через вертикальную черту — как и в PipeLang, но набор фильтров здесь стандартный для Twig.
Условия и циклы
Управляющие теги позволяют менять текст в зависимости от данных и перебирать коллекции. Условие выводит блок только при выполнении проверки:
{% if order.totalSumm > 5000 %}Вам доступна бесплатная доставка.{% endif %}
Ветвления расширяются тегами {% elseif %} и {% else %} — так один шаблон обслуживает несколько сценариев, например разный текст для оплаченного и неоплаченного заказа. Цикл перебирает позиции заказа и выводит таблицу товаров:
{% for item in order.items %}{{ item.offer.name }} — {{ item.quantity }} шт.{% endfor %}
Внутри цикла доступна переменная loop с индексом loop.index и признаками loop.first / loop.last. Это удобно для нумерации строк или расстановки разделителей. Для пустой коллекции предусмотрен блок {% for ... %}...{% else %}Список пуст{% endfor %}, который выводится, если перебирать нечего. Промежуточные значения можно сохранить в переменную тегом {% set discount = order.totalSumm * 0.05 %} и переиспользовать её ниже по шаблону.
Фильтры форматирования
Фильтры приводят данные к нужному виду. Наиболее востребованы в шаблонах RetailCRM:
date— форматирует дату:{{ order.createdAt|date("d.m.Y") }};number_format— денежный формат:{{ order.totalSumm|number_format(2, ",", " ") }};upper/lower— регистр;default— значение при пустом поле:{{ order.firstName|default("клиент") }};length— длина строки или число элементов;join— склейка массива в строку.
Фильтры можно объединять в цепочку: {{ order.firstName|default("клиент")|upper }}. Порядок важен — фильтры применяются слева направо.
Печатные формы
Печатные формы — отдельный класс шаблонов, где Twig генерирует HTML-документ для печати: счёт, накладную, ярлык на посылку. В шаблоне доступны те же объекты, что и в уведомлениях, но вёрстка полноценная — с таблицами, стилями и постраничной разбивкой.
- Задайте каркас документа на HTML с таблицей позиций;
- Внутри
{% for item in order.items %}выведите строки товаров; - Подведите итог:
{{ order.totalSumm|number_format(2, ",", " ") }}; - Добавьте реквизиты магазина и данные доставки.
Хорошие практики
Чтобы шаблоны оставались управляемыми, придерживайтесь нескольких правил:
- Экранирование. Twig по умолчанию экранирует HTML при автоэскейпинге; в письмах это защищает от поломки вёрстки данными клиента;
- Значения по умолчанию. Оборачивайте потенциально пустые поля в
default, чтобы не выводить пустоту; - Минимум логики. Сложные вычисления лучше делать в PipeLang или на стороне интеграции, а Twig оставить для вывода;
- Единый стиль. Для писем держите общий блок шапки и подвала, чтобы не дублировать вёрстку.
- Читаемость. Комментируйте нетривиальные условия тегом
{# ... #}— следующему разработчику будет проще разобраться в логике вывода.
Отдельно стоит помнить про кодировку и спецсимволы: названия товаров и адреса клиентов приходят из разных источников, поэтому в печатных формах закладывайте запас по ширине колонок и корректно обрабатывайте длинные строки, чтобы документ не разъезжался.
Итог
Twig в RetailCRM отвечает за представление: письма, SMS, сообщения и печатные документы собираются из шаблона и данных заказа. Освоив вывод, условия, циклы и фильтры форматирования, вы получаете гибкий инструмент, не выходя за пределы интерфейса.
Если шаблоны обрастают сложной логикой, интеграциями с внешними документами или требуют обмена с учётными системами, мы берём эту часть на себя: проектируем автоматизацию бизнес-процессов и разрабатываем интеграционные решения, где RetailCRM, сайт и 1С работают согласованно.
Частые вопросы
Это тот же Twig, что и в PHP-фреймворках?
Да, RetailCRM использует стандартный движок Twig с привычными тегами и фильтрами. Дополнительно доступны объекты предметной области — заказ, клиент, позиции.
Какие объекты доступны в шаблоне уведомления?
Прежде всего order с вложенными данными клиента, доставки, оплаты и позиций. Конкретный набор зависит от типа шаблона и события, которое его вызывает.
Как вывести список товаров заказа?
Используйте цикл for по order.items и выводите нужные поля каждой позиции, например offer.name и quantity. Внутри цикла доступна служебная переменная loop.
Чем отличается печатная форма от письма?
Печатная форма — это полноценный HTML-документ для печати с версткой таблиц и реквизитов, а письмо ориентировано на почтовые клиенты. Набор доступных данных схож.
Как отформатировать сумму и дату?
Для сумм применяйте фильтр number_format с указанием разделителей, для дат — фильтр date с нужным форматом. Фильтры можно комбинировать в цепочку.
Что будет, если поле пустое?
Twig выведет пустую строку. Чтобы этого избежать, оборачивайте поле в фильтр default с подстановкой запасного значения.
Можно ли использовать Twig и PipeLang вместе?
Да, они дополняют друг друга: PipeLang считает значения и условия триггеров, а Twig формирует итоговый текст сообщения или документа.
Поможем с настройкой и поддержкой Для разработчиков
Поможем с настройкой, доработкой и поддержкой Для разработчиков.