Своя страница в админке - список, форма, пункт меню
Собираем страницу административной части под свои данные: с фильтром, списком и формой правки, привычными сотрудникам.
Решение
Обрамляем страницу служебными подключениями:
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// пункт меню появляется только у групп с правом на модуль решенияПункт меню описывается файлом своего модуля, а не правкой штатного меню. Платформа собирает меню из таких файлов сама, поэтому пункт переживает обновление и исчезает вместе с удалением модуля.
Свою страницу стоит делать похожей на штатные, а вовсе не красивее их. Сотрудник, привыкший к общему виду списков, находит нужное быстрее, чем на самой удобной, но непривычной странице.
Страница в административной части доступна каждому, кто вообще туда вошёл. Проверка прав в первых строках - не перестраховка: без неё контент-менеджер увидит журнал обмена и настройки, к которым его не подпускали.
Список и форму стоит закрывать одним и тем же правом. Сотрудник, видящий список и получающий отказ на правке, идёт за объяснением к разработчику, а не работает.
Долгие операции со страницы запускают отдельными заданиями, а не прямо в запросе. Кнопка «пересчитать всё», выполняющаяся минуту, превращается в белый экран у половины сотрудников.
Типичные проблемы
Страницу видят все сотрудники.
Права на сами данные не проверяются в коде страницы. Платформа проверяет только вход в административную часть.
Проверка прав не срабатывает.
Она стоит после того подключения, которое рисует шапку страницы. Доступ закрывают строго между двумя служебными подключениями.
Пункт меню пропал после обновления.
Он добавлялся прямой правкой штатного файла меню. Свои пункты описывают отдельным файлом меню своего модуля.
Список не помнит фильтр и сортировку.
Идентификатор списка меняется у вас от страницы к странице. Настройки конкретного сотрудника хранятся платформой именно по нему.
Кнопка действия даёт белый экран.
Долгая операция выполняется прямо в запросе самой страницы. Такие действия ставят в очередь и показывают ход выполнения.
Частые вопросы
Можно ли обойтись без своей страницы?
Часто да: универсальные списки и инфоблоки дают готовый интерфейс. Своя страница нужна для данных вне них.
Где размещать файлы страниц?
В своём модуле, а ссылку на них ставить пунктом меню. Файлы рядом со штатными обновление перезапишет.
Как сделать фильтр по своим полям?
Средствами того же класса списка: он умеет собирать фильтр по описанию полей. Свой фильтр писать не нужно.
Нужна ли своя страница для отчёта?
Для регулярного - да, для разового хватит выгрузки в файл. Страница окупается там, где к отчёту возвращаются.
Смежное
- Страницы в админке - оглавление подтемы
- Страница админки не открывается: разбор причин - если страница не открылась
- Правка строк прямо в списке админки: режим, сохранение, файлы - правка записей без карточки
- Форма в админке: вкладки, проверка значений, тулбар - форма правки подробнее
- Кнопки правки на витрине: режим правки, иконки области, меню элемента - вход в эту страницу прямо с витрины
- Свой гаджет рабочего стола: файлы, параметры, вывод - короткий блок на стартовой странице админки
- Интерфейс администратора - устройство административной части
- Свой модуль: структура, установка, автозагрузка - где живут такие страницы
- Своя таблица на ORM: сущность, запросы, изменение структуры - данные под страницу
- Роли менеджеров: что видит и что может в админке - кому открывать доступ
- Отчёты по заказам: агрегаты, группировка, выгрузка - типовое содержимое такой страницы
- Связи между таблицами ORM: ссылки, выборка, удаление - данные из нескольких таблиц
- Окна и уведомления ядра UI: подтверждение, окно, сообщение - подтверждения на своей странице
- Групповые действия и выгрузка в своём списке админки - что добавляют к списку следом
- Своя сущность от таблицы до админки: слои, права, интерфейс - что стоит за этой страницей
- Визуальный редактор не работает: разбор причин - если редактор в своей форме не поднимается
- Своя форма элемента инфоблока: файлы, проверка, хук - вклинивание в штатную форму вместо своей страницы
- Своя кнопка на панели управления - как привести менеджера на свою страницу