6.2 Синтаксис Cover

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

В основе лежат переменные, заключенные в фигурные скобки { и }, которые заменяются на реальные значения, например {uid} будет автоматически заменен на user_id инициатора активности, а {res.14.title} - название ресурса с ID равным 14.

Проще всего знакомиться с cover на примерах...

Примеры

{literal}Этот текст не будет обработан!{/literal} - иногда нужно экранировать CSS или JS код, это можно сделать при помощи тэга literal

{user.4803497.first_name} - имя пользователя id4803497. Вы также можете использовать вместо first_name следующие поля:
city.title - город
country.title - страна,
last_name - фамилия,
photo_50 - аватарка квадратнаx 50x50px,
photo_100 - аватарка 100х100px,
sex - 1 женский, 2 мужской,
bdate - дата рождения,
online - онлайн прямо сейчас, site - сайт,
relation - семейное положение,
screen_name - адрес странички,
contacts - контактные данные,
is_closed - 1 если страничка закрыта

{rate.55.sum} - сумма всех баллов в рейтинге #55

{rate.55.items.1.count} - количество очков у пользователя ТОП-1 в рейтинге #55

{rate.55.items.1.uid} - ID пользователя ТОП-1 в рейтинге #55. Переменные, возвращающие UID можно вкладывать в другие переменные:

{user.{rate.55.items.1.uid}.first_name} - имя пользователя ТОП-1 в рейтинге #55

{user.{rate.55.items.1.uid}|full_name} - имя и фамилия одной строкой этого пользователя. Обратите внимание на вертикальную черту перед full_name - это модификатор, склеивающий имя с фамилией через пробел, о них пойдёт речь ниже.

{rate.55.users.4803497.place} - место в рейтинге #55 пользователя id4803497

{rate.55.users.4803497.rank} - звание пользователя в рейтинге

{rate.55.users.4803497.count} - количество баллов рейтинге #55 у пользователя id4803497

{list.10.count} - количество пользователей в списке #10

{list.10.items.2.uid} - UID второго пользователя в списке

{list.10.items.2.time} - время добавления второго пользователя в списке

{list.10.items.-1.uid} - первый с конца пользователь в списке (последний добавившийся)

{res.14.title} - название ресурса #14

{res.14.desc} - описание ресурса #14

{res.14.icon} - относительный путь к изображению ресурса

{res.14.users.4803497.count} - количество ресурса #14 у пользователя id4803497

{res.18.users.4803497.val} - текстовое значение ресурса #18 у пользователя id4803497. count приводит значения ресурса к числу, а val выдаёт их в чистом виде.

{user.{uid}|full_name} - полное имя текущего юзера (обратите внимание на значок вертикальной черты)

{user.{uid}|name_case:acc} - имя текущего юзера в винительном падеже. Возможные значения: именительный – nom, родительный – gen, дательный – dat, винительный – acc, творительный – ins, предложный – abl. По умолчанию nom.

{user.{uid}.photo_100} - фото текущего юзера 100x100

{user.{res.14.users.{uid}.count}.photo_100} - фото пользователя 100x100, ID которого является значением ресурса #14 у текущего пользователя

{user.{uid}.photo_100}|circle - сделать аватарку круглой

{user.{uid}.photo_100}|circle:5 - скруглить края аватарки на 5 пикселей

{res.14.users.{uid}.count} == 10 - (для условий) количество ресурса #14 для текущего пользователя равно 10

{res.14.users.{uid}.count} + 20|calc - (для координат X и Y), прибавить 20 к количеству ресурса #14 у текущего юзера. calc - модификатор, который посчитает строку 10 + 20 как выражение равное 30.

{storage.52.data.image_base} - текстовое значение поля image_base из хранилища #52

{storage.52.data.log|list} - вывести в столбик текстовые строчки из массива log в хранилище #52

{storage.52.data.log|reverse|slice:1:16|list} - перевернуть массив лог, выбрать из него первые 16 позиций (на самом деле они последние, массив же перевёрнут) и разместить в столбик.

