Введение
В Bitrix многие процессы завязаны на события, что позволяет гибко управлять логикой обработки различных действий. В данной статье мы рассмотрим, как можно отлавливать события создания комментариев в таймлайне сделки и выполнять определённые действия, используя стандартный класс EventManager из пространства имен Bitrix\Main.
Цель
Наша задача заключается в следующем: если создаётся комментарий в таймлайне сделки и при этом нет закрепленных комментариев, то созданный комментарий должен быть автоматически закреплен.
Шаги реализации
- Отлов события создания комментария
- Проверка наличия закрепленных комментариев
- Закрепление созданного комментария при отсутствии других закрепленных комментариев
Реализация
Логирование событий
Для того чтобы определить, какие события срабатывают в момент добавления комментариев, мы добавим логирование в метод 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. Это позволяет гибко настраивать бизнес-логику и автоматизировать многие процессы в системе.