Содержание

Настройка динамического контента для триггерных механик

Если для хранения информации о товарах в enKod вы используете товарный фид, то для работы с динамическим контентов триггерных механик вы можете воспользоваться готовым кодом из этой инструкции.

Брошенная корзина

Представим, что в письмо вам нужно выводить товары из корзины друг под другом, а также указывать у каждого товара все параметры, которые отображены в вёрстке:

Для данной задачи можно использовать код:

<!--{%
var noPhotoPicture = "Ссылка на картинку-заглушку";
let productsCardAll = GetCart.Products;
let productsId = new Array();

productsCardAll.forEach(product => {
    productsId.push(product.productId.toString());
});

var productsCard = GetProducts(...productsId);

if(!productsCard || productsCard.length == 0) Abort();

for (var i = 0; i < productsCard.length; i++){
    productsCard[i].count = productsCardAll.find(product => product.productId == productsCard[i].productId).count;
}

for (var i = 0; i < productsCard.length; i++){
    var url = productsCard[i].url;
    if (productsCard[i].picture){
    if (productsCard[i].picture.includes(",")) var picture = productsCard[i].picture.split(',')[0];
    else var picture = productsCard[i].picture;
    }
    else var picture = noPhotoPicture; 
    var name = productsCard[i].name;
    var price = productsCard[i].price;
    var count = productsCard[i].count;
//Здесь можно добавить любые иные необходимые вам переменные по аналогии.
%}-->

Этот код нужно разместить перед карточкой товара (как на примере выше, между тегами </div> и <div>), предварительно заменив:

Если в карточке товара присутствуют другие параметры, которые выводятся в письмо, нужно создать новую переменную с понятным названием. Например, если это артикул, то id; если это цвет, то color – так, чтобы по названию можно было понять, какое значение лежит в этой переменной, и записать в неё значение из параметра объекта 'productsCard' (productsCard[порядковый_номер_товара_в_выборке].название_параметра):

var id = productsCard[i].id; 

Далее в самой верстке нужно расставить динамический контент, чтобы нужные значения выводились в письме у получателей:

Ссылка на изображение товара подставляется внутрь кавычек атрибута src=«{{picture}}» тега img.

Вместо названия товара в тексте сообщения укажите {{name}}.

Вместо номера артикула укажите {{id}}.

Цена товара - {{price}}.

Количество товаров - {{count}}.

Ссылка на товар подставляется внутрь кавычек атрибута href=«{{url}}» тега a.

После вёрстки блока с товаром вставляем следующий код, который определяет границы цикла, в рамках которого мы выводим товары:

<!--{%
	}
%}-->

Таким образом происходит вывод товаров из корзины в письмо. Если у вас верстка не с такой структурой, а, например, с двумя или тремя товарами в ряд, то нужно будет перед выводом блока проверять, не закончились ли товары для вывода, иначе может появиться ошибка.

Обычно такая проверка выглядит так (код вставляется перед версткой каждой карточки товара):

<!--{%
    if (i + 1 < productsCard.length){
    i++;
    var url = productsCard[i].url;
    if (productsCard[i].picture){
    if (productsCard[i].picture.includes(",")) var picture = productsCard[i].picture.split(',')[0];
    else var picture = productsCard[i].picture;
    }
    else var picture = noPhotoPicture; 
    var name = productsCard[i].name;
    var price = productsCard[i].price;
    //Здесь вы можете ввести дополнительные переменные, если они вам требуются
%}-->

После каждой карточки товара нужно будет вставить следующий код, чтобы обозначить границы действия условия if:

<!--{%
	}
%}-->

Брошенный просмотр

Брошенный просмотр реализуется по аналогии с брошенной корзиной, но требуется ряд изменений в коде:

