Дорабатываем панель управления 1С-Битрикс. Часть 2. Список
И так. Продолжаем дорабатывать панель управления Битрикс.
Напомню задачу: добавить в модуль “Обучение” отчеты о прохождении тестов (всего пять видов).
Меню мы уже сделали.
Начнем с одно “фишечки” Битрикса. Как вы помните из предыдущей статьи (и могли заметить это в самом Битриксе), ссылки выглядять как “learn_report_questions.php?lang=”.LANG, т.е. полностью ссылка будет выглядеть как “/bitrix/admin/learn_report_questions.php?lang=ru”? например.
Поэтому чтобы добавить страницу в панель управления нужно создать 2 страницы. :)
Для примера возьмем все тот же learn_report_questions.php. Идем в /bitrix/admin/ и создаем файл следующего содержания:
1 | <?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/learning/admin/learn_report_questions.php");?> |
Далее создаем, собственно, саму страницу learn_report_questions.php в /bitrix/modules/learning/admin/. Теперь самое интерсное – отображение списка.
В большинстве случаев страница в панели управления состоит из 3 основных частей:
- Заголовок и цепочка навигации. Строится Битриксом автоматически – не наша забота
- Форма фильтрации. Делается через API Битрикса – наша забота ;)
- Список. Ради него все и затевалось :)
Поехали!
Подключаем заголовки и языковой файл:
1 2 3 4 | 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__); |
Задаем уникальный в рамках всего Битрикса идентификатор таблицы и инициализируем два объекта: сортировщик и собственно сам список:
1 2 3 | $sTableID = "t_report_questions"; $oSort = new CAdminSorting($sTableID, "ID", "desc");// инициализация сортировки $lAdmin = new CAdminList($sTableID, $oSort);// инициализация списка |
Инициализируем объект фильтра. Задаем “скрытое” (показвается по желанию) поле фильтрации по ID:
1 2 3 4 5 6 | $filter = new CAdminFilter( $sTableID."_filter", array( "ID", ) ); |
Задаем название полей ввода, инициализируем фильтрацию:
1 2 3 4 5 6 7 | //названия всех input'ов фильтра $arFilterFields = Array( "filter_id", "filter_lesson_id", ); $lAdmin->InitFilter($arFilterFields);//инициализация фильтра |
Далее – самое важное – делаем выборку согласно сортировке и фильтру и преобразуем в специальный формат.
1 2 3 | // инициализация списка - выборка данных $rsData = CLQuestion::GetStatistic(Array($by=>$order),$arFilter); $rsData = new CAdminResult($rsData, $sTableID); |
CLQuestion::GetStatistic – ключевой метод, о нем чуть позже. Скажу лишь, что он должен возвращать объект CDBResult.
Далее – стартуем навигацию и строим шапку таблицы:
1 2 3 4 5 6 7 8 9 10 11 12 13 | $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), )); |
Каждый заголовк описывается массивом
1 | array("id"=>"PERCENTS", "content"=>GetMessage('LEARNING_REPORT_PERCENTS'), "sort"=>"PERCENTS", "default"=>true) |
- id – идентификатор столбца
- content – отображаемое название (берется из языкового файла)
- sort – поле для сортировки; если сортировка не нужна, просто не указывайте его
- default – если true – отображать столбец по умолчанию, иначе он может быть показан через настройки списка
1 2 3 4 5 6 7 8 9 10 11 12 13 | // построение списка while($arRes = $rsData->NavNext(true, "f_")) { $row =& $lAdmin->AddRow($f_ID, $arRes); $row->AddViewField("LESSON_NAME", "[<a href=\"/bitrix/admin/learn_lesson_edit.php?lang=ru&ID=".$f_LESSON_ID."&COURSE_ID=".$f_COURSE_ID."&CHAPTER_ID=0&filter=Y&set_filter=Y\" title=\"".GetMessage("LEARNING_REPORT_EDIT_LESSON")."\">".$f_LESSON_ID."</a>] ".$f_LESSON_NAME); $row->AddViewField("NAME", "[<a href=\"/bitrix/admin/learn_question_edit.php?lang=ru&COURSE_ID=".$f_COURSE_ID."&LESSON_ID=".$f_LESSON_ID."&ID=".$f_ID."&filter=Y&set_filter=Y\" title=\"".GetMessage("LEARNING_REPORT_EDIT_QUESTION")."\">".$f_ID."</a>] ".$f_NAME); $row->AddField("ANSWERS_TOTAL", $f_ANSWERS_TOTAL); $row->AddField("ANSWERS_CORRECT", $f_ANSWERS_CORRECT); $row->AddField("PERCENTS", $f_PERCENTS . '%'); } |
Тут особых комментариев не требуется: добавляем столбец, добавляем ячейки со значениями.
Далее добавляем к списку “подвал”.
1 2 3 4 5 6 7 | // "подвал" списка $lAdmin->AddFooter( array( array("title"=>GetMessage("MAIN_ADMIN_LIST_SELECTED"), "value"=>$rsData->SelectedRowsCount()), array("counter"=>true, "title"=>GetMessage("MAIN_ADMIN_LIST_CHECKED"), "value"=>"0"), ) ); |
Все, подготовка закончена. Теперь собственно вывод.
Первым делом – заголовок и форма авторизации (на случай, если доступ запрещен).
1 2 3 4 5 | $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); |
Теперь форма фильтрации:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <form name="form1" method="GET" action="<?echo $APPLICATION->GetCurPage()?>" onsubmit="return this.set_filter.onclick();"> <?$filter->Begin();?> <tr> <td><b><?=GetMessage("LEARNING_REPORT_LESSON_ID")?></b>:</td> <td> <select name="filter_lesson_id" style="width:300px;"> <option value=""><?echo GetMessage("LEARNING_ALL")?></option> <? $l = CLesson::GetList(Array(), Array()); while($l->ExtractFields("l_")): ?><option value="<?echo $l_ID?>"<?if($filter_lesson_id==$l_ID)echo " selected"?>><?echo $l_NAME?></option><? endwhile; ?> </select> </td> </tr> <tr> <td>ID:</td> <td><input type="text" name="filter_id" value="<?echo htmlspecialchars($filter_id)?>" size="47"></td> </tr> <?$filter->Buttons(array("table_id"=>$sTableID, "url"=>$APPLICATION->GetCurPage(), "form"=>"form1"));$filter->End();?> </form> |
В ней в частности, выводим список уроков для фильтрации.
Дальше то, ради чего все затевалось – вывод списка:
1 | <?$lAdmin->DisplayList();?> |
И эпилог:
1 | <?require($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/main/include/epilog_admin.php");?> |
Все!
Функция GetStatistic выглядеть должна примерно так:
1 2 3 4 5 6 7 8 | function GetStatistic($arSort, $arFilter) { global $DB; /* Формируем SQL согласно $arFilter и $arSort */ $strSql = '...'; return $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__); } |



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