Довідник Velocity
Довідник синтаксису Velocity в eSputnik.
Практичні приклади — у статтях Velocity у повідомленнях і Velocity у сценаріях.
Формати змінних
| Формат | Опис |
|---|---|
$discount | Якщо змінна не існує — виводиться буквальний текст $discount |
$!discount | Якщо значення відсутнє — нічого не виводиться |
${discount} | Фігурні дужки однозначно відокремлюють ім'я змінної від сусіднього тексту |
$!{discount} | Коректно відокремлює змінну та приглушує відсутні значення |
${discount|$otherGift} | Якщо значення змінної відсутнє, підставляє запасне значення |
Вкладені об'єкти
Для доступу до полів всередині об'єкта використовуйте крапкову нотацію:
$item.name$lastProductAdded.externalItemId$manager.phone
Масиви та індекси
Доступ до елемента за індексом (нумерація з 0):
$!arrayName[0]$!items[0].parameterName
Якщо вказаного індексу не існує — під час відправлення станеться помилка. Використовуйте цикл, якщо розмір масиву заздалегідь невідомий.
Отримати розмір масиву:
$!arrayName.size()
Примітка: Точний шлях доступу залежить від структури події. Деякі події містять простий масив, інші — об'єкт із полем
arrayвсередині.
Цикли
Ітерація по всіх елементах масиву через #foreach:
#foreach($item in $!arrayName)
$foreach.count: $!item.name
#end$foreach.count — лічильник циклу, починається з 1.
Зупинити цикл достроково через #break:
#foreach($item in $!arrayName)
$!item.name
#if($foreach.count > 5) #break #end
#endВ HTML-коді email директиви загортаються в коментарі: <!--#foreach(...)-->, <!--#end-->
Надання значення
Присвоїти значення змінній для повторного використання в шаблоні:
#set($var = 'value')
#set($total = $mathTool.add($price, $tax))Умови
Базова умова:
#if($!param == 'value')
контент
#endЗ альтернативою:
#if($!param == 'value')
контент
#else
альтКонтент
#endКілька умов:
#if($!param == 'value1')
контент1
#elseif($!param == 'value2')
контент2
#else
альтКонтент
#endПеревірка на непорожнє значення:
#if($!param && $!param != '')
контент
#endОператори
Порівняння
| Оператор | Значення |
|---|---|
== | Дорівнює |
!= | Не дорівнює |
gt | Більше |
lt | Менше |
ge | Більше або дорівнює |
le | Менше або дорівнює |
Логічні
| Оператор | Значення |
|---|---|
&& або and | Логічне І |
|| або or | Логічне АБО |
! або not | Логічне НЕ |
Порівняння рядків
$!firstString.equals($!secondString)$!firstString.equalsIgnoreCase($!secondString)
Арифметика
$mathTool.add($v1, $v2)$mathTool.sub($v1, $v2)$mathTool.mul($v1, $v2)$mathTool.div($v1, $v2)
Форматування чисел
Ціле число без округлення:
$numberTool.integer($v1)
Грошова сума з двома десятковими знаками:
$!numberTool.format('#.00', $v1)
Дати
Виведення
Поточна дата:
$!dateTool.currentDate()$!dateTool.currentDate('dd.MM.yyyy HH:mm:ss', 'GMT+3')
Поточний Unix timestamp:
$!dateTool.currentTimeStamp()
Форматування дати з події або поля контакту:
$!dateTool.formatDate('dd.MM.yyyy', $!date)$!dateTool.formatDate('yyyy-MM-dd HH:mm:ss', $!date)
Форматування в часовому поясі контакту:
$!dateTool.formatInContactTimezone('dd/MM/yyyy HH:mm:ss', $!dateTime)
Арифметика
За умови "date": "01/01/2020 12:00":
$!dateTool.addYears($!date, 2)→ 01/01/2022 12:00$!dateTool.addMonths($!date, 5)→ 01/06/2020 12:00$!dateTool.addDays($!date, 15)→ 16/01/2020 12:00$!dateTool.addHours($!date, 7)→ 01/01/2020 19:00$!dateTool.addMinutes($!date, 15)→ 01/01/2020 12:15
Від'ємне значення — віднімання:
$!dateTool.addDays($!date, -7)
З користувацьким форматом вхідної дати — за умови "customDate": "12:00 2020-30-04":
$!dateTool.addYears($!customDate, 2, 'HH:mm yyyy-dd-MM')→ 12:00 2022-30-04
З користувацьким форматом вхідної та вихідної дати — за умови "dateTime": "2020-05-01T00:00":
$!dateTool.addDays($!dateTime, 2, "yyyy-MM-dd'T'HH:mm", 'dd-MM-yyyy')→ 03-05-2020$!dateTool.addHours($!dateTime, 7, "yyyy-MM-dd'T'HH:mm", 'dd/MM HH:mm')→ 01/05 07:00$!dateTool.addMinutes($!dateTime, 2, "yyyy-MM-dd'T'HH:mm", 'HH:mm')→ 00:02
Різниця між двома датами
За умови "firstDate": "01/01/2019", "secondDate": "05/05/2020":
$!dateTool.diff($!firstDate, $!secondDate, 'YEARS')→ 1$!dateTool.diff($!firstDate, $!secondDate, 'MONTHS')→ 16$!dateTool.diff($!firstDate, $!secondDate, 'DAYS')→ 490$!dateTool.diff($!firstDate, $!secondDate, 'HOURS')→ 11760$!dateTool.diff($!firstDate, $!secondDate, 'MINUTES')→ 705600
З користувацьким форматом — за умови "customDate1": "17:15 05/05/2020", "customDate2": "10:05 01/01/2019":
$!dateTool.diff($!customDate1, $!customDate2, 'HH:mm dd/MM/yyyy', 'MINUTES')→ 706030
Рядки
Довжина рядка:
$!var.length()
Частина рядка:
$!var.substring(startIndex, endIndex)
Заміна частини рядка:
$!var.replace('oldValue', 'newValue')
Зміна регістру:
#set($example = 'Ukraine')
$example.toUpperCase() → UKRAINE
$example.toLowerCase() → ukraineДані зовнішніх джерел
Дані зовнішніх джерел доступні у Velocity, якщо відповідне джерело підключено і його значення доступні в поточному контексті.
Синтаксис — той самий, що використовується для інших даних в eSputnik.
Точний шлях до змінної залежить від структури даних, що повертаються джерелом, і назв полів у конфігурації джерела. Використовуйте назви полів і структуру даних, доступні в налаштуваннях джерела або тестовому запиті.
Дані вебхука
Звертайтеся до полів за назвами, що повертаються у відповіді вебхука, відповідно до її структури. Як і для інших джерел даних, доступність залежить від поточного контексту.
У системі eSputnik можливість динамічного контенту реалізовано за допомогою бібліотеки Apache Velocity. На цій сторінці ми розглянемо основні можливості мови Velocity.
Виведення одного параметру
Формати звернення до одного параметру такі:
| Змінна | Опис |
|---|---|
$parameterName | Якщо змінної немає — виводиться буквальний текст $discount |
$!parameterName | Якщо значення відсутнє, нічого не виводиться |
${parameterName} | Дужки для однозначного відокремлення імені змінної від сусіднього тексту |
$!{parameterName} | Коректно відокремлює змінну та приглушує відсутні значення |
${parameterName|$altParameter} | Якщо значення змінної відсутнє, підставляє запасне значення |
Виведення елементів з масиву за індексами
Якщо ми бажаємо вивести елемент масиву за індексом, то вказуємо назву масиву та індекс елементу:
$!arrayName[0]— якщо в масиві вказані тільки значення, де 0 — індекс елемента.
$!items[0].parameterName— якщо масив містить об'єкти з параметрами.
Такий спосіб є прийнятним, якщо розмір масиву заздалегідь відомий. Якщо вказати індекс елементу, якого немає в масиві, то при відправленні повідомлення станеться помилка.
Отримати розмір масиву
$!arrayName.size()Цикл для виведення всіх елементів з масиву
Для виведення всіх елементів масиву використовується цикл #foreach.
Синтаксис:
#foreach($item in $!arrayName)
$foreach.count: $!item.name …
#endДе $item — змінна, якій буде надано поточний елемент масиву і до якої можна звертатися всередині циклу. У цьому випадку буде виведено весь список елементів у масиві по черзі, $foreach.count — за замовчуванням є ім'ям лічильника циклу і його початкове значення починається з 1.
Якщо ви бажаєте зупинити цикл #foreach, ви можете використовувати директиву #break, щоб зупинити цикл за потрібною умовою:
#foreach($item in $!arrayName)
$foreach.count: $!item.name …
#if($foreach.count > 5) #break #end
#endІз більш детальними прикладами використання ви можете ознайомитися на прикладі передачі замовлень або покинутих кошиків.
Надання
Синтаксис:
#set($var='value')У ролі значення можуть використовуватися конкретні значення, інша змінна або вираз.
Порівняння
Оператори порівняння та логічні оператори:
| Оператори порівняння Velocity | Відповідні операції порівняння | ||
|---|---|---|---|
gt | > (більше) | ||
lt | < (менше) | ||
ge | ≥ (більше або дорівнює) | ||
le | ≤ (менше або дорівнює) | ||
== | = (дорівнює) | ||
!= | ≠ (не дорівнює) | ||
and | && (логічне ТА) | ||
or | (логічне АБО) | ||
not | ! (логічне НЕ) |
Синтаксис:
$!param1 gt $!param2Також доступні оператори для порівняння рядків з урахуванням і без урахування регістру.
Синтаксис:
$!firstString.equals($!secondString)
$!firstString.equalsIgnoreCase($!secondString)Умова
Умови нам можуть знадобитися з кількох причин:
- якщо треба виводити тільки певну інформацію (наприклад, тільки одну категорію товарів);
- якщо треба виводити певну кількість товарів в одному блоці, щоб не зламати верстку та ін.
Синтаксис:
#if($!params == 'value')
(content)
#endЯкщо умову не виконано, то можна вивести альтернативний варіант:
#if($!param == 'value')
(content)
#else
(altContent)
#endТакож можна перевірити кілька умов:
#if($!param == 'value1')
(content1)
#elseif($!param == 'value2')
(content2)
#else
(altContent)
#endМожна об'єднати кілька умов за допомогою логічних операторів and та or:
#if($!param1 == 'value1' && $!param2 == 'value2')
(content)
#endМожна інвертувати умову:
#if($!param != 'value')
(content)
#endАрифметичні операції
Додавання: $mathTool.add($v1, $v2)
Віднімання: $mathTool.sub($v1, $v2)
Множення: $mathTool.mul($v1, $v2)
Ділення: $mathTool.div($v1, $v2)
Форматування чисел
$numberTool.integer($v1) — виведе ціле число без округлення.
Для виведення грошових сум із двома десятковими знаками можна використовувати таку функцію:
$!numberTool.format('#.00',$v1)
Виведення дати в повідомлення
Вивести поточну дату можна за допомогою функції:
$!dateTool.currentDate()Вивести Unix TimeStamp (поточна дата в мілісекундах):
$!dateTool.currentTimeStamp()Можна задати формат відображення дати та/або часу, другим аргументом можна задати часовий пояс за Гринвічем (GMT):
$!dateTool.currentDate('dd.MM.yyyy HH:mm:ss', 'GMT+3')Якщо дата передається в форматі Unix TimeStamp (наприклад, 1495479520000), то її можна перетворити на читабельний формат за допомогою функції:
$!dateTool.formatDate('dd.MM.yyyy', $!date)або із зазначенням формату:
$!dateTool.formatDate('yyyy-MM-dd HH:mm:ss', $!date)Щоб форматувати вхідну дату з часом в потрібний формат по часовому поясу контакту, використовуйте
$!dateTool.formatInContactTimezone(String format, String dateTime) Вхідний формат дати має відповідати ISO 8601:
dd/MM/yyyy HH:mm:ssyyyy-MM-dd'T'HH:mm:ssyyyy-MM-dd'T'HH:mm:ss'Z'
Якщо часовий пояс контакту не вказаний, то використовується часовий пояс організації.
Вихідні формати описані в цій статті.
Операції з датами
Потрібне додавання до дати необхідної кількості одиниць (рік, місяць, день, година, хвилини). Якщо з події або додаткового поля отримати дату вигляду: "date": "01/01/2020 12:00", результат операції буде таким:
$!dateTool.addYears($!date, 2) -> 01/01/2022 12:00
$!dateTool.addMonths($!date, 5) -> 01/06/2020 12:00
$!dateTool.addDays($!date, 15) -> 16/01/2020 12:00
$!dateTool.addHours($!date, 7) -> 01/01/2020 19:00
$!dateTool.addMinutes($!date, 15) -> 01/01/2020 12:15Якщо другим аргументом буде від'ємне значення, то буде повернуто результат віднімання.
За замовчуванням очікується дата в одному з перерахованих форматів.
"dd/MM/yyyy HH:mm",
"dd/MM/yyyy",
"yyyy-MM-dd'T'HH:mm",
"yyyy-MM-dd".Якщо формат відрізняється, то як третій аргумент можна задати свій формат, наприклад якщо ви передаєте дату в форматі "customDate": "12:00 2020-30-04", то вираз набуває вигляду:
$!dateTool.addYears($!customDate, 2, 'HH:mm yyyy-dd-MM') -> 12:00 2022-30-04Подібним чином за рахунок вказування четвертого аргументу можна форматувати дату, наприклад якщо дата у форматі: "dateTime": "2020-05-01T00: 00":
$!dateTool.addDays($!dateTime, 2, "yyyy-MM-dd'T'HH:mm", 'dd-MM-yyyy') -> 03-05-2020
$!dateTool.addHours($!dateTime, 7, "yyyy-MM-dd'T'HH:mm", 'dd/MM HH:mm') -> 01/05 07:00
$!dateTool.addMinutes($!dateTime, 2, "yyyy-MM-dd'T'HH:mm", 'HH:mm') -> 00:02Обчислення різниці двох дат у (хвилинах, днях, місяцях і роках) "firstDate": "01/01/2019", "secondDate": "05/05/2020":
$!dateTool.diff($!firstDate,$!secondDate,'YEARS') -> 1
$!dateTool.diff($!firstDate,$!secondDate,'MONTHS') -> 16
$!dateTool.diff($!firstDate,$!secondDate,'DAYS') -> 490
$!dateTool.diff($!firstDate,$!secondDate,'HOURS') -> 11760
$!dateTool.diff($!firstDate,$!secondDate,'MINUTES') -> 705600Для знаходження різниці обидві дати мають бути в єдиному форматі; якщо ваш формат відрізняється від очікуваних за замовчуванням, як четвертий аргумент можна задати кастомний формат, наприклад для двох дат: "customDate1":"17:15 05/05/2020", "customDate2":"10:05 01/01/2019":
$!dateTool.diff($!customDate1,$!customDate2,'HH:mm dd/MM/yyyy','MINUTES') -> 706030Перевірка на не порожнє значення
Якщо необхідно перевірити, чи був переданий параметр і чи не був він порожнім, то можна використовувати такий код:
#if($!param && $!param != '')
(content)
#endЦе може бути корисним, якщо повідомлення містить звертання до підписника, але не в усіх підписників вказані імена.
Робота з рядками
Дізнатися довжину рядка:
$!var.length()Отримати частину рядка:
$!var.substring(startIndex,stopIndex)Замінити частину рядка іншим значенням:
$!var.replace('whatNeedsToBeChanged','valueToSetInstead')Змінити регістр рядка:
#set ($example = "UkRaInE")
$example.toUpperCase() // UKRAINE
$example.toLowerCase() // ukraineUpdated 30 days ago