Для создания шаблонов сообщений, шаблонов документов для заказов или воронок используется шаблонизатор Twig.
Доступно большинство стандартных тегов, функций и фильтров:
Теги
- if — аналогичен оператору if в PHP. Можно использовать для проверки того, является ли выражение истинным. В условиях доступен также оператор {% else %}.
Например, если в заказе есть номер из источника, то мы выводим его; если же его нет, то указываем номер заказа из CRM:
{% if model.source_uuid %}{{ model.source_uuid }}{% else %}{{ model.id }}{% endif %}
- for — цикл, который перебирает каждый элемент сущности. Используется для получения значений из массива товаров или оплат.
{% for payment in model.payments %}
{{ payment.fiscal_url }}
{% endfor %}
- set — устанавливает значение переменной. Можно добавлять свои переменные в середине кода для реализации кастомных расчетов и тому подобное.
Например, чтобы посчитать остаток к оплате в заказе, нужно получить сумму которая уже оплачена с учетом, что может быть несколько платежей.
Поэтому объявляем переменную paid_amount с начальным значением 0. Далее с помощью цикла добавляем к ней уже оплаченные суммы:
{% set paid_amount = 0 %}
{% for payment in model.payments %}
{% if payment.status == "paid" %}
{% set paid_amount = paid_amount + payment.amount %}
{% endif %}
{% endfor %}
Залишок до оплати = {{ (model.total_price - model.discount_amount + model.shipping_price - paid_amount)|format_currency('UAH', locale='uk') }}
- apply — позволяет применять фильтры к блоку данных в шаблоне.
Например, можно сделать текст в верхнем регистре:
{% apply upper %}
Цей текст буде весь великими літерами
{% endapply %}
Функции
- date() — преобразует аргумент в дату, чтобы обеспечить сравнение дат. Если аргумент не передан, функция возвращает текущую дату.\
Например, условие если дата доставки / отправки в заказе меньше чем дата, которая была 2 дня назад:
{% if date( model.shipping_date_actual) < date('-2days') %}
дата доставки/відправки була більше 2-х днів тому
{% endif %}
- max() — находит наибольшее значение в наборе или массиве чисел.
Например, если нужно получить цену продажи самого дорогого товара в заказе, чтобы применить к ней какое-то специальное предложение:
{% set prices = [] %}
{% for product in model.products %}
{% set prices = prices | merge([product.price_sold]) %}
{% endfor %}
Найдорожча ціна продажу: {{ max(prices) }} грн
- min() — находит наименьшее значение в наборе или массиве чисел.
Например, если нужно найти товар в заказе с самой низкой ценой закупки:
{% set min_product = null %}
{% set min_price = null %}
{% for product in model.products %}
{% if min_price is null or product.purchased_price < min_price %}
{% set min_price = product.purchased_price %}
{% set min_product = product.product_name %}
{% endif %}
{% endfor %}
Товар {{ min_product }}, ціна закупу {{ min_price }} грн
Фильтры
Фильтры применяются к переменным через вертикальную черту |
.
Работа с регистром и форматированием текста:
- capitalize — делает первую букву в строке заглавной, а остальные маленькие.
Например, город в адресе доставки покупатель может указать с маленькой буквы, тогда этот фильтр исправит этот момент:
{{ model.shipping_address_city|capitalize }}
- lower — форматирует все символы в строке в нижний регистр.
- upper — форматирует все символы в строке в верхний регистр.
- trim — удаляет пробелы или другие символы из начала и конца строки.
Например, обрезаем символ + в номере телефона покупателя:
{{ model.client_phone|trim('+') }}
- replace — динамически изменяю текст или форматирует его на основе переменных.
Например, если в названии товара есть слово «free», то заменять его на «Подарок»:
{% for product in model.products %}
{{ product.product_name|replace({'free': 'Подарунок'}) }}
{% endfor %}
- escape — экранирует символы в указанном формате.
- spaceless — удаляет пробелы между тегами HTML или пробелы в простом тексте.
- nl2br — заменяет перенос строки на html-тег <br>.
Форматирование чисел и валюты:
- format_number — форматирует число по заданному формату.
Например, выводим общую стоимость заказа прописью:
{{ model.grand_total|format_number(style="spellout", locale="uk") }}
- number_format — форматирует числа.
Например, если нужно вывести цену продажи товара с двумя знаками после запятой:
{{ product.price_sold|number_format(2, ',', '') }}
- format_currency — выводит число в формате заданной валюты.
Например, форматируем цену продажи товара в валюту UAH:
{{ product.product_price|format_currency('UAH', locale='uk') }}
- round — округляет число до заданной точности.
Примеры округления общей стоимости заказа:
Если требуется математическое округление до меньшего или большего:
{{ model.grand_total|round|format_currency(currency, locale='de') }}
Если требуется округление всегда до большего:
{{ model.grand_total|round(0, 'floor')|format_currency(currency, locale='de') }}
Если требуется округление всегда до меньшего:
{{ model.grand_total|round(0, 'ceil')|format_currency(currency, locale='de') }}
Работа с датами:
- date — преобразует дату в строку в указанном формате.
Примеры форматирования сегодняшней даты (можно подставлять любые переменные содержащие дату):
{{ «now»|date(«d.m.Y») }} // 05.09.2024
{{ «now»|date(«d-m-y H:i») }} // 05-09-24 11:22
{{ «now»|date(«d/m/Y H:i», «Europe/Paris») }} // 05/09/2024 13:24 - дата и время сейчас в переводе на часовой пояс Парижа
- date_modify — изменяет дату с помощью заданного условия (модификатора).
Например, добавляем к дате создания заказа 5 дней:
{{ model.created_at|date_modify("+5 day")|date("m.d.Y")}}
- format_datetime — форматирует дату и время по заданному формату.
Операции с массивами:
- first — получает первый элемент в массиве.
Например, если нужно вывести только ссылку на первый файл добавленный к заказу:
{% set filesArray = model.files|split('\n') %}
{{ filesArray|first }}
- last — получает последний элемент в массиве.
Например, если вы храните ФИО покупателей в формате «Петренко Иван» и нужно вывести только имя:
{% set foo = model.client_name|split(' ')%}
Вітаю, {{ foo|last }}!
- slice — сортирует массив значений.
Например, сортируем список названий товаров по алфавиту:
{% for key, product in model.products|sort((a, b) => a.product_name <=> b.product_name) %}
{{ product.product_name }}
{% endfor %}
- merge — объединяет массивы в один.
- reduce — позволяет последовательно обрабатывать каждый элемент массива и объединять их в одно значение.
Например, если нужно посчитать общее количество штук товара в заказе:
{{ model.products|reduce((carry, item) => carry + item.product_quantity, 0) }}
- join — формирует строку из массива путем соединения элементов массива и добавляя разделитель между ними.
- split — разделяет строку по заданному разделителю и возвращает список строк.
Например, если нужно обрезать другие свойства товара и оставлять только то, название которого вы указали:
{% for product in model.products %}
{% if product.product_properties %}
{% set properties = product.product_properties|split("\n") %}
{% for property in properties %}
{% set parts = property|split(':') %}
{% if parts|length == 2 and parts[0]|trim == 'Розмір' %}
{% set rozmir = parts[1]|trim %}
Розмір: {{ rozmir }}
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
Общие и вспомогательные:
- default — возвращает переданное значение по умолчанию, если значение не определено или пустое, иначе значение переменной.
Например, если в заказе нет телефона покупателя, то выведется текст 'не указан':
Телефон: {{ model.client_phone |default('не вказано') }}
- length — возвращает количество элементов или длину строки.
Например, если нужно посчитать количество позиций в заказе:
Всего наименований {{ model.products|length }}
- raw — получает значения в том виде, в котором они есть (без экранирования).