Матвей Земсков

Заметки веб-мастера

Понедельник, 29 января 2018 22:36

Добавляем название компании в списке планируемых звонков («Мои дела» Битрикс24)

Оцените материал
(4 голосов)

Некоторое время назад мне была поставлена задача: нужно было при планировании звонка клиенту добавить возможность показа в списке дел на портале Битрикс24 название компании к которой «привязан» клиент. В стандартном решении такой возможности не предусмотрено. Специалисты техподдержки в ответ на мое обращение создали заявку на разработку указанного функционала. Как известно, это может занять довольно много времени, а возможность показа компании клиента в списке звонков нужна уже сейчас, поэтому я не стал ждать и решил эту задачу самостоятельно. Мое решение не претендует на уникальность. Возможно, вы придумаете что-то более оригинальное. Тем не менее, я мне захотелось поделиться им с читателями.

За показ списка «моих дел» на портале Битрикс24 отвечает комплексный компонент bitrix:crm.activity. Для решения задачи необходимо было создавать копию шаблона компонента и кастомизировать его, а это не приветствуется в Битрикс24 (из-за того, что этот шаблон не будет обновляться).

В связи с этим было принято решение создать копию страницы со списком моих дел, разместить на ней компонент bitrix:crm.activity и кастомизировать его шаблон. На текущей странице (далее по тексту будет называть ее стандартной) со списком дел добавить ссылку на новую страницу. Таким образом при добавлении возможности показа компании клиента разработчиками Битрикса, мы увидим это на странице со стандартным шаблоном.

Для решения задачи нам нужно будет сделать следующие действия:

  • Создать новую страницу (назовем ее «список с дополнениями») и разместить на ней компонент bitrix:crm.activity;
  • Создать копию шаблона этого компонента и кастомизировать его;
  • Добавить ссылку на новую страницу на странице со стандартным шаблоном;

Итак, приступим. Первый пункт я описывать не буду, с этим каждый справится, поэтому перейдем сразу ко второму.

Так как компонент bitrix:crm.activity – комплексный, он состоит из нескольких простых. Нужно понять какой простой компонент отвечает за показ списка дел. Это можно выяснить без особых трудностей: им является bitrix:crm.activity.list (шаблон - grid).

Создадим копию шаблона bitrix:crm.activity, назовем его custom, и разместим в папке дефолтного шаблона портала (/bitrix/templates/.default/components/bitrix). Далее переходим в папку шаблона (grid простого компонента bitrix:crm.activity.list.

Для того, чтобы была возможность показывать в таблице новый столбец, нужно добавить массив с его названием и описанием в массив $arResult["HEADERS"]. Это можно сделать с помощью файла result_modifier.php, который будет размещен в папке с шаблоном grid.

Содержимое файла будет следующим:

PHP

<?
$arCustomHeader = Array(
	"id" => "COMPANY",
	"type" => "text",
	"name" => "Компания",
	"width"=>"200",
	"default"=>"1",
	"editable"=>"1"
);

// добавляем в талицу столбец "Компания"
array_splice($arResult["HEADERS"], 6, 0, array($arCustomHeader));
?>

После этих действий мы сможем увидеть столбец в шапке таблицы. Его содержание будет такое, как определено в массиве $arCustomHeader («Компания»). Заголовок мы вывели, теперь нужно вывести название компаний клиентов в строках таблицы с планируемыми звонками. Для этого нужно добавить определенный PHP-код в файл template.php.

Найдем в файле строку с условием: if($arResult['DISPLAY_CLIENT']), и вставим перед ней следующий блок кода:

PHP

// Если это звонок ($item['~TYPE_ID'])
	if($typeID === CCrmActivityType::Call){		
		
		if($arResult['DISPLAY_CLIENT'] && isset($item['CLIENT_INFO']) && $item['OWNER_TYPE_ID'] == CCrmOwnerType::Contact){
			//Получаем данные о компании клиента
			//$arContactInfo = CCrmContact::GetByID($item['CLIENT_INFO']['ENTITY_ID']);
			
			$arFilter = Array('ID'=>$item['CLIENT_INFO']['ENTITY_ID']);
			$arSelect = Array('COMPANY_ID', 'COMPANY_TITLE');
			
			$obCont = CCrmContact::GetList(Array(), $arFilter, $arSelect);
			$arContactInfo = $obCont->Fetch();		
			if (!empty($arContactInfo['COMPANY_ID']) && !empty($arContactInfo['COMPANY_TITLE'])){
				$arRowData['columns']['COMPANY'] = '<a href="/crm/company/show/'.$arContactInfo['COMPANY_ID'].'/">'.$arContactInfo['COMPANY_TITLE'].'</a>';
			}			
		}		
	}

После добавления кода мы увидим в строках таблицы, которые связаны с планируемыми звонками, название компании, к которой «привязан» клиент.

Также на странице списка с дополнениями необходимо добавить ссылку на стандартную страницу, чтобы после просмотра списка звонков, мы могли бы перейти на страницу со стандартным списком. Разместим ее над таблицей в правом верхнем углу. Так как эта часть страницы списка дел не является частью шаблона компонента bitrix:crm.activity.list, добавление ссылок нужно осуществить с помощью JS. Создадим файл script.js со следующим содержимым:

JavaScript

BX.ready(function(){
	var listBtn = BX.findChild(
		BX('content-table'),
			{
				tag: 'div',
				property:{
					id: 'crm_activity_list_my_activities_list'
				}
					
			},
			true
	);
	
	if(listBtn){
		
		BX.adjust(listBtn, {attrs: {style: 'display:none;'}});
		
		var listBackBtn = BX.create('a',{
			attrs:{
				href: '/crm/activity/',
				className: 'custom_crm_actvity_link'
			},
			text: 'Список'
		});
		
		
		var customListBtn = BX.create('span',{
			attrs:{				
				className: 'custom_crm_actvity_span'
			},
			text: 'Список с дополнениями'
		});
				
		BX.insertAfter(customListBtn, listBtn);
		BX.insertAfter(listBackBtn, listBtn);
	}
});

Приведенный выше код скроет стандартную кнопку с подписью «Список», которая на указанной странице не срабатывает как ссылка на стандартную страницу. Вместо нее разместим «свою» ссылку, ведущую на стандартную страницу со списком, а также HTML-элемент <span>, который будет указывать, что мы находимся на странице списка с дополнением.

Также в нашем шаблоне добавлен файл с CSS-стилями (style.css), который стилизует добавленные ссылки.

Если мы все сделали правильно, то на данный момент страница с кастомизированным списком готова, и мы можем перейти к добавлению ссылки на нее на стандартной странице.

Это можно (и нужно) сделать при помощи JS кода. Для начала создадим скрипт, который будет добавлять ссылку и размещать ее после кнопки «Список» на стандартной странице со списком (как показано на изображении выше). Создадим папку для нашего скрипта в /bitrix/js/. Я назвал ее custom_activity. В ней создадим JS-файл. Например, с именем create_link.js. Для стилизации ссылок, можно создать в этой папке и CSS-файл, с аналогичным именем: create_link.css

JS-код в этом файле будет выглядеть следующим образом:

JavaScript

BX.ready(function(){
	var listBtn = BX.findChild(
		BX('content-table'),
			{
				tag: 'div',
				property:{
					id: 'crm_activity_list_my_activities_list'
				}
					
			},
		true
	);
	
	if(listBtn){
		var customListBtn = BX.create('a',{
			attrs:{
				href: '/crm/activity/custom.php',
				className: 'custom_crm_actvity_link'
			},
			text: 'Список с дополнениями'
		});
		
		BX.insertAfter(customListBtn, listBtn);
	}
});

Этот скрипт похож на приведенный выше – с его помощью в правом верхнем углу в список ссылок над таблицей добавляется новый пункт.

Для того, чтобы этот скрипт запустился и сработал на нужной нам странице, добавим в файл /bitrix/php_interface/init.php следующий код:

PHP

<?
AddEventHandler('main', 'OnEpilog', function () {
$arJsConfig = array(
		'custom_activities' => array(
			'js' => '/bitrix/js/custom_activities/create_link.js',
			'css' => '/bitrix/js/custom_activities/create_link.css',
			)	
		);
	foreach ($arJsConfig as $ext => $arExt) {
		\CJSCore::RegisterExt($ext, $arExt);
	}
	$context = \Bitrix\Main\Application::getInstance()->getContext();
	$server = $context->getServer();
	$url = $server->getRequestUri();
	if($url == '/crm/activity/'){
		CUtil::InitJSCore(array('custom_activities'));
	}		
});
?>

Как можно понять из приведенного выше кода, при наступлении события OnEpilog файл со скриптом подключается и срабатывает в случае если URL текущей страницы равен /crm/activity/.

Если все сделано правильно, то при загрузке страницы со списком моих дел, на ней будет появляться ссылка на страницу с кастомизированным списком, в котором у запланированных звонков будет отображаться компания, к которой «привязан» клиент.

Скачать примеры кода из статьи

Прочитано 5628 раз
Мои услуги

Предлагаю следующие услуги:

  • Верстка шаблона сайта из дизайн-макета для CMS «1С-Битрикс Управление сайтом» и CMS “Joomla”
  • Создание форм различной сложности (обратная связь, анкеты и тп) для указанных CMS
  • Настройка и кастомизация компонентов и модулей для указанных CMS
  • Доработка модулей и компонентов для указанных CMS, добавление нестандартного функционала
  • Разработка лендингов (landing-pages)

По все вопросам обращайтесь через форму обратной связи

Скачать

Предлагаю вашему вниманию:

Наверх