Битрикс КП. Получаем список задач с комментариями
18.02.2015
Обожаю КП и задачи по нему, всегда находится место, где надо проводить целое исследование по коду или докам, чтобы понять как написать две строки нужного кода.
Задача на сегодня: быстренько написать инструмент, позволяющий получать отчёты, пригодные для чтения табличными редакторами. Инструмент должен содержать фильтр по социальным группам (к ним можно привязывать таски), период выбора задач (по дате создания задачи) и фильтр по статусу задачи.
Задача на сегодня: быстренько написать инструмент, позволяющий получать отчёты, пригодные для чтения табличными редакторами. Инструмент должен содержать фильтр по социальным группам (к ним можно привязывать таски), период выбора задач (по дате создания задачи) и фильтр по статусу задачи.
Логика
Шаг первый. Показываем список групп мультиселектом. Показываем компоненту битрикса для выбора интервала дат. Показываем список статусов задач мультиселектом. Внизу кнопочка Показать предварительные результаты.
Шаг второй. Считаем количество подходящих под фильтр задач, выводим их количество. Выводим две кнопки Скачать и Вернуть. Скачать переводит нас на следующий шаг, в Вернуть - показывает шаг первый с сохранёнными настройками фильтра.
Шаг третий. Получаем задачи по фильтру, получаем комментарии для них, выводим код в виде файла, подходящего под считывание/импорт Экселем и ему подобным.
Шаг первый
Список групп мы спокойно получаем через API:
Список групп мы спокойно получаем через 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(); |
Шаг третий
Получить список задач, подходящих под фильтр, просто, а вот попробуйте понять как получить список комментов к задаче =) Мой метод прост - лезем в код.
Понимаем (в течении часа), что для комментов используются сообщения форума. Тут будет правильным вставить картинку одного из плакатиков, которые висят в нашем офисе.
Понимаем (в течении часа), что для комментов используются сообщения форума. Тут будет правильным вставить картинку одного из плакатиков, которые висят в нашем офисе.
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_*')); |
9812