Перейти к основному содержимому
Обновлено: 

Виртуальные методы в PROScript

Виртуальные методы — это встроенные функции, которые позволяют работать с данными напрямую: изменять строки, фильтровать массивы, получать значения из объектов и другое. Методы можно применять неоднократно, вызывая их один за другим.

Методы вызываются через . после значения или переменной. Например:

[% name = ‘Sendsay’ %]
[% name.length() %]

Результат:

7

Виртуальные методы делают код компактнее и понятнее, а также позволяют выполнять операции без дополнительных циклов и проверок.

В этой статье собраны часто используемые методы для разных типов данных.

Виртуальные методы для работы со строками

Эти методы помогают анализировать и изменять текстовые значения.

list

Преобразует строку в массив из одного элемента. В примере используется функция dump() — она выводит значение полностью, чтобы можно было увидеть структуру данных.

[% dump('qwerty'.list()) %]
[% 'qwerty'.list().size() %]

Результат:

[ "qwerty" ]
1

hash

Возвращает хеш-объект, где строка хранится как значение.

[% dump('aaaa'.hash()) %]

Результат:

{ "value" : "aaaa" }

length

Возвращает длину строки.

[% 'aaaa'.length() %]

Результат:

4

size

Всегда возвращает 1 для любой строки или переменной с типом "строка" (string).

[% 'text'.size() %]

Результат:

1

defined

Проверяет, определена ли переменная. Возвращает true или false.

[% name = 'Sendsay' %]
[% name.defined() %]

Результат:

true

match

Ищет в строке совпадения по регулярному выражению. Регулярное выражение — это специальный шаблон для поиска текста. Используя его, можно находить слова, цифры, фрагменты текста по определённым правилам. В примере используется регулярное выражение (\w+) (\w+) — две группы слов, разделённые пробелом.

[% name = 'Larry Wall' %]
[% matches = name.match('(\w+) (\w+)') %]
[% matches.1 %], [% matches.0 %]

Результат:

Larry, Wall

Если совпадений нет, метод вернёт false.

repeat

Повторяет строку указанное количество раз.

[% name = 'foo' %]
[% name.repeat(3) %]

Результат:

foofoofoo

replace

Заменяет все подходящие фрагменты на новое значение.

[% name = 'foo, bar & baz' %]
[% name.replace('\W+', '_') %]

Результат:

foo_bar_baz

remove

Удаляет все части строки, соответствующие заданному фрагменту.

[% name = 'foo, bar & baz' %]
[% name.remove('\W+') %] # foobarbaz

Результат:

foobarbaz

split

Разделяет строку на массив по указанному в функции символу.

[% dump('2018-09-06'.split('-')) %]

Результат:

[ "2018", "09", "06" ]

chunk

Превращает строку в массив указанной длины.

[% ccard_no = "1234567824683579";
dump(ccard_no.chunk(4));
ccard_no.chunk(4).join()
%]

Результат:

1234 5678 2468 3579

substr (p,l)

Возвращает подстроку указанной длины (l) начиная с определённой позиции (p).

[% str='foo bar baz wiz waz woz' %]
[% str.substr(4, 3) %]

Результат:

bar

Виртуальные методы для работы с массивами

Эти методы применяются к массивам — чтобы получать, изменять или сортировать элементы.

Перед началом работы массив нужно инициализировать:

[% array = [] %]

В примерах используются следующие массивы:

[% a1=[1,3,5,223,44,322,404,2,25] %]
[% a2=[1,3,5,223,44,322,44,2,2,44,3,33,44543,443] %]
[% a3=[44,322,44,2,2,44,33,33,443,443] %]

Нумерация элементов массива начинается с 0.

Важно

Методы, изменяющие массивы, не изменяют данные подписчика, а работают только с переменными внутри письма.

join

Выводит элементы массива в строку с указанным разделителем (по умолчанию — пробел).

[% items = ['foo','bar','baz'] %]
[% items.join(', ') %]

Результат:

foo, bar, baz

Обратиться к элементу массива по индексу

[% a3.item(1) %]
[% a3[1] %]
[% a3.1 %]

Результат:

322

first и last

Возвращают первый и последний элементы массива.

[% a2.first() %]
[% a3.last() %]

Или более короткий вариант:

[% a2.[0] %]
[% a3.[-1] %]

Результат:

1
443

Можно указать количество элементов:

[% a2.first(3) %]
[% a1.last(5) %]

Результат:

1 3 5
44 322 404 2 25

hash

