среда, 10 декабря 2014 г.

Битрикс КП. Получаем список задач с комментариями.

Обожаю КП и задачи по нему, всегда находится место, где надо проводить целое исследование по коду или докам, чтобы понять как написать две строки нужного кода.

Задача на сегодня: быстренько написать инструмент, позволяющий получать отчёты, пригодные для чтения табличными редакторами. Инструмент должен содержать фильтр по социальным группам (к ним можно привязывать таски), период выбора задач (по дате создания задачи) и фильтр по статусу задачи.

Логика

Шаг первый. Показываем список групп мультиселектом. Показываем компоненту битрикса для выбора интервала дат. Показываем список статусов задач мультиселектом. Внизу кнопочка Показать предварительные результаты.
Шаг второй. Считаем количество подходящих под фильтр задач, выводим их количество. Выводим две кнопки Скачать и Вернуть. Скачать переводит нас на следующий шаг, в Вернуть - показывает шаг первый с сохранёнными настройками фильтра.
Шаг третий. Получаем задачи по фильтру, получаем комментарии для них, выводим код в виде файла, подходящего под считывание/импорт Экселем и ему подобным.

Шаг первый

Список групп мы спокойно получаем через API:
$hGroups = CSocNetGroup::GetList();
while($row = $hGroups->Fetch())
 $arGroups[$row['ID']] = $row;

За списком статусов лезем в документацию, находим, составляем массивчег.
$arStatuses = array(
 -2 => 'Новая, не просмотрена [VIRGIN_NEW]',
 -1 => 'Просрочена [EXPIRED]',
 1 => 'Новая [NEW]',
 2 => 'Принята [PENDING]',
 3 => 'Выполняется [IN_PROGRESS]',
 4 => 'Условно завершена [SUPPOSEDLY_COMPLETED]',
 5 => 'Завершена [COMPLETED]',
 6 => 'Отложена [DEFERRED]',
 7 => 'Отклонена [DECLINED]',
 );

За компонентом лезем также в документацию, находим прям то, что надо:
IncludeComponent('bitrix:main.calendar', '', Array(
      'SHOW_INPUT' => 'Y',
      'FORM_NAME' => '',
      'INPUT_NAME' => 'date_from',
      'INPUT_NAME_FINISH' => 'date_to',
      'INPUT_VALUE' => $date_from,
      'INPUT_VALUE_FINISH' => $date_to,
      'SHOW_TIME' => 'N', 
      'HIDE_TIMEBAR' => 'Y',
      'INPUT_ADDITIONAL_ATTR' => 'placeholder="дд.мм.гггг"'
   )
);?>


Шаг второй

Формируем из полученных данных массив фильтра для API и спрашиваем, используя стандартную
CTasks::GetList();

Шаг третий

Получить список задач, подходящих под фильтр, просто, а вот попробуйте понять как получить список комментов к задаче =) Мой метод прост - лезем в код.
Понимаем (в течении часа), что для комментов используются сообщения форума. Тут будет правильным вставить картинку одного из плакатиков, которые висят в нашем офисе.

Собственно, особо не заморачиваясь, копируем найденный кусочек кода из компоненты, чуток подправляя под себя. Если мы уберём из фильтра поле PARAM1, то обнаружим видимо служебную запись. Поэтому оставляем как есть, она нам не нужна. Поля FORUM_ID и FORUM_TOPIC_ID стандартно приходят в свойствах полученной задачи.
if ($row['FORUM_ID'] && $row['FORUM_TOPIC_ID'])
{
 //только не спрашивайте что такое "ТК", для этого надо понимать логику разработчика
 $hComments = CForumMessage::GetListEx(array("ID"=>"ASC"), array("FORUM_ID"=>$row['FORUM_ID'], 'TOPIC_ID'=>$row['FORUM_TOPIC_ID'], "!PARAM1" => 'TK'));
 while ($line = $hComments->Fetch())
  $arComments = array('POST_DATE'=>$line['POST_DATE'], 'POST_MESSAGE'=>$line['POST_MESSAGE']);
}

Файл для Экселя

Путём поверхностного гугления нашёлся самый простой метод - формирование таблицы в html-тегах, её табличные редакторы спокойно умеют импортировать автоматически.
А чтобы файл сразу был скачиваемым, отправляем заголовки.
header('Content-Type: text/html; charset=utf-8');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', FALSE);
header('Pragma: no-cache');
header('Content-transfer-encoding: binary');
header('Content-Disposition: attachment; filename=report'.time().'.xls');
header("Content-Type: application/vnd.ms-excel");

Далее формируем табличку.

Дополнения

Получение пользовательских полей задачи. Чтобы получить пользовательские поля надо использовать третий параметр API функции GetList, например вот так.
$hGTasks = CTasks::GetList(array(), $arFilter, array('*', 'UF_*'));


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


Инструмент отчётов

Комментариев нет:

Отправить комментарий