Система уведомлений на базе Event Bus и Notification Center

Система позволяет отправлять уведомления пользователям, просто публикуя событие в коде. Модуль событий сам перехватывает их и передает в центр уведомлений. Это обеспечивает высокую степень автоматизации процессов рассылки, минимизируя ручную работу и упрощая поддержку системы.

1. Краткие условия для работы (Чек-лист)

Чтобы уведомление ушло, должны быть выполнены все следующие условия:

  • В модуле событий (erp208):
    • В таблице erp_208_event_subscribers есть запись с вашим event_name.
    • У этой записи флаг is_notification = 1 и is_active = 1.
  • В центре уведомлений (erp217):
    • Подписка: В таблице erp217_subscriptions конкретный пользователь подписан на этот тип события (event_type) и канал (email/telegram).
    • Шаблон: В таблице erp217_templates создан текст письма/сообщения для этого события и канала.
    • Данные: У пользователя в профиле заполнен email или telegram_id (в зависимости от канала).

2. Как это работает (Алгоритм)

  1. Вызов: Вы пишете в коде EventBus::instance()->publish('order_ready', $data, $user_id).
  2. Перехват: EventBus видит в БД, что на 'order_ready' стоит флаг is_notification.
  3. Передача: EventBus вызывает метод _proxy_to_notification_center, который отправляет данные в Service_Erp217_Bus.
  4. Очередь: Центр уведомлений проверяет подписки пользователя, рендерит шаблон (заменяя {{переменные}} на данные из $data) и кладет готовое сообщение в таблицу erp217_queue.
  5. Отправка: Cron (планировщик) раз в минуту берет записи из очереди и физически отправляет их через SMTP или API мессенджеров.

3. Как это выглядит для пользователя

Для разработчика:
Это одна строчка кода. Не нужно заботиться о том, как отправить письмо или проверить настройки пользователя.
Для администратора:
В админке модуля 208 он просто ставит галочку "Отправлять в уведомления" для нужного события. В модуле 217 он правит текст шаблона.
Для конечного пользователя:
Он получает письмо или сообщение в Telegram только по тем событиям, которые он сам разрешил в своем личном кабинете (настройках уведомлений).

4. Пример настройки нового уведомления

Если вы добавили в систему событие "Новый комментарий" (new_comment):

  1. БД (208): Добавьте строку в erp_208_event_subscribers: event_name='new_comment', is_notification=1.
  2. БД (217): Создайте шаблон в erp217_templates: event_alias='new_comment', subject='Новый комментарий', body='Вам написали: {{comment_text}}'.
  3. Код:
Service_Erp208_EventBus::instance()->publish('new_comment', [
    'comment_text' => 'Привет, как дела?',
    'target_user_id' => 10 // ID получателя
], $author_id);
Сложно ли это?
Нет. Основная сложность (логика проверки, рендеринга и очередей) скрыта внутри сервисов. Для расширения системы достаточно добавлять записи в таблицы БД, не меняя программный код модулей.

Применение в практике

Такой подход позволяет внедрять новые типы уведомлений без изменения логики кода. Система становится гибкой и масштабируемой, а управление отправками реализуется через интерфейсы админки.