Одним из наших иностранных заказчиков было высказано пожелание – иметь возможность группировать список задач по исполнителям, с возможностью смены ответственного простым перетаскиванием задачи в нужную группу. Портал у них – коробочный, так что возможность таких изменений имеется. Да, в Битриксе есть сортировка по исполнителю, есть фильтрация по исполнителям – но оба варианта заказчика не устраивали, хотел именно группировку по исполнителю как некий «надуровень».
Первым делом – копируем компонент (tasks.list) в собственное пространство имен. В коде компонента (файл component.php) находим место – отвечающее за формирование сортировки данных. По коду хорошо видно, что сортировка находится в массиве $arOrders. Находим место, где он окончательно сформирован, и вставляем принудительно сортировку по исполнителю первой по порядку:
$arOrder = array_merge(array("RESPONSIBLE_ID" => "ASC"), $arOrder);
К нашему удивлению, при такой сортировке задачи нескольких исполнителей «перемешивались» друг с другом. У большинства все было как надо, но задачи нескольких исполнителей – шли «вперемешку». Стали копать подробнее API — оказалось, что в методе CTask::GetList при формировании сортировки, есть вот такой замечательный код:
foreach ($arOrder as $by => $order) { …… switch ($by) { …… case 'responsible_id': $arSqlOrder[] = " RESPONSIBLE_LAST_NAME ".$order." "; $needle = 'RESPONSIBLE_LAST_NAME'; break; …… } …… }
Значит, при запросе сортировки по идентификатору исполнителя (колонка с ид исполнителя есть в таблице b_tasks, возможность сортировать по ней — имеется) — Битрикс вместо этого сортирует по фамилии исполнителя. При этом никак не учтен тот факт, что фамилия может и не задаваться вовсе. У нас как раз такой случай. У всех исполнителей, у которых «смешивались» задачи – не была задана фамилия.
Теперь данные идут в нужном нам порядке, кроме этого на нужна информация о самих ответственных. В коде, формирующем массив задач – находим все уникальные идентификаторы ответственных и делаем запрос на получение их имен, фамилий, логинов (на случай если имя и фамилия не заданы).
Полученную информацию добавляем в массив $arResult – теперь мы можем работать с ней в шаблонах компонента.
В стандарте, компонент списка задач имеет два представления: вид списком и диаграмма Гантта. Соответственно изменять необходимо оба. В них уже есть группировка по проектам. Заказчик хочет сделать такую же группировку, но на уровень выше и по исполнителям. Начнем с простого списка.
Идем в его шаблон (template.php). Изучаем его логику. Находим место формирования группировки проектов. Копируем его и переделываем под формирование группировки исполнителей. Переписываем JS-скрипт, который отвечает за сворачивание-разворачивание группы. На выходе получаем такой вид:
У диаграммы Ганта – много JS скриптов, отвечающих за перенос задач, создание новых и т.п. Все их рассматривать нет смысла. Покажем только конечный результат: