Найти тему
Helpers Bitrix

Отлов и обработка событий в Bitrix: Пример работы с комментариями в таймлайне сделки OnAfterCrmTimelineCommentAdd

Оглавление

Введение

В Bitrix многие процессы завязаны на события, что позволяет гибко управлять логикой обработки различных действий. В данной статье мы рассмотрим, как можно отлавливать события создания комментариев в таймлайне сделки и выполнять определённые действия, используя стандартный класс EventManager из пространства имен Bitrix\Main.

Цель

Наша задача заключается в следующем: если создаётся комментарий в таймлайне сделки и при этом нет закрепленных комментариев, то созданный комментарий должен быть автоматически закреплен.

Шаги реализации

  1. Отлов события создания комментария
  2. Проверка наличия закрепленных комментариев
  3. Закрепление созданного комментария при отсутствии других закрепленных комментариев

Реализация

Логирование событий

Для того чтобы определить, какие события срабатывают в момент добавления комментариев, мы добавим логирование в метод findEventHandlers класса EventManager. Это поможет нам понять, какие события нам доступны и как их использовать.

Модификация класса EventManager

namespace Bitrix\Main;

class EventManager
{
// Остальной код класса

public function findEventHandlers($eventModuleId, $eventType, array $filter = null)
{
if (!$this->isHandlersLoaded)
{
$this->loadEventHandlers();
}

\Bitrix\Main\Diag\Debug::writeToFile(
['$eventModuleId' => $eventModuleId, '$eventType' => $eventType],
'findEventHandlers',
"/local/requests.log"
);

$eventModuleId = strtoupper($eventModuleId);
$eventType = strtoupper($eventType);

if (!isset($this->handlers[$eventModuleId]) || !isset($this->handlers[$eventModuleId][$eventType]))
{
return [];
}

$handlers = $this->handlers[$eventModuleId][$eventType];
if (!is_array($handlers))
{
return [];
}

if (is_array($filter) && !empty($filter))
{
$handlersTmp = $handlers;
$handlers = [];
foreach ($handlersTmp as $handler)
{
if (isset($handler['TO_MODULE_ID']) && in_array($handler['TO_MODULE_ID'], $filter))
{
$handlers[] = $handler;
}
}
}

return $handlers;
}
}


Регистрация обработчика события

Мы будем использовать событие OnAfterCrmTimelineCommentAdd для выполнения нашей логики. Зарегистрируем обработчик следующим образом:

$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler(
'crm',
'OnAfterCrmTimelineCommentAdd',
[$this, 'OnAfterCommentAdd']
);

Логика обработчика

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

public function OnAfterCommentAdd(\Bitrix\Main\Event $event)
{
/** @var \Bitrix\Main\Event $event */
$params = $event->getParameters();

if (!isset($params['ID'])) {
return;
}

$commentId = $params['ID'];
$timelineComments = $this->getTimelineEntityElement($commentId);

$dealId = $timelineComments['ENTITY_ID'];
$entityTypeId = $timelineComments['ENTITY_TYPE_ID'];
$fixedComments = $this->getFixedComments($dealId, $entityTypeId);

if (empty($fixedComments)) {
$ownerId = $commentId;
\Bitrix\Crm\Timeline\Entity\TimelineBindingTable::setIsFixed($ownerId, $entityTypeId, $dealId, true);
}
}

Вспомогательные методы

Для получения элементов сущности и закрепленных комментариев реализуем вспомогательные методы:

private function getTimelineEntityElement($commentId)
{
$timelineEntityElements = [];
$filter = [
'OWNER_ID' => $commentId,
];

$res = \Bitrix\Crm\Timeline\Entity\TimelineBindingTable::getList([
'filter' => $filter,
'select' => ['ENTITY_TYPE_ID', 'ENTITY_ID']
]);

while ($entityElement = $res->fetch()) {
$timelineEntityElements = $entityElement;
}

return $timelineEntityElements;
}

private function getFixedComments($dealId, $entityTypeId)
{
$fixedComments = [];

$filter = [
'ENTITY_TYPE_ID' => $entityTypeId,
'ENTITY_ID' => $dealId,
'IS_FIXED' => 'Y'
];

$res = \Bitrix\Crm\Timeline\Entity\TimelineBindingTable::getList([
'filter' => $filter,
'select' => ['OWNER_ID']
]);

while ($comment = $res->fetch()) {
$fixedComments[] = $comment;
}

return $fixedComments;
}

Заключение

В данной статье мы рассмотрели, как можно отлавливать события в Bitrix и выполнять необходимые действия с использованием стандартного класса EventManager. Это позволяет гибко настраивать бизнес-логику и автоматизировать многие процессы в системе.