UnicoreCMS

Модуль «Конструктор форм»

Заявки, обращения и жалобы — страница собирается в панели, без правки кода

Модуль даёт конструктор форм. Каждая форма — отдельная страница сайта по адресу /mod/forms/<адрес>: заявка в команду, обратная связь, жалоба на игрока, что угодно ещё. Форму собирают в панели из полей, а ответы копятся в разделе «Заявки».

Как завести форму

Расширения → Формы → Конструктор → Создать форму. Выберите заготовку или начните с пустой:

ЗаготовкаЧто внутри
Заявка в командуВозраст, часовой пояс, сервер, должность, часы в игре, Discord, опыт, согласие с правилами
Обратная связьТема, сообщение, оценка проекта
Баг-репортСервер, критичность, что произошло, как повторить, скриншот
Жалоба на игрокаНик нарушителя, сервер, что нарушил, дата, ссылка и скриншот, описание
Заявка на разбанНик, сервер, за что забанили, почему стоит разбанить, согласие

Заготовка — это стартовый набор полей, а не шаблон навсегда: после создания форму правят как любую другую.

Новая форма создаётся закрытой. Пока не поставите «Форма открыта», она отдаёт 404 — можно спокойно собрать поля и проверить вид.

Поля

Вкладка «Поля» — список в том порядке, в котором форма выглядит на сайте. Порядок меняется перетаскиванием.

ТипЧто это
Строка, ТекстОднострочный ввод и многострочный с counter'ом символов
Число, Шкала, ОценкаВвод числа, ползунок с диапазоном, звёзды
Почта, СсылкаТо же, что строка, но с проверкой формата
Список, Несколько из списка, Переключатели, ГалочкиВыбор из вариантов, которые вы задаёте сами
Галочка, Да или нетОдиночное согласие и переключатель
ДатаКалендарь
СерверСписок серверов проекта — берётся из раздела «Серверы», руками ничего вписывать не нужно
ФайлВложение с ограничением по типу и размеру
Заголовок, Абзац, РазделительОформление: подписи и разделители, ответа не собирают

У каждого поля есть подпись, подсказка (появляется в значке «?»), ключ и признаки «Обязательное» и «Половина ширины». Ключ подставляется сам из подписи — по нему ответ попадает в заявку и в уведомление.

Правила

Вкладка «Правила» в диалоге поля задаёт границы: длину текста, диапазон числа, шаблон, типы и размер файла. Проверка одна и та же на сайте и на сервере — обойти её, отправив запрос мимо формы, не выйдет.

Там же условие показа: поле появляется, только если ответ на другое поле подходит под условие. Например, «Ник в Discord» показывается, когда тема обращения — «Проблема». Скрытое поле не проверяется на обязательность и не попадает в заявку.

Доступ и ограничения

Вкладка «Доступ»:

НастройкаЧто делает
Только для авторизованныхГость видит форму, но отправить не может
ПравоФорму отправит только тот, у кого есть указанное право
Одна заявка на человекаПовторно отправить нельзя никогда
Повтор через, часовПауза между заявками одного человека
Всего заявокКогда наберётся столько, приём закрывается
Приём с / поОкно, в которое форма работает
Текст, когда приём закрытЗаменяет стандартное объяснение

Для гостя ограничения считаются по адресу, для игрока — по учётной записи. Причину отказа человек видит текстом: «Вы уже отправляли заявку по этой форме», «Следующую заявку можно отправить 26.08.2026 01:23».

Кто отправляет и куда приходит ответ

Вошедшему игроку форма не задаёт вопросов о контактах: ник и почта берутся из учётной записи, туда же уходит ответ. Гостю модуль сам добавляет блок «Как с вами связаться» — имя и почту, — если форма сообщает о решении.

Игрок видит свои заявки и ответы администрации в кабинете, вкладка «Мои заявки».

Уведомления

Вкладка «Уведомления»:

  • Куда сообщать — вебхуки, в которые уйдёт новая заявка со всеми ответами. Выбираются из уже созданных в разделе «Вебхуки»; для заявок заведите отдельный вебхук с событием «Без события», чтобы они не попадали в канал новостей.
  • Писать автору о решении — когда вы меняете статус заявки, автору уходит письмо со статусом и вашим комментарием.

Заявки

Расширения → Формы → Заявки. Фильтры по форме и статусу, у каждой заявки — ответы, статус (Новая, На рассмотрении, Принята, Отклонена) и поле «Ответ автору». Права раздельные: mod.forms.read — смотреть, mod.forms.write — править формы, mod.forms.review — менять статус и отвечать.

Настройка модуля «Хранить рассмотренные заявки, дней» чистит по ночам принятые и отклонённые заявки старше срока. Ноль — не удалять ничего.

Меню сайта

Формы не появляются в шапке сами. Флажок «Показывать в меню сайта» в настройках формы выключен по умолчанию: пока он выключен, страница открывается только по прямой ссылке. Соседнее поле «Порядок в меню» ставит пункт среди остальных.

Страница /mod/forms со списком всех открытых форм есть всегда, её заголовок и подзаголовок правятся на странице «Модули».

Переводы

Заголовок формы, описание, текст после отправки, подписи полей, подсказки и названия вариантов переводятся как обычный контент — вкладка «Переводы» в конструкторе и в диалоге поля. Поле переводится после того, как форма сохранена: до этого у него ещё нет своего адреса в базе.

Установка

Модуль живёт в отдельном репозитории UnicoreCMS-modules и лежит там исходниками. Как собрать серверную часть, написано в README репозитория: клоны кладутся рядом, потому что контракт unicore-api в npm не публикуется.

pnpm --filter unicore-module-forms run build

Дальше как с любым модулем: соберите архив из module.json, package.json, shared, server, client, admin, locales, поставьте его через панель, включите и пересоберите фронты. Подробности — в Установке.

Что внутри — для разработчика

  • три таблицы: mod_forms_forms, mod_forms_fields, mod_forms_submissions;
  • типы полей, условия показа и проверка ответа лежат в shared/ — сайт и сервер считают по одному коду;
  • список серверов для поля «Сервер» приходит из core().servers.all(), право из «Доступа» проверяется через core().users.can();
  • уведомления — core().webhooks.sendTo() и core().mail, вложения — core().storage;
  • ночная чистка — SafeCron, пункты меню сайта — динамический nav (см. Встраивание в интерфейс).

См. Контракт для модулей.

Содержание