Преобразует массив в объект, где чётные элементы становятся ключами, а нечётные — значениями.

[% list = ['pi', 3.14, 'e', 2.718] %]

[% dump(list.hash()) %]

[% list.hash().pi %]
[% list.hash().e %]

Результат:

{ "pi": 3.14, "e": 2.718 }
3.14
2.718

push и unshift

Добавляют элементы в конец (push) или в начало (unshift) массива. Исходный массив изменяется.

[% array = [1,2,3,4,5] %]
[% array.push(6,7) %]
[% array.unshift(-2,-1) %]

Результат:

-2 -1 1 2 3 4 5 6 7

shift и pop

Удаляют первый (shift) или последний (pop) элемент массива. Методы возвращают удалённый элемент.

Пример для (shift):

[% array = [1,2,3,4,5] %]
Удалённый: [% array.shift() %]
После удаления: [% array.join() %]

Результат:

Удалённый: 1
После удаления: 2 3 4 5

Пример для (pop):

[% array = [1,2,3,4,5] %]

Удалённый: [% array.pop() %]
После удаления: [% array.join() %]

Результат:

Удалённый: 5
После удаления: 1 2 3 4

max

Возвращает индекс последнего элемента массива.

[% a2.max() %]
[% a2[a2.max()] %]

Результат:

13
443

size

Возвращает количество элементов в массиве.

[% a2.size() %]

Результат:

14

defined

Проверяет, есть ли в массиве элемент с указанным индексом. Возвращает true или false.

[% a3.defined(3) ? 'да' : 'нет' %]
[% a3.defined(14) ? 'да' : 'нет' %]

Результат:

да
нет
Как проверить, есть ли значение в массиве

Чтобы проверить, содержит ли массив определённое значение, можно использовать функции exists_val и exists_val_num. Они позволяют избежать перебора элементов в цикле и упрощают шаблон.

  • exists_val (массив, строка) — ищет строку,
  • exists_val_num (массив, число) — ищет число,
  • возвращают 1, если значение найдено, или пусто — если нет.
[% array = ["aa", "abc", "dfa"] %]
[% IF exists_val(array, "dfa") == 1 %]
существует
[% END %]

Результат:

существует

Проверка числового значения:

[% array = [1, 2.3, -23] %]
[% IF exists_val_num(array, 2.3) == 1 %]
2.3
[% END %]

Результат:

2.3

reverse

Возвращает массив в обратном порядке, не изменяя исходный.

[% a1.reverse().join() %]

Результат:

25 2 404 322 44 223 5 3 1

grep

Возвращает массив элементов, которые соответствуют регулярному выражению.

[% a1.grep('5').join() %]

Результат:

5 25

sort и nsort

Сортируют массив: sort — по символам, nsort — по числам. Обе функции не изменяют исходный массив.

Пример для (sort):

[% a1.sort().join(',') %]

Результат:

1,2,223,25,3,322,404,44,5

Пример для (nsort):

[% a1.nsort().join(',') %]

Результат:

1,2,3,5,25,44,223,322,404

unique

Возвращает массив уникальных элементов, сохраняя порядок оригинала.

[% a3.unique().join() %]

Результат:

44 322 2 33 443

import

Присоединяет массив (или несколько) к исходному. Исходный массив изменяется.

[% one = [1,2,3] %]
[% two = [4,5,6] %]
[% three = [7,8,9] %]
[% one.import(two, three).join(', ') %]

Результат:

1, 2, 3, 4, 5, 6, 7, 8, 9

merge

Объединяет массивы, не изменяя исходный.

[% a4 = a1.merge(a2, a3) %]
[% a4.join(', ') %]

Результат:

1, 3, 5, 223, 44, 322, 404, 2, 25, 1, 3, 5, 223, 44, 322, 44, 2, 2, 44, 3, 33, 44543, 443, 44, 322, 44, 2, 2, 44, 33, 33, 443, 443

slice

Возвращает новый массив с элементами от index1 до index2. Если index2 не указан — до конца массива.

[% a1.slice(3,5).join() %]
[% a3.slice(8).join() %]

Результат:

223 44 322
443 443

splice

Заменяет указанное количество элементов начиная с позиции index на новые. Исходный массив изменяется.

[% play_game = ['play', 'scrabble'] %]
[% ping_pong = ['ping', 'pong'] %]
[% redundant = play_game.splice(1, 1, ping_pong) %]
[% redundant.join() %]
[% play_game.join() %]

Результат:

scrabble
play ping pong

Виртуальные методы для работы с объектами

