Перейти к содержимому

Своя страница в админке - список, форма, пункт меню

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

Решение

Обрамляем страницу служебными подключениями:

require $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_admin_before.php';
if (!$USER->CanDoOperation('view_other_settings')) {
$APPLICATION->AuthForm('Доступ запрещён'); // права проверяем сами
// пролог админки прав на свою страницу не проверяет вовсе
}
$APPLICATION->SetTitle('Журнал обмена');
require $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_admin_after.php';

Два подключения обрамляют страницу: первое поднимает ядро и права, второе рисует шапку. Проверка прав живёт между ними, потому что после вывода шапки перекрыть доступ уже нечем.

Собираем список готовым классом:

$list = new CAdminUiList('vendor_sync_list', new CAdminUiSorting('vendor_sync_list', 'ID', 'desc'));
$list->AddHeaders([
['id' => 'ID', 'content' => 'ID', 'sort' => 'ID', 'default' => true],
['id' => 'STATUS', 'content' => 'Статус', 'default' => true],
]);
foreach ($rows as $row) { $list->AddRow($row['ID'], $row); }
$list->CheckListMode();

Готовый список даёт фильтр, сортировку и групповые действия сразу. Своя вёрстка на это место обычно проигрывает: сотрудники ждут привычного поведения, а не нового интерфейса на каждой странице.

Показываем форму правки:

$tabControl = new CAdminForm('vendor_sync_edit', [
['DIV' => 'main', 'TAB' => 'Запись', 'FIELDS' => []],
]);
$tabControl->BeginPrologContent();
$tabControl->EndPrologContent();
$tabControl->Show();

Форма правки собирается тем же способом, что и штатные формы. Вкладки, кнопки сохранения и сообщения об ошибках при этом ведут себя как везде, и обучать сотрудников отдельно не приходится.

Добавляем пункт в меню:

// файл меню своего модуля
$aMenu = [[
'parent_menu' => 'global_menu_services',
'text' => 'Журнал обмена',
'url' => 'vendor_sync_list.php',
'module_id' => 'vendor.shop',
]];
return $aMenu;
// подтверждения и уведомления на такой странице берут из ядра UI
// пункт меню появляется только у групп с правом на модуль решения

Пункт меню описывается файлом своего модуля, а не правкой штатного меню. Платформа собирает меню из таких файлов сама, поэтому пункт переживает обновление и исчезает вместе с удалением модуля.

Свою страницу стоит делать похожей на штатные, а вовсе не красивее их. Сотрудник, привыкший к общему виду списков, находит нужное быстрее, чем на самой удобной, но непривычной странице.

Страница в административной части доступна каждому, кто вообще туда вошёл. Проверка прав в первых строках - не перестраховка: без неё контент-менеджер увидит журнал обмена и настройки, к которым его не подпускали.

Список и форму стоит закрывать одним и тем же правом. Сотрудник, видящий список и получающий отказ на правке, идёт за объяснением к разработчику, а не работает.

Долгие операции со страницы запускают отдельными заданиями, а не прямо в запросе. Кнопка «пересчитать всё», выполняющаяся минуту, превращается в белый экран у половины сотрудников.

Типичные проблемы

Страницу видят все сотрудники.

Права на сами данные не проверяются в коде страницы. Платформа проверяет только вход в административную часть.

Проверка прав не срабатывает.

Она стоит после того подключения, которое рисует шапку страницы. Доступ закрывают строго между двумя служебными подключениями.

Пункт меню пропал после обновления.

Он добавлялся прямой правкой штатного файла меню. Свои пункты описывают отдельным файлом меню своего модуля.

Список не помнит фильтр и сортировку.

Идентификатор списка меняется у вас от страницы к странице. Настройки конкретного сотрудника хранятся платформой именно по нему.

Кнопка действия даёт белый экран.

Долгая операция выполняется прямо в запросе самой страницы. Такие действия ставят в очередь и показывают ход выполнения.

Частые вопросы

Можно ли обойтись без своей страницы?

Часто да: универсальные списки и инфоблоки дают готовый интерфейс. Своя страница нужна для данных вне них.

Где размещать файлы страниц?

В своём модуле, а ссылку на них ставить пунктом меню. Файлы рядом со штатными обновление перезапишет.

Как сделать фильтр по своим полям?

Средствами того же класса списка: он умеет собирать фильтр по описанию полей. Свой фильтр писать не нужно.

Нужна ли своя страница для отчёта?

Для регулярного - да, для разового хватит выгрузки в файл. Страница окупается там, где к отчёту возвращаются.

Смежное

Первоисточник