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

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

Раздел: Web-разработка, CMS, 19 октября 2008 2 комментария
Дорабатываем панель управления 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 основных частей:

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

Поехали!

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

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

  1. Alex_K пишет:

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

  2. Knave пишет:

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

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


© 2008–2010 Копилефт и все такое...