<!--{%
var noPhotoPicture = "Ссылка на картинку-заглушку";
var open = GetOpens(100, Newest);
var unicOpens = [...open].reduce((a, c) => (a.map(e=>e.productId).includes(c.productId) || a.push(c), a), []);//в этой строке происходит выбор уникальных товаров
if (!unicOpens || unicOpens.length == 0) Abort();

let productsId = new Array();

 unicOpens.forEach(product => {
   productsId.push(product.productId.toString());
 });

var productsOpen = GetProducts(...productsId);

if(!productsOpen || productsOpen.length == 0) Abort();

for (var i = 0; i < productsOpen.length; i++){
if (i == 6) break;
if (productsOpen[i].picture){
if (productsOpen[i].picture.includes(",")) var picture = productsOpen[i].picture.split(',')[0];
else var picture = productsOpen[i].picture;
}
else var picture = noPhotoPicture; 
var price = productsOpen[i].price;
var url = productsOpen[i].url;
var name = productsOpen[i].name;
//Здесь можно добавить любые иные необходимые вам переменные по аналогии
%}-->

Далее идёт вывод переменных в вёрстку, как в случае с корзиной. Например:

Не забудьте определить границы цикла, после блока с товаром подставить код:

<!--{%
	}
%}-->

Если у вас верстка с отличной от описанного структурой, например, с двумя или тремя товарами в ряд, то нужно будет перед выводом блока проверять, не закончились ли товары для вывода, иначе может появиться ошибка. Обычно такая проверка выглядит так (код вставляется перед версткой каждой карточки товара):

<!--{%
if (i + 1 < productsOpen.length){
i++;
if (i == 6) break;
if (productsOpen[i].picture){
if (productsOpen[i].picture.includes(",")) var picture = productsOpen[i].picture.split(',')[0];
else var picture = productsOpen[i].picture;
}
else var picture = noPhotoPicture; 
var price = productsOpen[i].price;
var url = productsOpen[i].url;
var name = productsOpen[i].name;
%}-->

Следующий код нужно вставить после каждой карточки с товаром, чтобы обозначить границы действия условия if:

<!--{%
	}
%}-->

Брошенное избранное

Письмо с товарами, брошенными в избранном, похожи на брошенную корзину – отличается только название переменных.

Код для вставки:

<!--{%
var noPhotoPicture = "Ссылка на картинку-заглушку";

var favourite = GetFavourite.Products;
let productsId = new Array();

favourite.forEach(product => {
  productsId.push(product.productId.toString());
});

var productsFavourite = GetProducts(...productsId);

if(!productsFavourite || productsFavourite.length == 0) Abort();

for (var i = 0; i < productsFavourite.length; i++){
if (productsFavourite[i].picture){
if (productsFavourite[i].picture.includes(",")) var picture = productsFavourite[i].picture.split(',')[0];
else var picture = productsFavourite[i].picture;
}
else var picture = noPhotoPicture; 
var price = productsFavourite[i].price;
var url = productsFavourite[i].url;
var name = productsFavourite[i].name;
//Здесь можно добавить любые иные необходимые вам переменные по аналогии
%}-->

Далее идёт вывод переменных в вёрстку, как в случае с корзиной. Например:

Не забудьте определить границы цикла, после блока с товаром подставить код:

<!--{%
	}
%}-->

Если у вас верстка с отличной от описанного структурой, например, с двумя или тремя товарами в ряд, то нужно будет перед выводом блока проверять, не закончились ли товары для вывода, иначе может появиться ошибка. Обычно такая проверка выглядит так (код вставляется перед версткой каждой карточки товара):

<!--{%
if (i + 1 < productsFavourite.length) {
i++;
if (productsFavourite[i].picture){
if (productsFavourite[i].picture.includes(",")) var picture = productsFavourite[i].picture.split(',')[0];
else var picture = productsFavourite[i].picture;
}
else var picture = noPhotoPicture; 
var price = productsFavourite[i].price;
var url = productsFavourite[i].url;
var name = productsFavourite[i].name;
%}-->

Следующий код нужно вставить после каждой карточки с товаром, чтобы обозначить границы действия условия if:

<!--{%
	}
%}-->