Для начала добавляем обработчик на событие onEntityDetailsTabsInitialized:
<?php
Bitrix\Main\EventManager::getInstance()->addEventHandler(
'crm',
'onEntityDetailsTabsInitialized',
'myOnEntityDetailsTabsInitialized'
);
Данное событие как раз отвечает за формирование массива с вкладками элемента CRM.
Далее нужно написать сам обработчик, который будет добавлять новую вкладку в карточку элемента CRM. Надо отметить, что вкладки могут работать в 2 режимах:
- Html код вкладки формируется сразу, в нашем случаи в самом обработчике;
- Html код влкдаки будем запрошен позже по ajax, если пользователь решит её открыть.
Само название вкладки будет отображаться сразу в карточке элемента CRM в любом из вариантов.
Вариант 1. Код вкладки формируется сразу
<?php
function myOnEntityDetailsTabsInitialized($event) {
$tabs = $event->getParameter('tabs');
// ID текущего элемента СРМ
$entityID = $event->getParameter('entityID');
// ID типа сущности: Сделка, Компания, Контакт и т.д.
$entityTypeID = $event->getParameter('entityTypeID');
// Проверяем, что открыта карточка именно Сделки
if($entityTypeID == \CCrmOwnerType::Deal) {
// Добавляем свою вкладку в массив вкладок
$tabs[] = [
'id' => 'newTab',
'name' => 'Новая вкладка',
// Выведим в содержимое новой вкладки ID текущей сделки
'html' => '<b>Содержимое новой вкладки. ID Сделки: '. $entityID .'</b>'
];
}
// Возвращаем модифицированный массив вкладок
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, [
'tabs' => $tabs,
]);
}
Теперь в карточке сделки появится новая вкладка с названием "Новая вкладка" и содержимым "Содержимое новой вкладки. ID Сделки: Х".
Примерный результат показан на изображении ниже:
Вариант 2. Код вкладки загружается по ajax
<?php
function myOnEntityDetailsTabsInitialized($event) {
$tabs = $event->getParameter('tabs');
// ID текущего элемента СРМ
$entityID = $event->getParameter('entityID');
// ID типа сущности: Сделка, Компания, Контакт и т.д.
$entityTypeID = $event->getParameter('entityTypeID');
// Проверяем, что открыта карточка именно Сделки
if($entityTypeID == \CCrmOwnerType::Deal) {
// Добавляем свою вкладку в массив вкладок
$tabs[] = [
'id' => 'newTab',
'name' => 'Новая вкладка',
'loader' => [
// Указываем URL адрес обработчика
'serviceUrl' => '/ajax/ajax.php',
'componentData' => [
'template' => '',
// Передаем массив необходимых параметров
'params' => [
'ENTITY_ID' => $entityID,
'ENTITY_TYPE' => $entityTypeID,
'TAB_ID' => 'newTab'
]
]
]
];
}
// Возвращаем модифицированный массив вкладок
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, [
'tabs' => $tabs,
]);
}
В данном случаи обращение по указанному в обработчике URL адресу будет происходить только при переходе на новую вкладку. В файле ajax.php сделаем дамп переменной $_REQUEST и посмотрим какие данные приходят в запросе:
Заключение
Как видно из примеров выше, добавление свое вкладки в карточку элемента CRM не самая трудная задача. Но и тут лучше придерживаться некоторых рекомендаций:
Во-первых нужно указывать для какой именно сущности (объекта) мы добавляем вкладку: сделка, контакт, лид, компания и т.д. Инача новая вкладка появится в карточках всех сущностей, что скорее всего не нужно.
Во-вторых лучше использовать вариант с загрузкой содержимого вкладки по ajax, у этого способа есть несколько преимуществ:
- При открытии карточки элемента CRM не тратиться время на формирование содержимого новой вкладки. Вполне возможно, что новая вкладка будет содержать какую-то сложную логику или просто обрабатывать большой объем данных, например для построения статистики, тогда её загрузка будет занимать продолжительное время.
- Формирование содержимого вкладки только при необходимости. Скорее всего новую вкладку будут открывать не каждый раз при открытии карточки CRM, возможно даже не каждый 5 раз.
- Удобство разработки. Будет удобнее и проще вынести формирование вкладки в новый компонент, со своим шаблоном, стилями, скриптами и реализовать в нём всю необходимую логику.