({res.14.users.{uid}.count} > 10) && ({res.14.users.{uid}.count} < 20) - (для условий), покажет спрайт, если количество ресурса #14 у текущего пользователя больше 10 и меньше 20

{storage.52.data.1.text} - первая текстовая строка из хранилища #52 с массивом строк

{storage.52.data.{|rand:1:3}.text} - случайный выбор одной из первых 4-х строк (отсчёт начинается с единицы) из из хранилища #52 с массивом строк

{server.1.task.0} - текущее значение задач, находящихся в очереди на выполнение на сервере номер 1

{server.1.load.0} - текущее значение загрузки процессора (Load Average) сервера номер 1, полезно для отслеживания перегрузки сервера и принятия соответствующих мер.

{timer.132989.10.{uid}.time} - значение таймера для текущего пользователя, заданного блоком ожидания в схеме 132989 и блоке 10

Модификаторы

В примерах выше - вы можете заметить, что некоторые конструкции используют вертикальную черту. Она означает применение модификатора к тому, что находится перед ним. Например

{user.{uid}.first_name|str_upper} - имя текущего пользователя будет преобразовано в ВЕРХНИЙ регистр.

Или даже несколько модификаторов сразу
{user.{uid}|name_case:acc|str_upper} - имя текущего пользователя в винительном падеже и в верхнем регистре. "acc" здесь - параметр модификатора, пишется пишется через двоеточие с именем модификатора. Обратите внимание, он работает не со строкой first_name, а со всем массивом данных пользователя {user.{uid}}

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

Числовые и математические

rand:a:b - случайное число от a до b

int - преобразование в целое число.

sqrt - квадратный корень

pow:2 - возвести в степень 2 (в квадрат)

number_format - расставить разделители разрядов в числе, 2000000 станет 2 000 000

ceil - округление в большую сторону

floor - округление в меньшую сторону

round:a - округление по математическим правилам, a - количество знаков после запятой

Строковые

str_lower - в нижний регистр

str_upper - в верхний регистр

urlenc - кодирование строки для передачи по ссылке

strlen - длина строки (могут быть нюансы из-за всяких эмоджи!)

cut:a - обрезка по символам длинного текста (более 20 символов), где a - желательное количество символов. Обратите внимание, что алгорит сам выбирает границу обрезки так, чтобы она пришлась на пробелы между словами.

substr:a:b - выбор подстроки (тоже можно использовать как обрезку длинной строки), a - стартовая позиция в строке, начиная с 0, b - длина подстроки в символах.

str_pad:len:str - дополнить строку слева до заданной длины, например, чтобы красиво показать значения разной длины в столбик. len - длина, str - чем дополнить.

pretty - разметка JSON в удобном человеко-читаемом виде с переносами строк

Время и дата

fdate:a - преобразование даты в формате timestamp в формат, определённый строкой а, символы в ней могут означать:
j - День месяца без ведущего нуля, от 1 до 31
d - День месяца, 2 цифры с ведущим нулём, от 01 до 31
l - Полное наименование дня недели, от Sunday до Saturday
D - День недели, 3 символа, от Mon до Sun
z - Порядковый номер дня в году, от 0 до 365
N - Порядковый номер дня недели, от 1 (понедельник) до 7 (воскресенье)
W - Порядковый номер недели года
n - Порядковый номер месяца без ведущего нуля от 1 до 12
m - Порядковый номер месяца с ведущим нулём от 01 до 12
F - Полное название месяца от January до December
M - Сокращенное наименование месяца, 3 символа от Jan до Dec
t - Количество дней в месяце от 28 до 31
Y - Год, 4 цифры
y - Год, 2 цифры
g - Часы в 12-часовом формате без ведущего нуля, от 1 до 12
h - Часы в 12-часовом формате с ведущим нулём, от 01 до 12
G - Часы в 24-часовом формате без ведущего нуля, от 0 до 23
H - Часы в 24-часовом формате с ведущим нулём, от 00 до 23
i - Минуты с ведущим нулём, от 00 до 59
s - Секунды с ведущим нулём, от 00 до 59
v - Миллисекунды
c - Дата в формате ISO 8601, 2004-02-12T15:19:21+00:00
r - Дата в формате RFC 2822, Thu, 21 Dec 2000 16:01:07 +0200
например |fdate:Y-m-d H:i:s выведет 2024-12-25 12:23:59

