Перейти к содержанию

Шаблонизатор 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>