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

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

Работа с типами данных

Преобразование типа поля данных к другому типу данных

{% 
   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 возвращает массив объектов с полями: coutn productId lastUpdate

Вернуть массив заказов подписчика (аналогично GetOpens)

{{GetOrders(100, DESC, 'between 1603459057 and 1603459059')}}

Вернуть информацию о заказе со всеми товарам и параметрами по 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')
  • 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 - название поля.

Работа с блоками рекомендаций

Для получения и подстановки в емейл-сообщение товарных рекомендаций используйте метод

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}} - параметры товара, подставляемые в емейл-сообщение
Обратите внимание, что количество получаемых товаров ограничено настройкой при создании блока рекомендаций. 
Последнее изменение: 2022.08.26 12:24 — Anastasia Aniskova