Обработчики событий

Урок 7 из 7

25 мин

Нормально

Рассмотрим функциональность обработчиков событий применительно к Битрикс24.

Немного теории

Типовые места регистрации обработчиков событий в Bitrix Framework:

  • local/php_interface/init.php;
  • <module-root>/include.php;
  • В базе данных при установке модуля.

Доработка Битрикс24, как правило, производится с помощью модулей. В репозиторий с кодом доработок не попадает вся публичная часть, а только конкретные модули.

Файл init.php, скорее всего, не будет контролироваться вашим кодом, а даже если и будет, то доработка Битрикс24 с использованием этого файла может привести к неприятным ошибкам.

Файл include.php внутри модуля исполняется только в момент подключения модуля (вызов \Bitrix\Main\Loader::includeModule). Если на странице модуль не подключается, то и обработчики выполнены не будут.

Регистрация ваших обработчиков

При доработке Битрикс24, самым надёжным и удобным способом подписки на глобальные события системы является регистрация ваших обработчиков в базе данных.

Основные классы для работы с Агентами:

Класс Назначение
\Bitrix\Main\EventManager

Менеджер событий. Предоставляет интерфейс регистрации, удаления и получения списка обработчиков.

Основные методы:

  • registerEventHandler
  • unRegisterEventHandler
  • findEventHandlers
  • addEventHandler
  • removeEventHandler
\Bitrix\Main\Event

Представляет само событие. Объединяет в себе информацию о событии: модуль, тип и параметры. Объекты данного класса приходят в функцию обработчик в качестве параметра при использовании событий “нового” типа.

\Bitrix\Main\EventResult

Результат выполнения события. Объект данного класса возвращается обработчиками событий “нового” типа.

У классов \Bitrix\Main\Event и \Bitrix\Main\EventResult существует несколько наследников. Чаще всего вы встретитесь с \Bitrix\Main\ORM\Event и \Bitrix\Main\ORM\EventResult. Объекты этих классов используются при работе с событиями ORM.

Практика

Типовые задачи, решаемые с помощью обработчиков событий

  • Отправка нестандартных оповещений на почту, в иные системы.
  • С помощью кастомного JS/CSS кода добавить кнопку в карточке сделки.
  • Запретить редактировать сущность crm, если не заполнено одно из полей.
  • Отправка данных в стороннюю систему, при возникновении какого-то события, например: при создании сделки отправлять данные по ней в 1С.
  • Синхронизация сущностей. Например, если обновилось поле в сделке, то обновляем поле в смарт-процессе.

Пример: запретим типовое действие по сделке

Запретить переводить сделку в одно из неуспешных состояний, если в таймлайне нет комментария от ответственного по сделке. Комментарий от ответственного должен быть последним.

Для решения необходимо:

  • Проверить тип - успешный, неуспешный - можно с помощью класса \Bitrix\Crm\PhaseSemantics.
  • Создать обработчик события OnBeforeCrmDealUpdate.
  • Если статус сделки был изменён и стал неуспешным, то проверяем наличие комментария в таймлайне.
  • Если последний комментарий в таймлайне был оставлен текущим ответственным по сделке, то завершаем выполнение обработчика.
  • Если комментария нет или он был сделан другим пользователем, то откатываем статус до предыдущего и выводим пользователю сообщение с просьбой оставить комментарий.
  • При изменении сделки внутри обработчика произойдёт рекурсия. Необходимо предусмотреть защиту от неё.
  • Реализовать и выполнить миграцию.

Создание обработчика события

21 мин

Список ресурсов

Материалы для выполнения практики

  • Исходный код примера (.zip)