Модуль «Конструктор форм»
Заявки, обращения и жалобы — страница собирается в панели, без правки кода
Модуль даёт конструктор форм. Каждая форма — отдельная страница сайта по адресу /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(см. Встраивание в интерфейс).
См. Контракт для модулей.