Динамический контент позволяет использовать скриптовый язык (JavaScript), чтобы изменять содержимое каждого сообщения. Используя динамический контент, вы сможете показать различное содержание для разных пользователей в зависимости от выбранных условий. Также вы сможете вставить системные или пользовательские переменные.
Примеры самых популярных данных для вывода в сообщение:
Полный список данных для вывода в сообщение представлен ниже.
Данные для персонализации и постановки динамического контента хранятся в карточке контакта.
Тег персонализации формируется из системного названия поля, взятого в двойные фигурные скобки
{{fieldname_example}}
В таблице приведен перечень системных переменных, которые можно использовать в выражениях динамического контента
Основные поля
| Тег | Описание | Пример |
|---|---|---|
| {{subscriber_email}} | емейл контакта | user@example.com |
| {{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}} | емейл отправителя | news@somebrand.com |
| {{sender_fromname}} | имя отправителя | Some Brand |
| {{sender_replytoemail}} | емейл для ответа | feedback@somebrand.com |
| {{sender_replytoname}} | имя для ответа | Василий Тёркин |
Все функции динамического контента, обёрнутые в {% %}, рекомендуем дополнительно оборачивать в комментарии <!-- -->, так как символы сравнения и прочие символы в динамическом контенте конфликтуют с тегами HTML. Текст или значение, которые необходимо вывести в качестве результата, должны находиться вне комментариев.
Подстановка значения поля данных
{{extraField.Name}}
Проверить существование поля данных подписчика
{{IsExtraFieldExists('Системное имя поля данных')}}
Сравнение двух полей данных
<!--{%
if (extraField.Name1 >= extraField.Name2) { %}-->
Какой-либо текст
<!--{% }; %}-->
Изменение значения поля данных при отправке письма
{{SetExtraField('Name', value)}}
В рамках этого метода для поля данных типа “Список” (list) запрещено передавать значения (value), не созданные заранее в интерфейсе enKod.
Изменение значения поля данных при клике по ссылке в письме
<a href="{{SetExtraFieldByClick('https://link.com', 'EF_system_name', 'EF_value')}}">клик</a>
В рамках этого метода для поля данных типа “Список” (list) запрещено передавать значения (EF_value), не созданные заранее в интерфейсе enKod.
Отписка персоны от конкретных групп рассылок
{{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()}}
Примеры кода динамического контента для подстановки в письма вы можете найти в этом разделе базы знаний.
В примерах описаны варианты реализации триггеров:
Обратите внимание, что предварительно необходимо настроить импорт товарного фида.
Ниже приведен список всех доступных на данный момент функций для работы с триггерными механиками.
Подставить все товары из корзины
{%
var str = GetCart.Products;
str.forEach(function(item, i, arr) {
%}
{{item.productId}}
{%
});
%}
Подставить все товары из избранного
{%
var str = GetFavourite.Products;
str.forEach(function(item, i, arr) {
%}
{{item.productId}}
{%
});
%}
Подставить N последних или все товары из сравнения
{%
var str = GetComparison(N).Products;
str.forEach(function(item, i, arr) {
%}
{{item.productId}}
{%
});
%}
, где N - количество необходимых для вывода в письмо товаров (для вывода всех товаров из сравнения используйте GetComparison().Products)
Подставить N товаров из последних M просмотренных категорий
{%
var str = OpenedCategoryItems(N, M).Get();
str.forEach(function(item, i, arr)
%}
{{item.productId}}
{%
});
%}
, где:
При этом, полученные товары можно:
Пример использования:
OpenedCategoryItems(10, 4).FilterBy("price", >, "1500").OrderBy("price",ASC).FilterBy("color", equal, "blue").FilterBy("size", equal, "S").OrderBy("rate",DESC).Get();
, где:
Вернуть массив открытий подписчика
Принимает 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 возвращает массив объектов с полями:
Вернуть массив заказов подписчика (аналогично GetOpens)
{{GetOrderList(100, DESC, 'between 1603459057 and 1603459059')}}
Метод GetOrderList возвращает массив объектов с полями:
Вернуть информацию о заказе со всеми товарам и параметрами по ID заказа
{{GetOrder('orderId')}}
Получить N пользовательских событий с параметрами за период
{%
var str = GetCustomEvent('eventname',10,'between 1603459057 and 1603459059');
str.forEach(function(item, i, arr) {
%}
Параметр 1 - {{item.params.param1}} <br>
Параметр 2 - {{item.params.param2}} <br>
{%
});
%}
где:
eventname - системное имя пользовательского события. Обязательный параметр, 10 - количество пользовательских событий, которое необходимо получить. Необязательный фильтр:between 1603459057 and 1603459059 - период, за который необходимо получить события. Необязательный фильтр:'between 1603459057 and 1603459059';'from 1603459057 to 1603459059';'from 1603459057 and 1603459059';
Обратите внимание: в ответе значения параметров возвращаются в виде строки. Если вам понадобится использовать значения параметров для арифметических вычислений, то вы можете воспользоваться функциями parseInt и parseFloat для приведения строки к числу.
Чтобы начать использовать функции для таблиц данных, нужно создать объект/структуру, которая будет основой для запроса:
{% var rows = Rows(); %}
Чтобы исполнить запрос в таблицу данных, все запросы в динамическом контенте всегда нужно заканчивать функцией Execute()
{% var rows = Rows().Execute(); %}
Добавить таблицу можно методом
Table('TableName')
Если этот метод будет вызван больше одного раза к одному объекту Row, произойдет ошибка.
Для работы с таблицами доступны следующие методы:
Вспомогательные функции:
Если значений будет несколько, они будут идти через логическое ИЛИ, пример: Where('colName', 'operator', 'val', 'pal', 'cal'). Если сделать два условия к одному объекту Row, то они будут идти через логическое И, пример: Where('colName', 'operator', 'val').Where('colName2', 'operator', 'pal'). Работает со всеми функциями, кроме Insert и Upsert.
Rows().Insert().Table('someTable').Set('colName', 'val').Execute() - объявляем метод добавления строки и говорим, чтобы он добавил значение val в столбец colName. Допустим, мы хотим сохранить еще одну строку, но чтобы в столбце colName было другое значение. Rows().Insert().Table('someTable').Set('colName', 'val').NewRow().Set('colName', 'val2').Execute() - таким образом у нас в таблице окажется две строки.
Особенности работы с таблицами данных:
Сортировки
Операторы
Операторы арифметических операций записываются в кавычках, их тоже можно использовать (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, 'qwe@qwe.ru').Execute();
Rows().Insert().Table('new_norm_table').Set('text', 'Независимые СМИ потому и независимы, что в провинциях ещё есть чем поживиться', 'num', 1000).Execute();
Rows().Get('*').Table('norm_table').Where('email', equal, 'qwerty@qwe.ru', 'qwe@qwe.ru').Execute();
Rows().Delete().Table('new_norm_table').Where('num', '=', '2').Execute();
Вывод строки/поля в письме
Вывод результата записывается в следующем виде:
{{название переменной[номер строки].название столбца}}
Пример для переменной rows и первой строки столбца value:
{{rows[0].value}}
В емейл-сообщениях вы можете использовать SQL-шаблоны для динамического контента (подробнее об их создании в этом разделе).
Для использования созданного шаблона в письме необходимо обратиться к шаблону и записать информацию, которую он возвращает в переменную. Сделать это можно следующим образом:
{% var name = GetByTemplate(123); %}
где:
Для шаблона с параметром код будет выглядеть так:
{% var name = GetByTemplate(123,{'param':value}); %}
где:
Вывод значения в письме будет стандартным :
{{name[0].field}}
где:
Метод для получения массива товаров с параметрами по идентификаторам. Для работы метода необходимо настроить импорт товарного каталога в enKod.
GetProducts('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')
где
Чтобы получить параметры товара, необходимые для подстановки в письмо, используйте конструкцию вида
{{item.info.param}}
где
Для записи в переменную значений, а также последовательного вывода в письмо товаров, получаемых с помощью метода, используйте конструкцию
{%
var str = GetRecoms('scriptId', '');
str.forEach(function(item, i, arr) {
%}
Идентификатор товара {{item.id}}
Название товара {{item.info.name}}
Категория товара {{item.info.category}}
Любой другой параметр товара {{item.info.param}}
{%
});
%}
где
Обратите внимание, что количество получаемых товаров ограничено настройкой при создании блока рекомендаций.