📄 Модуль «Календарь событий»
Календарь событий превращает организацию из ленты новостей в живое сообщество с реальной жизнью: встречи, вебинары, офлайн-мероприятия. Участники записываются в один клик, организатор видит, кто придёт, а напоминания сами зовут людей за день и за час до начала. Этот гайд проведёт по всему модулю — от первого события до встраивания календаря на сторонний сайт.
Модуль включается отдельно для каждой организации в Кабинет админа → 🔧 Управление модулями. Пока переключатель «Календарь событий» выключен, кнопка раздела не появится в меню организации ни у кого.
Быстрый старт
Чтобы модуль заработал, нужны три условия: организация одобрена модератором, модуль «Календарь событий» включён в настройках модулей, и у пользователя есть право на управление событиями (для создания) либо он участник организации (для записи). Когда всё сошлось, в меню организации появляется кнопка 📅 События.
- Откройте организацию и перейдите в 📅 События.
- Нажмите + Событие (кнопка видна только организаторам).
- Заполните название, дату и время начала, при желании — окончание, место, обложку и лимит мест.
- Сохраните — событие появится в сетке календаря и в списке.
- Участники записываются через селект «Возможно / Я пойду / Не пойду» прямо в карточке.
Виды отображения
В шапке раздела есть переключатель двух видов:
- Сетка — классический календарь на месяц. Дни с событиями подсвечиваются, сегодняшняя дата выделена, события показываются прямо в ячейке временем и названием. Стрелки «← Предыдущий / Следующий →» листают месяцы.
- Список — карточки событий с обложкой, датой, местом, счётчиком участников и описанием. Удобен, когда событий много и нужна вся информация сразу.
Клик по событию в сетке прокручивает страницу к его карточке в списке и подсвечивает её.
Создание и редактирование событий
Создание и редактирование происходят в одном модальном окне. При редактировании данные события подгружаются через AJAX, а текущая обложка показывается превью — можно заменить её новой или оставить прежнюю.
Поля события
| Поле | Обязательное | Комментарий |
|---|---|---|
| Название | Да | До 255 символов |
| Начало | Да | Дата и время старта |
| Окончание | Нет | Должно быть позже начала |
| Онлайн-мероприятие | Нет | Галочка скрывает поле «Место» и помечает событие как 🌐 Онлайн |
| Место проведения | Нет | Для офлайн-событий; до 255 символов |
| Максимум участников | Нет | Пусто = без лимита |
| Описание | Нет | До 5000 символов, внизу живой счётчик |
| Обложка | Нет | JPG / PNG / WebP, до 5 МБ |
Обложка события
Оптимальный размер — 1200×630 пикселей (соотношение примерно 1.9:1). Такой формат красиво выглядит и в карточке списка, и в публичном виджете. Максимальный вес файла — 5 МБ.
Если обложку не загрузить, карточка покажет фирменный градиентный плейсхолдер с иконкой 📅 — событие всё равно будет выглядеть аккуратно.
Участие и RSVP
Запись на событие устроена как один селект в карточке — без лишних кликов и модальных окон. Выбор сразу сохраняется, страница мягко обновляется, а счётчик участников пересчитывается.
Статусы участия
| Статус | Что значит | Напоминания |
|---|---|---|
| 🤔 Возможно | Нейтральный статус по умолчанию, пока человек не определился | Не приходят |
| ✅ Я пойду | Подтверждённое участие; попадает в счётчик мест | Приходят за день и за час |
| ❌ Не пойду | Отказ; человек виден в списке отказавшихся | Не приходят |
Нейтральный дефолт не вводит в заблуждение: пока участник не сделал осознанный выбор, он не считается ни идущим, ни отказавшимся. Напоминания и учёт мест работают только для статуса «Я пойду» — так организатор видит реальную явку, а не раздутые цифры.
Лимит мест
Если задан максимум участников и все места заняты статусом «Я пойду», событие помечается бейджем «Мест нет», а новые записи в статус «Я пойду» блокируются с понятным сообщением. При этом статусы «Возможно» и «Не пойду» остаются доступными — человек может обозначить интерес и попасть в список ожидания.
Список участников
Число участников в карточке (например, «👥 3 / 10») кликабельно. По клику открывается модальное окно со списком всех записавшихся, разбитым на три секции:
- ✅ Подтвердили участие — идут на событие;
- 🤔 Возможно придут — колеблются;
- ❌ Отказались — не пойдут.
У каждого участника видны аватар (или инициал), имя и дата записи. Сверху — сводная статистика по всем трём статусам и лимиту мест. Организатор события (создатель или администратор организации) может удалить любого участника из списка кнопкой «Удалить» — например, если человек записался по ошибке.
Напоминания
Модуль сам держит участников в тонусе, чтобы явка не рассыпалась в последний момент. Напоминания приходят только тем, кто подтвердил участие статусом «Я пойду».
Типы напоминаний
- 📅 За день — отправляется, когда до события остаётся 24 часа или меньше.
- ⏰ За час — отправляется, когда до события остаётся 1 час или меньше.
Каждое напоминание попадает в колокольчик уведомлений с названием события, датой и временем, местом (или пометкой «Онлайн»), названием организации и ссылкой «Открыть событие →». Если пользователь включил дублирование на почту — придёт ещё и письмо.
Настройки в профиле
Каждый пользователь сам решает, какие напоминания получать. В разделе Редактирование профиля есть блок «🔔 Настройки уведомлений о событиях» с тремя галочками:
- Напоминание за день до события;
- Напоминание за час до события;
- Дублировать напоминания на email.
По умолчанию оба напоминания в колокольчик включены, а почта — выключена.
Автоматизация через cron
Напоминания отправляет Artisan-команда events:send-reminders, которую планировщик хостинга запускает каждые 10 минут. Команда устроена так, что её можно запускать когда угодно и сколько угодно раз — защита от дублей хранится в отдельной таблице, поэтому одно и то же напоминание одному человеку не уйдёт дважды.
Планировщик выполняет php artisan schedule:run каждые 10 минут, а расписание внутри приложения вызывает events:send-reminders. Команда находит события в порогах «≤ 24 часов» и «≤ 1 час», проходит по участникам со статусом «Я пойду», проверяет их настройки и таблицу отправленных напоминаний — и шлёт уведомление только тем, кому ещё не слала.
Виджет для сторонних сайтов
Одна из сильных сторон модуля — возможность вынести календарь за пределы платформы. Владелец организации получает готовый код, который встраивает живую сетку событий на любой сайт, блог или лендинг.
Код для вставки
В разделе «📅 События» нажмите кнопку 🔗 Код для вставки. Откроется окно с настройками, живым превью и готовым кодом. Скопированный фрагмент — это <iframe> с небольшим скриптом: виджет сам сообщает странице свою высоту, поэтому рамка подстраивается под количество событий без пустых полей и обрезки.
Параметры кастомизации
Поведение виджета настраивается прямо в окне генератора (и через параметры URL):
| Параметр | Значения | Что делает |
|---|---|---|
limit | 3 / 6 / 9 / 12 | Сколько событий показывать (максимум 20) |
view | grid / list | Сетка карточек или вертикальный список |
past | 0 / 1 | Показывать ли прошедшие события |
Виджет адаптивен: на десктопе карточки выстраиваются в несколько колонок, на планшете — в две, на телефоне — в одну. Стили нейтральные и аккуратно смотрятся на любом сайте.
JSON API
Для разработчиков, которые хотят отрисовать события в своём дизайне, есть JSON-эндпоинт. Он отдаёт данные организации и список событий с датами, местом, счётчиком участников, обложкой и ссылкой на событие:
/widget/events/{slug}/json?limit=10&past=0 — принимает те же параметры limit и past, возвращает структурированный JSON. Удобно для мобильных приложений и кастомных интеграций.
Роли и права доступа
Доступ к управлению событиями определяется ролями организации. Просмотр и запись доступны участникам, а создание, редактирование, удаление событий и участников — только организаторам.
| Разрешение | Что даёт |
|---|---|
manage_events | Создание, редактирование и удаление событий, управление участниками, доступ к коду вставки виджета. |
manage_organization | Даёт все права на события автоматически (есть у владельца организации). |
Администраторы сайта (роль админа и выше) проходят мимо всех проверок. Обычный участник без права manage_events видит календарь, записывается на события и смотрит список участников, но не может создавать или удалять события.
Включение и отключение модуля
Модуль включается владельцем организации в Кабинет админа → 🔧 Управление модулями переключателем «Календарь событий». При выключении кнопка раздела исчезает из меню у всех, публичный виджет перестаёт отдавать события, а сами данные сохраняются — при повторном включении календарь вернётся в прежнем виде.
Шпаргалка
| Действие | Как сделать |
|---|---|
| Создать событие | + Событие в шапке раздела |
| Записаться | Селект «Возможно / Я пойду / Не пойду» в карточке |
| Посмотреть, кто идёт | Клик по счётчику «👥 N» в карточке |
| Встроить календарь на сайт | 🔗 Код для вставки в шапке раздела |
| Настроить напоминания | Редактирование профиля → блок «🔔 Настройки уведомлений» |
| Отправить напоминания вручную | Команда php artisan events:send-reminders |