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

Для начала добавляем обработчик на событие 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

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

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

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

Подключить bitrix без подключения шаблона сайта

В статье приводится пример кода подключения bitrix без подключения шаблона сайта. Так же описано когда это может пригодится.

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

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

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

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

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

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

Как в bitrix получить параметры запроса

Из этой статьи вы узнаете, какие классы и методы в bitrix помогут получить данные запроса без использования глобальных переменных. Это важный навык, который обязательно пригодится в вашей работе.

Комментарии

X22Alcor [23.06.2024]
Привет люди!!!!!
Всем хорошего настроения и удачи!!!!!
X22Alcor [25.06.2024]
Всем хорошего настроения!!!!!
X22Alcor [29.06.2024]
Всем хорошего настроения!!!!!
Александр [11.07.2024]
нужно такое под битриск 24 как связаться?
Данный сайт использует файлы cookies. Продолжая просмотр сайта, вы соглашаетесь с использованием файлов cookies.
ОК