Дорабатываем панель управления 1С-Битрикс. Часть 2. Список

И так. Продолжаем дорабатывать панель управления Битрикс.

Напомню задачу: добавить в модуль “Обучение” отчеты о прохождении тестов (всего пять видов).

Меню мы уже сделали.

Начнем с одно «фишечки» Битрикса. Как вы помните из предыдущей статьи (и могли заметить это в самом Битриксе), ссылки выглядять как «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 основных частей:

  1. Заголовок и цепочка навигации. Строится Битриксом автоматически – не наша забота
  2. Форма фильтрации. Делается через API Битрикса – наша забота ;)
  3. Список. Ради него все и затевалось :)

Поехали!

Подключаем заголовки и языковой файл:

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)
  1. id – идентификатор столбца
  2. content – отображаемое название (берется из языкового файла)
  3. sort – поле для сортировки; если сортировка не нужна, просто не указывайте его
  4. 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);

Теперь форма фильтрации:

Begin();?> : ID: Buttons(array("table_id"=>$sTableID, "url"=>$APPLICATION->GetCurPage(), "form"=>"form1"));$filter->End();?>

В ней в частности, выводим список уроков для фильтрации.

Дальше то, ради чего все затевалось – вывод списка:

DisplayList();?>

И эпилог:


Все!

Функция GetStatistic выглядеть должна примерно так:

    function GetStatistic($arSort, $arFilter) {
        global $DB;

        /* Формируем SQL согласно $arFilter и $arSort */
        $strSql = '...'; 

        return $DB->Query($strSql, false, "File: ".__FILE__."Line: ".__LINE__);
    }

3 комментария on "Дорабатываем панель управления 1С-Битрикс. Часть 2. Список"

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

  2. Мы и не трогаем, а лишь добавляем файлы.

  3. Alt:

    Респект :) Я пытался сам, целый день ковырял, не мог сообразить что к чему ! А тут все доходчиво, теперь не придется руками все эти таблицы прописывать

Got something to say? Go for it!