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

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

Среда, 10 июля 2019 20:47

Расширяем функционал задач в Битрикс24

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

В этой статье мне бы хотелось рассмотреть процесс расширения функционала задач (модуль Битрикс24 Tasks). Оно будет заключаться в следующем: нужно сделать так, чтобы при добавлении нового комментария закрытая задача вновь становилась активной. Также необходимо отображать последний комментарий, добавленный в задачу, в списке задач. Если вам когда-либо требовался такой функционал, то предлагаю ознакомиться со статьей более подробно.

Обычно я разделяю масштабную задачу на несколько небольших задач и решаю их по очереди. Также поступлю и в этот раз. Сначала рассмотрим смену статуса закрытой задачи при добавлении комментария. Затем реализацию отображения последнего комментария в списке задач.

Замечу, что обе задачи мы будем решать путем использования события OnAfterCommentAdd. Код обработчика события разместим в файле /local/php_interface/init.php.

Итак, пункт первый: активация задачи при добавлении комментария в нее.

Добавляем в обработчик события Битрикс OnAfterCommentAdd следующий код:

PHP

AddEventHandler('tasks', 'OnAfterCommentAdd', function ($commentId, &$arFields) {
    if (CModule::IncludeModule("tasks")) {
        $oTask = CTaskItem::getInstance($arFields['TASK_ID'], 1);
        if ($oTask->isActionAllowed(11)) {
            $arr = array();
            $oTask->renew($arr);
            LocalRedirect($APPLICATION->GetCurPage());
        }
    }
});

В нем мы получаем объект задачи и сохраняем его в переменную $oTask, далее проверяем доступно ли для текущей задачи действие по ее возобновлению. Оно передается функции isActionAllowed в виде числа 11. Полный список идентификаторов действий хранится в файле /bitrix/modules/task/classes/general/taskitem.php в виде констант.

Например, указанное значение хранится в константе ACTION_RENEW. Значение констант хранится в шестнадцатеричном формате. Если действие доступно для текущей задачи, мы возобновляем ее методом renew. Единственным аргументом этого метода в данном случае является пустой массив. Вообще нем можно передавать различные параметры. Например, нужно возобновлять подзадачи (AFFECT_CHILDREN).

Так как содержимое задачи в Битрикс24 обычно отображается в «выезжающем» блоке чтобы было видно ее обновленное состояние, нужно выполнить редирект на страницу текущей задачи.

Добавлено 31.05.20

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

Он заключается в использовании своего обработчика JS-события OnClickSubmit. Это одно из событий, которое происходит при добавлении комментария к задаче. Организуем работу следующим образом: у нас будет 2 файла. Один из них будет JS-файл с обработчиком. Он будет размещаться в папке /bitrix/js/custom_task/ct_clicksubmit.js. Вторым будет php-файл с кодом, который будет очень похож на тот, который размещался ранее в обработчике OnAfterCommentAdd. Этот файл будет вызываться из JS-файла посредством AJAX-запроса. Его можно разместить в корне портала и назвать ct_clicksubmit.php

Также мы зарегистрируем JS-обработчик в файле /bitrix/php_interface/init.php.

PHP

	AddEventHandler('main', 'OnEpilog', function () {
		global $USER;
		$arJsConfig = array(
			'custom_tasks' => array(
				'js' => '/bitrix/js/custom_tasks/ct_clicksubmit.js'
			)		
		);
		foreach ($arJsConfig as $ext => $arExt) {
			\CJSCore::RegisterExt($ext, $arExt);
		}
		
		$context = \Bitrix\Main\Application::getInstance()->getContext();
		$server = $context->getServer();
		$url = $server->getRequestUri();
		
		if($url == '/tasks/task/view/'){
			CUtil::InitJSCore(array('custom_tasks'));
		}
	});
	

В файле /bitrix/js/custom_task/ct_clicksubmit.js размещаем следующий, код:

JavaScript

BX.ready(function(){
	BX.addCustomEvent("OnClickSubmit", function(){
		let taskId = window.location.href.split("/").reverse()[1];		
		 BX.ajax({
                  url: '/ct_clicksubmit.php',
             	data: {
                    taskId: taskId
                 },
                 dataType: 'json',
       	     onsuccess: function(data){
		         window.location.reload();
   		     },
		    onfailure: function(){
                    console.log('Task Update Error');
               }
	     });		
	});
});

Для отправки AJAX-запроса мы используем метод BX.ajax. В качестве параметров мы будем передавать PHP-скрипту идентификатор задачи taskId, который мы получаем выше из адресной строки браузера.

PHP-скрипт (/ct_clicksubmit.php), который будет обрабатывать запрос, будет выглядеть следующим образом:

PHP

	define('stop_statistics', true);
	define('no_keep_statistic', 'y');
	define('no_agent_statistic','y');
	define('disableeventscheck', true);
	define('bx_security_show_message', true);
	define('not_check_permissions', true);

	require($_server["document_root"] . "/bitrix/modules/main/include/prolog_before.php");

	if(isset($_post['taskid']) && intval($_post['taskid']) > 0){
		$post_id = intval($_post['taskid']);
		if (cmodule::includemodule("tasks")) {
			$obtask = ctaskitem::getinstance($post_id, 1);
			if ($otask->isactionallowed(11)) {
				$arr = array();
				$otask->renew($arr);
			}		
		}	
	}

Фактически – это тот же обработчик события OnAfterCommentAdd, только с небольшими доработками.

Переходим ко второму пункту нашей программы: после добавления комментария он отображается в списке задач.

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

  • Создать в Битрикс пользовательское поле для хранения последних комментариев в задачах. Давайте его так и назовем: «последний комментарий», присвоим ему код UF_LAST_COMMENT. Это поле будет «привязано» к объекту задачи (TASKS_TASK).

    пользовательское поле Битрикс для хранения последних комментариев

    В настройках списка задач нужно вывести значения нового поля – в шапке таблицы появится столбец «Последний комментарий»

  • В обработчик события Битрикс OnAfterCommentAdd добавить следующий код:

    PHP

    AddEventHandler('tasks', 'OnAfterCommentAdd', function ($commentId, &$arFields) {
    	if ($arFields["COMMENT_TEXT"] != "") {
    		$arTask["UF_LAST_COMMENT"] = $arFields["COMMENT_TEXT"];
    		$obTask = new CTasks;
    		$success = $obTask->Update($arFields["TASK_ID"], $arTask);
    		if($success) {
    			// при желании здесь можно добавить запись в лог
    		}
    	}
    });
    

    Если все сделано правильно, то в списке задач мы увидим последний добавленный комментарий.

    последний комментарий, добавленный в задачу

Надеюсь, что описанные выше методы расширения функционала модуля задач Битрикс24, помогут читателю в его работе.

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

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

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

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

Скачать

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

Наверх