суббота, 15 ноября 2014 г.

Расширение почтовых шаблонов

Вообще невозможность сделать это является камнем преткновения в шаблонах почтовых сообщений Битрикс.
В шаблонах нельзя задавать циклы! Циклы в почтовых шаблонах задавать нельзя!
Если, например, в письме рассылать список товаров, то приходится либо захардкодить все html-оформление, либо вынести шаблон товара например в языковой файл.
В любом случае требуется какое-то взаимодействие с кодом.

Однажды я решил понять, как же засунуть в шаблоны циклы. Как оказалось - это возможно и я даже реализовал простейший модуль, в котором сторонний шаблонизатор обрабатывает свой блок разметок и отдает контент обратно в шаблон Битрикс.

Тем кому не терпится скачать - ссылка на github. Краткое README там имеется, но я еще его тут повторю.

Итак, установка:
1. Клонируем репозиторий в свой битриксовый сайт в каталог с модулями. Обычно это /bitrix/modules/ или (если вы следуете новой моде) /local/modules/
Важно: папка с модулем должна называться um.mail_template (хотя сам проект называется по-другому)
Пример git-команды:
git clone https://github.com/u-mulder/ummailtemplates.git um.mail_template
2.Из админки стандартными средствами устанавливаем модуль.
3. Редактируем нужный почтовый шаблон.

Настройка шаблона:
по умолчанию, в комплект модуля сразу включен шаблонизатор Twig и модуль настроен на работу с ним. Чтобы выбранный почтовый шаблон передался на обработку Твигу, делаем следующее:
раскрываем дополнительные поля почтового шаблона и прописываем в поле FIELD1 или FIELD2 название TWIG_USED и значение, конвертируемое в булевое true.

Затем размещаем блок разметки, основываясь на следующих правилах:
1. Блок начинается и заканчивается тегами #FOR_LOOP_START_# и #FOR_LOOP_END_# с одинаковыми цифровыми окончаниями, например, #FOR_LOOP_START_2# и #FOR_LOOP_END_2#, пары типа #FOR_LOOP_START_ABD# и #FOR_LOOP_END_ABD# не распознаются

2. После #FOR_LOOP_START_# идет тег #LOOP_SOURCE:ORDERS#, где ORDERS - название поля в параметре $arFields функций CEvent::Send/SendImmediate, под этим же названием, но в нижнем регистре (orders) значение поля $arFields будет передано в шаблонизатор. Внимание, значение поля должно быть предварительно сериализовано!

3. После #LOOP_SOURCE:ORDERS# идет обычная разметка Twig.

Например, учитывая все вышесказанное, блок разметки может выглядеть так:
#FOR_LOOP_START_1##LOOP_SOURCE:ORDERS#
{% for idx, order in orders %}
<a href="http://#SITE_NAME#/{{%20order.link%20}}">{{ order.name }} [{{ order.qty }}]</a><br />
{% endfor %}
#FOR_LOOP_END_1#

Здесь:
  • указана область для разметки Twig парой тегов #FOR_LOOP_START_1#, #FOR_LOOP_END_1#
  • указан ключ ORDERS массива $arFields, который будет передан в шаблонизатор параметром orders
  • указана разметка шаблонизатора.

Вызов функции CEvent::Send выглядит так:
CEvent::Send(
    'EVENT_NAME',
    'site_id',
    array(
        ...
        'ORDERS' => serialize($some_array),
        ...
    )
);

Приветствуется всякое комментаторство и форкание, ибо протестирован шаблонизатор только на поддержку циклов for

Комментариев нет:

Отправить комментарий