Динамический контент позволяет использовать скриптовый язык (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)}}
В рамках этого метода для поля данных типа “Список” (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')}}
Чтобы начать использовать функции для таблиц данных, нужно создать объект/структуру, которая будет основой для запроса:
{% 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, '[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-шаблоны для динамического контента (подробнее об их создании в этом разделе).
Для использования созданного шаблона в письме необходимо обратиться к шаблону и записать информацию, которую он возвращает в переменную. Сделать это можно следующим образом:
{% 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}} {% }); %}
где
Обратите внимание, что количество получаемых товаров ограничено настройкой при создании блока рекомендаций.