Методы для работы с объектами помогают получать ключи, значения, и управлять структурой данных. Примеры ниже приведены для объекта с именем HASH и структурой:

{
"array" : ["foo", "bar"],
"summa" : 1234,
"way" : { "pay" : 123 },
"month" : "2025-12"
}
Важно

Методы, изменяющие объект, не изменяют данные подписчика, а работают только с переменными внутри письма.

Как задать объект вручную

Иногда нужно протестировать работу с объектом прямо в письме или собрать структуру, похожую на данные подписчика. В этом случае объект можно создать прямо в шаблоне:

[% data = {
"month" => "2012-12",
"summa" => "1234",
"array" => ["foo", "bar"],
"way" => { "pay" => "123" }
} %]

[% data.month %]
[% data.summa %]
[% data.array[0] %]
[% data.way.pay %]

Результат:

2012-12
1234
foo
123

item

Позволяет получить значение по ключу объекта.

[% HASH.month %]
[% HASH.item('month') %]

[% HASH.summa %]
[% HASH.item('summa') %]

Результат:

2025-12
2025-12
1234
1234
Как обратиться к ключу, если в его названии есть «-» или «.»

Если в объекте встречаются ключи с дефисом - или точкой ., их нельзя использовать напрямую через точку. Шаблонизатор воспринимает дефис как операцию вычитания, а точку — как переход к следующему ключу. Поэтому выражение будет интерпретировано неправильно.

Например, структура:

{
"forms": {
"roi-calculator": {
"B4": "300",
"B6": "5",
"J2": "418.6",
"name": "Анастасия",
"gclid": "1441608974.1696407638"
}
}
}

Если обратиться так:

[% anketa.forms.roi-calculator.name %]

результат будет неверным — выведется: 0

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

[% abs = "roi-calculator" %]
[% anketa.forms.$abs.name %]

Результат:

Анастасия

items

Возвращает массив, где нечётные элементы — ключи, а чётные — соответствующие значения.

[% data = {"month" => "2025-12", "summa" => "1234"} %]
[% dump(data.items()) %]
[% data.items().join(', ') %]

Результат:

[ "summa", 1234, "month", "2025-12" ]
summa, 1234, month, 2025-12

size

Возвращает количество пар ключ–значение в объекте.

[% HASH.size() %]
[% HASH.way.size() %]

Результат:

4
1

keys

Возвращает массив ключей объекта.

[% dump(HASH.keys()) %]
[% HASH.keys().join('; ') %]

Результат:

["array", "summa", "way", "month"]
array; summa; way; month

values

Возвращает массив значений объекта.

[% data = {"month" => "2025-12", "summa" => "1234"} %]
[% dump(data.values()) %]
[% data.values().join() %]

Результат:

[ 1234, "2025-12" ]
1234 2025-12

pairs

Возвращает массив объектов с полями key и value, содержащими пары исходного объекта.

[% data = {"month" => "2025-12", "summa" => "1234"} %]
[% dump(data.pairs()) %]

[% FOREACH p IN data.pairs() %]
[% p.key %] -> [% p.value %]
[% END %]

Результат:

[
{ "value": "2025-12", "key": "month" },
{ "value": 1234, "key": "summa" }
]

month -> 2025-12
summa -> 1234

exists и defined

Проверяют наличие значения по ключу.

  • exists — проверяет наличие ключа,
  • defined — определено ли значение по ключу.
[% HASH.exists('summa') ? 1 : 0 %]
[% HASH.defined('summa1') ? 1 : 0 %]

Результат:

1
0

delete

Удаляет указанные ключи и значения из объекта. Исходный объект изменяется.

[% data = {"month"=>"2025-12", "summa"=>"1234", "credit"=>"5000", "pay"=>"1"} %]

[% dump(data) %]
[% data.delete('credit') %]
[% dump(data) %]

[% data.delete('pay','summa') %]
[% dump(data) %]

Результат:

{ "summa": 1234, "pay": 1, "credit": 5000, "month": "2025-12" }
{ "summa": 1234, "pay": 1, "month": "2025-12" }
{ "month": "2025-12" }

import

Добавляет пары ключ–значение из других объектов в текущий. Исходный объект изменяется.

[% hash1 = { "foo" => "Foo", "bar" => "Bar" } %]
[% hash2 = { "wiz" => "Wiz", "woz" => "Woz" } %]

[% hash1.import(hash2) %]
[% dump(hash1) %]

Результат:

{ "wiz": "Wiz", "bar": "Bar", "foo": "Foo", "woz": "Woz" }