date:a - преобразование даты в формате timestamp в понятный формат, вид будет зависеть от a:
0 - 2020-01-01 12:00:01,
1 - 01.01.20 (только дата),
2 - 12:00 (только время),
3 - 1 января 12:00,
4 - 1 января,
5 - 1 января 12:00,
6 - 1 января 2020 12:00,
7 - 1 января 2020 в 12:00
8 - Понедельник (день недели)
9 - Число (день)
11 - 13:23:45:14
12 - 13 дн. 23 час. 45 мин. 14 сек.
(если нужны ещё форматы - напишите в техподдержку)

Обратите внимание, что форматы 11 и 12 преобразуют секунды в человекопонятный временной промежуток, поэтому если у вас timestamp, то сколько времени осталось можно узнать вот так: {{b.10.value}-{now}|calc|date:11}

strtotime - преобразовать дату из строк вида Y-m-d или d.m.Y в timestamp

Массивы

last - последний элемент массива. Применяется, разумеется, к массиву.

list - элементы одномерного массива в список, разделённый переносами строк

arrval:name - превратить двухмерный массив в одномерный (например для list), взяв в качестве значения поле с именем name.

count - количество элементов массива

slice:0:5 - взять часть массива, пять элементов, начиная с нулевого элемента

reverse - перевернуть массив

get_rand - выбрать случайный элемент массива

Прочие

full_name - полное имя пользователя. Модификатор применяется к массиву данных пользователя, из-за чего его иногда путают с ".first_name".

name_case:acc - имя текущего юзера в винительном падеже. Возможные значения: именительный – nom, родительный – gen, дательный – dat, винительный – acc, творительный – ins, предложный – abl. По умолчанию nom.

calc - посчитать выражение. Например прибавить 100 к значению ресурса можно вот так: {res.14.users.{uid}.count} + 100|calc Это может быть полезно, если вы хотите задать координату положения спрайта на картинке в зависимости от значения ресурса (чем больше очков - тем дальше уехала машинка и т.д.)

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

json_decode - обратное преобразование json-строки в массив. Полезно, когда например, нужно разобрать в переменные ответ какого-либо внешнего API.

25|progress:100:X:O:10 - нарисовать прогресс-бар символами X и O, длиной в 10 символов, где 25 (тут может быть переменная) - значение показателя, а 100 (тоже может быть переменная) - максимальное значение.

Дополнительные возможности

{literal}Эта строка покажется в неизменном виде, даже если в ней есть переменные{/literal} - экранирование переменных, если вдруг cover портит JavaScript или CSS.

Условия

Простой пример с условием

{if {b.10.v} > 10}Эта строка покажется, только если b.10.v больше 10{/if}

Условие и показ строки в случае его невыполнения

{if {res.123.users.{uid}.count} > 100}
Эта строка покажется, только если значение ресурса №123 у текущего пользователя больше 100
{else}
А эта, если меньше.
{/if}

Циклы и вывод массивов

{foreach {b.10.v}}
    {each.i}.  {each.key} = {each.val}
{forelse}
    В этом списке никого нет
{/foreach}

В этом примере предполагается, что переменная b.10.v содержит одномерный массив. Переменная each внутри тела цикла будет принимать поочерёдно каждое значение из массива, где i - счётчик от 0, n - счётчик от 1, key - ключ ассоциативного массива, val - значение. Циклы поддерживают до 100 вхождений, т.к. они довольно ресурсоёмкие.

В случае обработки вложенных массивов, переменная each будет дублироваться, поэтому родительскому массиву нужно дать имя для цикличной переменной, например users как в примере ниже.

{foreach {b.10.v} as users}
    {foreach {users.val}}
      {each.i}. {each.key} = {each.val}
    {/foreach}
{/foreach}