И так. Продолжаем дорабатывать панель управления Битрикс.
Напомню задачу: добавить в модуль “Обучение” отчеты о прохождении тестов (всего пять видов).
Меню мы уже сделали.
Начнем с одно «фишечки» Битрикса. Как вы помните из предыдущей статьи (и могли заметить это в самом Битриксе), ссылки выглядять как «learn_report_questions.php?lang=».LANG, т.е. полностью ссылка будет выглядеть как «/bitrix/admin/learn_report_questions.php?lang=ru»? например.
Поэтому чтобы добавить страницу в панель управления нужно создать 2 страницы. :)
Для примера возьмем все тот же learn_report_questions.php. Идем в /bitrix/admin/ и создаем файл следующего содержания:
Далее создаем, собственно, саму страницу learn_report_questions.php в /bitrix/modules/learning/admin/. Теперь самое интерсное – отображение списка.
В большинстве случаев страница в панели управления состоит из 3 основных частей:
- Заголовок и цепочка навигации. Строится Битриксом автоматически – не наша забота
- Форма фильтрации. Делается через API Битрикса – наша забота ;)
- Список. Ради него все и затевалось :)
Поехали!
Подключаем заголовки и языковой файл:
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_before.php");
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/learning/prolog.php");
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/learning/include.php");
IncludeModuleLangFile(__FILE__);
Задаем уникальный в рамках всего Битрикса идентификатор таблицы и инициализируем два объекта: сортировщик и собственно сам список:
$sTableID = "t_report_questions";
$oSort = new CAdminSorting($sTableID, "ID", "desc");// инициализация сортировки
$lAdmin = new CAdminList($sTableID, $oSort);// инициализация списка
Инициализируем объект фильтра. Задаем «скрытое» (показвается по желанию) поле фильтрации по ID:
$filter = new CAdminFilter(
$sTableID."_filter",
array(
"ID",
)
);
Задаем название полей ввода, инициализируем фильтрацию:
//названия всех input'ов фильтра
$arFilterFields = Array(
"filter_id",
"filter_lesson_id",
);
$lAdmin->InitFilter($arFilterFields);//инициализация фильтра
Далее – самое важное – делаем выборку согласно сортировке и фильтру и преобразуем в специальный формат.
// инициализация списка - выборка данных
$rsData = CLQuestion::GetStatistic(Array($by=>$order),$arFilter);
$rsData = new CAdminResult($rsData, $sTableID);
CLQuestion::GetStatistic – ключевой метод, о нем чуть позже. Скажу лишь, что он должен возвращать объект CDBResult.
Далее – стартуем навигацию и строим шапку таблицы:
$rsData->NavStart();
// установка строки навигации
$lAdmin->NavText($rsData->GetNavPrint(GetMessage("LEARNING_REPORT_RESULTS")));
$lAdmin->AddHeaders(array(
array("id"=>"LESSON_NAME", "content"=>GetMessage('LEARNING_REPORT_LESSON_NAME'), "sort"=>"LESSON_NAME", "default"=>true),
array("id"=>"NAME", "content"=>GetMessage('LEARNING_REPORT_NAME'), "sort"=>"NAME", "default"=>true),
array("id"=>"ANSWERS_TOTAL", "content"=>GetMessage('LEARNING_REPORT_ANSWERS_TOTAL'), "sort"=>"ANSWERS_TOTAL", "default"=>true),
array("id"=>"ANSWERS_CORRECT", "content"=>GetMessage('LEARNING_REPORT_ANSWERS_CORRECT'), "sort"=>"ANSWERS_CORRECT", "default"=>true),
array("id"=>"PERCENTS", "content"=>GetMessage('LEARNING_REPORT_PERCENTS'), "sort"=>"PERCENTS", "default"=>true),
));
Каждый заголовк описывается массивом
array("id"=>"PERCENTS", "content"=>GetMessage('LEARNING_REPORT_PERCENTS'), "sort"=>"PERCENTS", "default"=>true)
- id – идентификатор столбца
- content – отображаемое название (берется из языкового файла)
- sort – поле для сортировки; если сортировка не нужна, просто не указывайте его
- default – если true – отображать столбец по умолчанию, иначе он может быть показан через настройки списка
// построение списка
while($arRes = $rsData->NavNext(true, "f_"))
{
$row =& $lAdmin->AddRow($f_ID, $arRes);
$row->AddViewField("LESSON_NAME", "[".$f_LESSON_ID."] ".$f_LESSON_NAME);
$row->AddViewField("NAME", "[".$f_ID."] ".$f_NAME);
$row->AddField("ANSWERS_TOTAL", $f_ANSWERS_TOTAL);
$row->AddField("ANSWERS_CORRECT", $f_ANSWERS_CORRECT);
$row->AddField("PERCENTS", $f_PERCENTS . '%');
}
Тут особых комментариев не требуется: добавляем столбец, добавляем ячейки со значениями.
Далее добавляем к списку «подвал».
// "подвал" списка
$lAdmin->AddFooter(
array(
array("title"=>GetMessage("MAIN_ADMIN_LIST_SELECTED"), "value"=>$rsData->SelectedRowsCount()),
array("counter"=>true, "title"=>GetMessage("MAIN_ADMIN_LIST_CHECKED"), "value"=>"0"),
)
);
Все, подготовка закончена. Теперь собственно вывод.
Первым делом – заголовок и форма авторизации (на случай, если доступ запрещен).
$APPLICATION->SetTitle(GetMessage("LEARNING_REPORT_QUESTIONS_TITLE"));
require($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/main/include/prolog_admin_after.php");
if (defined("LEARNING_ADMIN_ACCESS_DENIED"))
$APPLICATION->AuthForm(GetMessage("ACCESS_DENIED"), false);
Теперь форма фильтрации:
В ней в частности, выводим список уроков для фильтрации.
Дальше то, ради чего все затевалось – вывод списка:
$lAdmin->DisplayList();?>
И эпилог:
Все!
Функция GetStatistic выглядеть должна примерно так:
function GetStatistic($arSort, $arFilter) {
global $DB;
/* Формируем SQL согласно $arFilter и $arSort */
$strSql = '...';
return $DB->Query($strSql, false, "File: ".__FILE__."Line: ".__LINE__);
}




А ведь можно делать не 2 файла, а один: т.е. не трогать содержимое папки /bitrix/modules/learning/admin/ (что рекомендуется разработчиком)
Мы и не трогаем, а лишь добавляем файлы.
Респект :) Я пытался сам, целый день ковырял, не мог сообразить что к чему ! А тут все доходчиво, теперь не придется руками все эти таблицы прописывать