Динамический контент
Динамический контент позволяет использовать скриптовый язык (JavaScript), чтобы изменять содержимое каждого сообщения. Используя динамический контент, вы сможете показать различное содержание для разных пользователей в зависимости от выбранных условий. Также вы сможете вставить системные или пользовательские переменные.
Примеры самых популярных данных для вывода в сообщение:
- имя и фамилия контакта
- значения полей данных
- содержимое корзины или избранного
- просмотренные или купленные товары
Полный список данных для вывода в сообщение представлен ниже.
Данные для персонализации и постановки динамического контента хранятся в карточке контакта.
Инструкция по работе со скриптовым языком
Системные переменные
Тег персонализации формируется из системного названия поля, взятого в двойные фигурные скобки
{{fieldname_example}}
В таблице приведен перечень системных переменных, которые можно использовать в выражениях динамического контента
Основные поля
Тег | Описание | Пример |
---|---|---|
{{subscriber_email}} | емейл контакта | [email protected] |
{{subscriber_phone}} | номер телефона контакта | +71234567899 |
{{subscriber_firstname}} | имя контакта (в таком виде, как оно записано в поле) | Василий |
{{subscriber_firstname_capitalized}} | имя контакта, приведенное к стандартному виду - первая заглавная, остальные строчные | Екатерина (даже если в поле значение екатеРИНА) |
{{subscriber_lastname}} | фамилия контакта (в таком виде, как она записана в поле) | Тёркин |
{{subscriber_lastname_capitalized}} | фамилия контакта, приведенная к стандартному виду - первая заглавная, остальные строчные | Иванова (даже если в поле иванова) |
{{subscriber_name}} | имя и фамилия контакта (объединяет subscriber_firstname и subscriber_lastname) | Василий Тёркин |
{{subscriber_email_md5}} | емейл в формате MD5 хэша | b58996c504c5638798eb6b511e6f49af |
{{subscriber_email_sha256}} | SHA256 хэш от емейла | 0xC1059ED8 |
{{subscriber_id}} | уникальный ID контакта | 123 |
{{group_names}} | названия ГР, на которые подписался контакт, работает только в письмах DOI | Новостная рассылка |
Системные ссылки
Тег | Описание |
---|---|
{{link_unsubscribe}} | отписка сразу от всех групп рассылок в один клик |
{{link_unsubscribe_manager}} | менеджер отписки |
{{link_view_in_browser}} | веб-версия письма |
{{link_confirm}} | ссылка подтверждения подписки в письме-подтверждении |
Дата отправки письма
Тег | Описание | Пример |
---|---|---|
{{message_day}} | число отправки сообщения | 11 |
{{message_dayofweek}} | день недели отправки сообщения | пятница |
{{message_shortdate}} | краткая дата отправки сообщения | 11.05.2020 |
{{message_longdate}} | полная дата отправки сообщения | 11 мая 2020 г. |
{{message_month}} | месяц отправки сообщения | май |
{{message_monthnumber}} | номер месяца отправки сообщения | 05 |
{{message_year}} | год отправки сообщения | 2020 |
Информация о сообщении
Тег | Описание | Пример |
---|---|---|
{{message_id}} | ID сообщения | 11 |
{{message_guid}} | уникальный GUID отправляемого сообщения | 6F9619FF-8B86-D011-B42D-00CF4FC964FF |
{{message_subject}} | тема сообщения | Новая акция только до конца недели! |
Информация об отправителе
Тег | Описание | Пример |
---|---|---|
{{sender_fromemail}} | емейл отправителя | [email protected] |
{{sender_fromname}} | имя отправителя | Some Brand |
{{sender_replytoemail}} | емейл для ответа | [email protected] |
{{sender_replytoname}} | имя для ответа | Василий Тёркин |
Использование полей данных подписчика
Все функции динамического контента, обёрнутые в {% %}, рекомендуем дополнительно оборачивать в комментарии <!-- -->, так как символы сравнения и прочие символы в динамическом контенте конфликтуют с тегами HTML. Текст или значение, которые необходимо вывести в качестве результата, должны находиться вне комментариев.
Подстановка значения поля данных
{{extraField.Name}}
Проверить существование поля данных подписчика
{{IsExtraFieldExists('Системное имя поля данных')}}
Сравнение двух полей данных
<!--{% if (extraField.Name1 >= extraField.Name2) { %}--> Какой-либо текст <!--{% }; %}-->
Изменение значения поля данных при отправке письма
{{SetExtraField('Name', value)}}
Изменение значения поля данных при клике по ссылке в письме
<a href="{{SetExtraFieldByClick('https://link.com', 'EF_system_name', 'EF_value')}}">клик</a>
Работа с группами рассылок
Отписка персоны от конкретных групп рассылок
{{Unsubscribe('groupname', 'groupname2')}}
Отписка от конкретных групп рассылок с редиректом на указанный URL
{{UnsubscribeRedirect('link', 'groupName', 'groupName2')}}
Подписка персоны на конкретные группы рассылок
{{Subscribe('groupname', 'groupname2')}}
Подписка на конкретные группы рассылок с редиректом на указанный URL
{{SubscribeRedirect('link', 'groupName', 'groupName2')}}
Ссылка подтверждение DOI с редиректом на указанный URL
{{ConfirmRedirect('http://mysite.com/')}}
Работа со сценариями
Подстановка значения поля сценария
{{scenarioField.Name}}
Доступно только в сценарных сообщениях того сценария, в котором эти поля создаются.
Работа с типами данных
Преобразование типа поля данных к другому типу данных
{% var a = extraField.weight; var value = String(a); if (value === '60') { %} Вы весите 60 кг {% }; %}
Работа с датой и временем
Возвращает текущее время в в формате unix timestamp
{{TimeNow()}}
Возвращает переданное время в формате unix timestamp
{{TimeParse('2020-11-25 15:31')}}
Прибавляет к указанному времени нужное количество времени. Первый параметр - время в формате unix timestamp (можно получить из TimeNow() или TimeParse()). Второй параметр - единица времени, возможные значения 'sec', 'min', 'hour', 'day'. Третий параметр - количество времени (может быть отрицательным)
{{AddTime(1603459057, 'min', 3)}}
Форматирует полученное время в формате unix timestamp к переданному формату. Первый параметр - время, второй - формат. В формате передается пример того, как нужно вернуть дату или время. Формат работает по константам, например: Mon Jan 2 15:04:05 MST 2006, 2020-01-02 18:24:05 и т.д.
{{TimeFormat(1603459057, '2006-01-02 15:04:05')}}
Работа с текстом
Возвращает закодированную в Base64 строку
{{Base64Encode('Текст')}}
Декодирует строку
{{Base64Decode('0KLQtdC60YHRggoK')}}
Парсит XML в JSON
{{ParseXML('XMLcontents')}}
Работа с внешними источниками
Забирает данные с любого внешнего источника по указанной ссылке
{{HttpGet('https://link.com')}}
Сниппеты
Сниппет - это фрагмент кода или текста, который передается в транзакционные сообщения с помощью API-запросов. Значения сниппетов, используемых в транзакционных сообщениях, также можно получить с помощью функций динамического контента.
Подставить значение сниппета
{{Snippet('snippetName')}}
Проверить существование сниппета
{{IsSnippetExists('название сниппета')}}
Использование сниппета в выражении с условием
{% var value = Snippet('snippetName'); if (value === '10') { %} Значение сниппета snippetName 10 {% } else { Abort() } %}
Парсинг XML из сниппета
Значение сниппета:
<Products> <Product> <product_id>12345</product_id> </Product> </Products>
{% var xmlSnippet = Snippet('xml'); var xmlTpJson = ParseXML(xmlSnippet); //Вывод результата for(let key in xmlTpJson[0].Products.Product){ %} {{xmlTpJson[0].Products.Product[key]['product_id']}} {% } %}
Названия сниппетов должны начинаться с маленькой буквы для корректного отображения в предпросмотре и подстановке значений в тестовое письмо.
Ссылка без отслеживания
<a href="{{DoNotTrackLink('https://link.com')}}">клик</a>
Остановка отправки сообщения
С помощью JavaScript
{% if ('Какое-либо условие') { %} Какое-либо значение {% } else { Abort() } %}
С помощью динамического контента
{{Abort()}}
Работа с триггерными механиками
Подставить N последних или всех товаров из корзины
{% var str = GetCart.Products; str.forEach(function(item, i, arr) { %} {{item.productId}} {% }); %}
Подставить N последних или всех товаров из избранного
{% var str = GetFavourite.Products; str.forEach(function(item, i, arr) { %} {{item.productId}} {% }); %}
Вернуть массив открытий подписчика
Принимает 3 и более параметров. Первый параметр - максимальное количество получаемых записей (максимум 100, если передать ноль, то будет 100). Второй параметр - сортировка по дате (возможные значения - DESC, ASC, Newest, Oldest). Третий параметр - фильтр по дате (должен выглядеть как строка с оператором и датой в формате unix timestamp. Возможные операторы >,>=,<,⇐,!=,=. Время можно получить методами работы со временем). Можно передавать несколько фильтров, например: GetOpens(10, Newest, '!= 1603459057', '!= 1603459058'), все фильтры работают через логическое и. Третий параметр может работать как период: возможные варианты - 'between 1603459057 and 1603459059', 'from 1603459057 to 1603459059'. 'from 1603459057 and 1603459059' тоже будет работать, нечувствителен к регистру, так же можно добавлять несколько таких параметров.
{{GetOpens(10, Newest, '< 1609888844')}}
Метод GetOpens возвращает массив объектов с полями:
- count
- productId
- lastUpdate
Вернуть массив заказов подписчика (аналогично GetOpens)
{{GetOrderList(100, DESC, 'between 1603459057 and 1603459059')}}
Метод GetOrderList возвращает массив объектов с полями:
- items
- order
- orderId
- orderDate
Вернуть информацию о заказе со всеми товарам и параметрами по ID заказа
{{GetOrder('orderId')}}
Работа с таблицами данных
Чтобы начать использовать функции для таблиц данных, нужно создать объект/структуру, которая будет основой для запроса:
{% var rows = Rows(); %}
Чтобы исполнить запрос в таблицу данных, все запросы в динамическом контенте всегда нужно заканчивать функцией Execute()
{% var rows = Rows().Execute(); %}
Добавить таблицу можно методом
Table('TableName')
Если этот метод будет вызван больше одного раза к одному объекту Row, произойдет ошибка.
Для работы с таблицами доступны следующие методы:
- Get() - забирает одну или несколько строк. Максимальны лимит и дефолтное значение 500.
- GetAndDelete() - забирает одну строку и удаляет её из таблицы.
- Update() - обновляет строку или несколько строк, принимает как аргумент название столбца и значение, которые нужно изменить. Можно несколько.
- Delete() - удаляют строки по условию.
- Insert() - добавляют строку или несколько строк.
- Upsert() - добавляют строку или несколько строк, если строки существуют - обновляют их.
- IsExist() - возвращает булево значение существования строки по условиям.
Вспомогательные функции:
- Limit(10) - ограничивает количество возвращаемых строк. Работает только с методом Get, в остальных ничего не сделает, но и ничего не сломает
- Offset(3) - Смещает поиск на указанное количество строк. Аналогия slq. Работает только с методом Get, в остальных ничего не сделает, но и ничего не сломает
- OrderBy('colName', DESC) - сортировка. Значения сортировки описаны ниже. Аналогия slq. Работает только с методом Get, в остальных ничего не сделает, но и ничего не сломает
- Where('colName', 'operator', 'val') - Условия. Принимает в себя параметры - название колонки, оператор, значения. Список операторов ниже.
Если значений будет несколько, они будут идти через логическое ИЛИ, пример: Where('colName', 'operator', 'val', 'pal', 'cal'). Если сделать два условия к одному объекту Row, то они будут идти через логическое И, пример: Where('colName', 'operator', 'val').Where('colName2', 'operator', 'pal'). Работает со всеми функциями, кроме Insert и Upsert.
- Set('colName', 'val') - устанавливает значение столбца. Можно передавать больше одной пары. Но если количество входящих данных будет не четным, последний элемент будет отсечен, чтобы сохранился порядок (название столбца/значение). Используется с методами Insert, Upsert, Update
- NewRow() - команда, которая позволяет сохранять больше одной строки. Чтобы понять, как это работает, разберем пример:
Rows().Insert().Table('someTable').Set('colName', 'val').Execute() - объявляем метод добавления строки и говорим, чтобы он добавил значение val в столбец colName. Допустим, мы хотим сохранить еще одну строку, но чтобы в столбце colName было другое значение. Rows().Insert().Table('someTable').Set('colName', 'val').NewRow().Set('colName', 'val2').Execute() - таким образом у нас в таблице окажется две строки.
Особенности работы с таблицами данных:
- Все функции можно добавлять в разном порядке, но только Rows должна быть на первом месте, а Execute на последнем.
- Можно дублировать функции Where, Set, NewRow
- Можно дублировать функции Limit, Offset, OrderBy, но актуальным будет только последнее значение
- В функции, которые изменяют данные Insert, Update, Upsert можно сразу писать пары название столбца/значения, минуя функцию Set: Rows().Insert('colName', 'val').Table('someTable')
- Чтобы указать какие столбцы вернуть методом Get или GetAndDelete, в эти функции можно передать названия столбцов: Get('col1', 'col2'…). Если ничего не передать, то вернутся все столбцы. Можно передать символ *, в это случае так же вернутся все столбцы. Пример: Get('*') - обязательно в кавычках, иначе компилятор расценит это как знак умножения.
- Дату нужно передавать в timestamp. Для этого можно использовать функцию TimeParse(), DateParse(). Например, Where('date',inthisday,DateParse('2021-05-27')))
- При добавлении строк в таблицы в функции Insert, Upsert, Set обязательно должен присутствовать первичный ключ, если он есть в таблице (например, Rows().Insert().Table('new_norm_table').Set('text', 'Независимые СМИ потому и независимы, что в провинциях ещё есть чем поживиться', 'num', 1000).Execute(), где num - primary key)
- Операторы и сортировки, записываются без кавычек
Сортировки
- ASC - сортирует от низких значений к высоким. OrderBy('num', ASC) или OrderBy('num', asc)
- DESC - сортирует от высоких значений к низким. OrderBy('num', DESC) или desc - OrderBy('num', desc)
- oldest - самое низкое значение. OrderBy('num', oldest)
- newest - самое высокое значение. OrderBy('num', newest)
Операторы
- equal, eq, EQ - равенство. Where('num', equal, '111'), Where('num', eq, '111'), Where('num', EQ, '111')
- notequal, ne, NE - неравенство. Where('num', notequal, '111')
- beginwith - начинается с. Where('email', beginwith, 'qwe')
- endwith - оканчивается на. Where('email', endwith, 'qwe')
- contains - содержит. Where('email', contains, 'qwe')
- notcontains - не содержит. Where('email', notcontains, 'qwe')
- morethan - больше, чем. Where('num', morethan, '111')
- moreorequalthan - больше или равно, чем. Where('num', moreorequalthan, '111')
- lessthan - меньше, чем. Where('num', lessthan, '111')
- lessorequalthan - меньше или равно, чем. Where('num', lessorequalthan, '111')
- between - между. Where('num', between, '111', '11111')
- isNull - равен нулю. Where('num',isNull,'')
- today - текущий день. Where('date',today,'') - значение указывать не надо
- inthisday - в конкретный день. Where('date',inthisday,DateParse('2021-05-27') - условие по дню, равному 27
- inthisyear - текущий год. Where('date',inthisyear,'') - значение указывать не надо
- inthismonth - текущий месяц. Where('date',inthisday,'') - значение указывать не надо
Операторы арифметических операций записываются в кавычках, их тоже можно использовать (Where('num', '=', '1'))
- '='
- '<'
- '<='
- '>'
- '>='
- '!='
Примеры:
Rows().Get('*').Table('norm_table').Where('num', lessthan, '111').Execute(); Rows().Get('*').Table('norm_table').Limit(10).Where('num', '=', '1').Execute(); Rows().Get('*').Table('norm_table').Where('num', between, '111', '11111').Execute(); Rows().Get('*').Table('norm_table').Where('email', startwith, 'qwe').Execute(); Rows().Get('*').Table('norm_table').Where('email', notcontains, 'yopmail').Where('email', ne, '[email protected]').Execute(); Rows().Insert().Table('new_norm_table').Set('text', 'Независимые СМИ потому и независимы, что в провинциях ещё есть чем поживиться', 'num', 1000).Execute(); Rows().Get('*').Table('norm_table').Where('email', equal, '[email protected]', '[email protected]').Execute(); Rows().Delete().Table('new_norm_table').Where('num', '=', '2').Execute();
Вывод строки/поля в письме
Вывод результата записывается в следующем виде:
{{название переменной[номер строки].название столбца}}
Пример для переменной rows и первой строки столбца value:
{{rows[0].value}}
Работа с SQL-шаблонами для динамического контента
В емейл-сообщениях вы можете использовать SQL-шаблоны для динамического контента (подробнее об их создании в этом разделе).
Для использования созданного шаблона в письме необходимо обратиться к шаблону и записать информацию, которую он возвращает в переменную. Сделать это можно следующим образом:
{% var name = GetByTemplate(123); %}
где:
- name - название переменной;
- 123 - id SQL-шаблона.
Для шаблона с параметром код будет выглядеть так:
{% var name = GetByTemplate(123,{'param':value}); %}
где:
- name - название переменной;
- 123 - id SQL-шаблона;
- param - название параметра в SQL-шаблоне;
- value - значение, которое необходимо подставить в параметр.
Вывод значения в письме будет стандартным :
{{name[0].field}}
где:
- name - название переменной;
- 0 - номер (индекс) строки;
- field - название поля.
Работа с товарами
Метод для получения массива товаров с параметрами по идентификаторам. Для работы метода необходимо настроить импорт товарного каталога в enKod.
GetProducts('productid1', 'productid2')
где
- productid1 и productid2 - идентификаторы товаров в каталоге
Пример для получение товаров 3FF144 и 341FFDW с параметрами
{% var str = GetProducts('3FF144', '341FFDW'); str.forEach(function(item, i, arr) { %} Идентификатор товара {{item.id}} Название товара {{item.name}} Категория товара {{item.category}} Любой другой параметр товара {{item.param}} {% }); %}
Работа с блоками рекомендаций
Для получения и подстановки в емейл-сообщение товарных рекомендаций используйте метод
GetRecoms('scriptId', 'productId')
где
- scriptId - id блока рекомендаций в сервисе (обязательно)
- productId - идентификатор товара, к которому необходимо подобрать рекомендации для алгоритмов похожих или сопутствующих товаров (необязательно)
Чтобы получить параметры товара, необходимые для подстановки в письмо, используйте конструкцию вида
{{item.info.param}}
где
- param - название необходимого параметра из товарного фида
Для записи в переменную значений, а также последовательного вывода в письмо товаров, получаемых с помощью метода, используйте конструкцию
{% var str = GetRecoms('scriptId', ''); str.forEach(function(item, i, arr) { %} Идентификатор товара {{item.id}} Название товара {{item.info.name}} Категория товара {{item.info.category}} Любой другой параметр товара {{item.info.param}} {% }); %}
где
- scriptId - идентификатор блока рекомендаций
- {{item.id}}, {{item.info.name}}, {{item.info.category}}, {{item.info.param}} - параметры товара, подставляемые в емейл-сообщение
Обратите внимание, что количество получаемых товаров ограничено настройкой при создании блока рекомендаций.