Дата последнего изменения: 16.11.2023
С версии 21.600.0 Главного модуля доступны новые методы объекта грида. Цель их внедрения - упростить и уменьшить объем кода, требующийся для создания своей админской страницы со списком элементов.
Для работы со списками элементов в main есть два класса:
В коде страниц, использующих эти классы, имеется множество обращений к $_REQUEST для получения текущего режима страницы, текущего группового действия, измененных данных и т.п. Например, таких:
$bExcel = isset($_REQUEST["mode"]) && ($_REQUEST["mode"] == "excel"); // режим выгрузки в Excel
!isset($_REQUEST["mode"]) || $_REQUEST["mode"]=='list' || $_REQUEST["mode"]=='frame' // все, кроме Excel и окна настроек
switch($_REQUEST['action']) // получение идентификатора групповой операции
Ниже приводится список новых методов, предназначенных для упрощения разработки новых страниц и правки уже существующих.
Грид может работать в нескольких режимах:
Ранее получение текущего режима сводилось к анализу ключа mode
в $_REQUEST
. Вместо этого предлагается использовать методы объекта грида:
public function getCurrentMode(): string // получение режима работы
вернет одну из констант класса:
public const MODE_PAGE = 'normal';
- обычный вывод страницы;public const MODE_LIST = 'list';
- обновление содержимого грида без полной перезагрузки;public const MODE_ACTION = 'frame';
- обработка результатов быстрого редактирования;public const MODE_EXPORT = 'excel';
- выгрузка в псевдо-Excel;public const MODE_CONFIG = 'settings';
- показ формы настроек.Режим определяется в момент инициализации объекта грида.
Старый код:
$sTableID = "tbl_user"; $lAdmin = new CAdminUiList($sTableID); $excelMode = ($_REQUEST["mode"] == "excel");
Новый:
$sTableID = "tbl_user"; $lAdmin = new CAdminUiList($sTableID); $excelMode = $lAdmin->getCurrentMode() === \CAdminList::MODE_EXPORT;
Чтобы каждый раз не писать большой объем кода для сравнения с константой, добавлены вспомогательные методы:
|
Таким образом, предыдущий пример превращается в такой код:
$sTableID = "tbl_user"; $lAdmin = new CAdminUiList($sTableID); $excelMode = $lAdmin->isExportMode();
Типичный код обработки на странице
if ($lAdmin->EditAction()) { if (is_array($_REQUEST['FIELDS'])) { foreach($_REQUEST['FIELDS'] as $ID=>$arFields) { $ID = (int)$ID; if ($ID <= 0) continue; if (!$lAdmin->IsUpdated($ID)) continue; // дальше код, сохраняющий данные одной строки } } }
можно заменить на такой:
if ($lAdmin->EditAction()) { foreach ($lAdmin->getEditFields() as $ID=>$arFields) { //код, сохраняющий данные одной строки } }
Метод
public function getEditFields(): array
возвращает массив записей, которые были изменены (с предварительной проверкой, что ключи непустые).
Дополнительно (если в гриде используется вывод и редактирование файлов) есть метод:
public function convertFilesToEditFields(): void
для копирования присланных файлов в общий массив полей. Т.е. предыдущий код слегка расширяем:
if ($lAdmin->EditAction()) { $lAdmin->convertFilesToEditFields(); foreach ($lAdmin->getEditFields() as $ID=>$arFields) { //код, сохраняющий данные одной строки } }
Типичный код обработки групповых операций:
if ($arID = $lAdmin->GroupAction() { if ($_REQUEST['action_target']=='selected') { // в $arID выбираем идентификаторы всех строки } foreach ($arID as $ID) { switch ($_REQUEST['action']) // получение ID действия { ... } } }
можно упростить так:
if ($arID = $lAdmin->GroupAction() { $actionId = $lAdmin->getAction(); if ($actionId === null) { continue; } if ($lAdmin-> isGroupActionToAll()) { // в $arID выбираем все идентификаторы строк } foreach ($arID as $ID) { switch ($actionId) // действия { ... } } }
|