Как добавить свою вкладку в карточку элемента СРМ?

Для начала добавляем обработчик на событие onEntityDetailsTabsInitialized:

<?php
Bitrix\Main\EventManager::getInstance()->addEventHandler(
    'crm',
    'onEntityDetailsTabsInitialized', 
    'myOnEntityDetailsTabsInitialized'
);

Данное событие как раз отвечает за формирование массива с вкладками элемента CRM. 

Далее нужно написать сам обработчик, который будет добавлять новую вкладку в карточку элемента CRM. Надо отметить, что вкладки могут работать в 2 режимах:

  1. Html код вкладки формируется сразу, в нашем случаи в самом обработчике;
  2. 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 раз.
  • Удобство разработки. Будет удобнее и проще вынести формирование вкладки в новый компонент, со своим шаблоном, стилями, скриптами и реализовать в нём всю необходимую логику.

Рубрики: PHP Bitrix

Если есть вопросы, что-то в статье не понятно или нашли ошибку, напишите об этом в комментариях, все комментарии читаются и по возможности материал будет доработан.
Популярные статьи

Bitrix сбросить буфер вывода

Функция RestartBuffer() в Bitrix используется для сброса буфера вывода. Она позволяет прервать вывод страницы на определенном этапе выполнения скрипта и начать вывод заново. В статье рассмотрим основные сценарии использования данной функции, рассмотрим пример кода.

Bitrix подключить класс компонента

В статье приводится пример того как можно подключить только компонент битрикс без подключения его шаблона, чтобы можно было вызвать его метод или получить значения свойств

Bitrix регистрация своего события

В статье приводится пример регистрации собственного события в bitrix и добавления на него обработчика.

Bitrix подключить модуль

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

Команда grep. Примеры использования

grep - удобная и быстрая команда, здесь приведены примеры как произвести рекурсивный поиск в каталоге, поиск среди запущенных процессов и другие.

Bitrix получить путь до компонента

В статье приводится пример кода для получения директории в которой находится файл компонента.

Комментарии

Комментариев пока нет
Данный сайт использует файлы cookies. Продолжая просмотр сайта, вы соглашаетесь с использованием файлов cookies.
ОК