Содержание

Динамический контент (ДК)

Динамический Контент (ДК) позволяет использовать скриптовый язык (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 возвращает массив объектов с полями:

Вернуть массив заказов подписчика (аналогично 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-шаблонами для динамического контента

В емейл-сообщениях вы можете использовать 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}}
{%
  });
%}

где

Обратите внимание, что количество получаемых товаров ограничено настройкой при создании блока рекомендаций.