Шаблонизатор Twig и встроенные переменные¶
Для динамического рендеринга текстов заданий и описаний квестов в QOFA интегрирован шаблонизатор Twig.
Синтаксис базовых конструкций¶
{{ ... }}— вывод значения переменной или выражения (например,{{ 2 + 2 }}).{% ... %}— логические операторы, циклы, ветвления (например,{% if user.id %} ... {% endif %}).
Переменные, доступные внутри скриптов Lua¶
Движок автоматически создаёт и обновляет переменные контекста, к которым можно обращаться из Lua-скриптов:
Глобальные переменные¶
time— текущий Unix Timestamp сервера (число).ftime— текущее московское время сервера в читаемом форматеH:i:s / d.m.Y(строка).GET/POST— массивы с параметрами текущего входящего HTTP-запроса.user— объект текущего авторизованного пользователя.
Контекст задания (внутри кнопок)¶
answer— строка, содержащая ответ, введённый пользователем перед нажатием кнопки.button— массив с конфигурацией текущей нажатой кнопки (только для чтения).task— массив данных текущего задания:task.is_done(bool) — завершено ли задание.task.is_done_success(bool) — завершено ли успешно.task.is_done_failed(bool) — завершено с провалом.
Переменные, доступные в шаблонах Twig¶
При редактировании текста задания или описания квеста вам доступны следующие объекты:
vars— массив пользовательских переменных текущего игрока (устанавливаются черезset()). Пример: Использованиеset("role", "лучник")в скрипте позволяет вывести в тексте задания:Вы выбрали класс: {{ vars.role }}.varsg— массив глобальных переменных квеста (setg()). Позволяет выводить сообщения от одних игроков другим. Обращение:{{ varsg.global_metric }}.tvars— переменные текущего задания конкретного пользователя (tset()).user— объект текущего игрока (например,{{ user.name }}).task/game— объекты текущего задания и игры соответственно.score— числовое значение очков игрока.score_form— правильное склонение названия очков (например:очко,очка,очков).score_full— готовая строка, объединяющая число и склонение (например:25 очков).help— готовый HTML-блок с подсказками от таймеров. !!! danger "Важно" Для вывода блокаhelpобязательно применяйте фильтрraw, иначе HTML-теги экранируются:{{ help|raw }}.help_messages— массив строк-подсказок для ручного перебора в цикле.
Проверка GPS (Геолокация) 🗺️¶
gps_using(bool) — включена ли проверка геолокации в настройках задания.player_in_place/in_place(bool) — находится ли игрок в радиусе заданных GPS-координат. При входе в зону страница обновляется автоматически.
Практические примеры использования Twig¶
Значения по умолчанию (Фильтр default)¶
Полезно, если переменная не установлена или значение отсутствует, и тогда можно показать значение по-умолчанию:
Привет, {{ user.name|default(user.login) }}!
Ваш счет: {{ score|default(0) }} {{ score_form }}
Класс: {{ name|default('Анонимный путешественник') }}
Динамические блоки текста по условиям¶
Если условие выполняется, блок показывается (а там и текст, и картинки). Иначе можно либо не показать, либо показать другое что-то:
{% set status = tvars.status %}
{% if status %}
<div class="custom-alert">
{{ status|raw }}
</div>
{% else %}
<p>Доберитесь до локации и ожидайте дальнейших указаний...</p>
{% endif %}
Показ текста при GPS¶
Используется ли GPS в этом задании или нет? Дошёл ли игрок до нужной локации или нет? Это всё можно проверить и показывать разный текст для разных условий:
{% if gps_using %}
{% if in_place %}
Вы на месте! :) Теперь можно нажимать на кнопку)
{% else %}
Вы ещё не добрались до нужной локации... Следуйте указателю)
{% endif %}
{% else %}
В этом задании не используется GPS, так что никуда идти не надо :)
{% endif %}
Выводим таблицу игроков из массива¶
В ходе игры может формироваться массив игроков (через setg('players', user)), и теперь эту таблицу можно вывести в виде таблицы:
<table>
<thead>
<tr>
<th>Игрок</th>
<th>Время прохождения</th>
</tr>
</thead>
<tbody>
{% for player in varsg.players %}
<tr>
<td>{{ player.name }}</td>
<td>{{ player.time_spent }}</td>
</tr>
{% endfor %}
</tbody>
</table>