Документация

Переход со старых классов Admin

Административные списки и формы переехали из пространства имён DevBx\Core\Admin в DevBx\Core\UI. Эта страница нужна тем, у кого после обновления модуля код перестал работать.

Ошибка, с которой сюда приходят

Class "DevBx\Core\Admin\AdminList" not found

Значит в коде осталось старое имя класса списка. У него, в отличие от остальных, нет псевдонима на новое имя: список не просто переименован, у него изменился способ работы, и молчаливая подмена класса сделала бы только хуже — код бы запустился и повёл себя иначе.

Что на что заменилось

Было Стало Псевдоним старого имени
DevBx\Core\Admin\AdminList DevBx\Core\UI\List\Controller плюс DevBx\Core\UI\List\EntityList нет
DevBx\Core\Admin\AdminEdit DevBx\Core\UI\Edit\Form есть
DevBx\Core\Admin\EditField DevBx\Core\UI\Edit\Fields\BaseField есть
DevBx\Core\Admin\EditUserTypeField DevBx\Core\UI\Edit\Fields\UserTypeField есть
DevBx\Core\Admin\Options DevBx\Core\UI\Options есть

Псевдоним — это объявление старого имени как второго имени нового класса. Пока он есть, старый код работает без правок. Со списком так не вышло: у нового устройства другой конструктор и другие точки настройки.

Список: было и стало

Раньше список создавался одной строкой, а поведение задавалось массивом настроек и функциями обратного вызова:

php · было.php
$list = new DevBx\Core\Admin\AdminList('iblock', '\Bitrix\Catalog\PriceTable', [
    'ALLOW_EDIT' => true,
    'READ_ONLY_FIELDS' => ['PRODUCT_ID', 'CATALOG_GROUP_ID'],
]);

$list->display();

Теперь список — это контроллер, который отвечает на вопросы «что показывать», «что можно менять», «как отфильтровать», и представление, которое его рисует:

php · стало.php
use DevBx\Core\UI\List\Controller;
use DevBx\Core\UI\List\EntityList;

$controller = new Controller();
$controller->initialize(['dataClass' => \Bitrix\Catalog\PriceTable::class]);

(new EntityList($controller))->show();

Настройки, которые раньше передавались массивом, стали методами контроллера-наследника.

Было Стало
ALLOW_EDIT canEdit() возвращает true
READ_ONLY_FIELDS getReadOnlyFieldsRule() — правило полей
HEADER_FIELDS getHeaderFieldsRule() — правило колонок
setCallbackApplyFilter applyFilter() или prepareQuery()
setCallbackGetSelectFields prepareQuery() — запрос строится целиком
setUpdateFunction updateEntityRow()
addFileEditParams опция editUrl при initialize()
display() EntityList::show()

Порядок перехода

  1. Найти в коде DevBx\Core\Admin\AdminList — обычно это одна-две страницы в /bitrix/admin/.
  2. Завести класс-наследник DevBx\Core\UI\List\Controller рядом со своим модулем.
  3. Перенести настройки из массива в методы наследника по таблице выше.
  4. На странице оставить три строки: создание контроллера, initialize(), show().

Как выглядит готовый наследник — на странице «Простой вывод данных» и дальше по главе.

Известная ошибка при переходе

На версиях модуля до исправления опечатки список падает сразу после перевода, даже без единой настройки:

Class "Bitrix\Main\Grid\Editor\TypeS" not found

Причина в самом модуле: в разборе полей типа дата-время имя класса ядра написано с ошибкой — TypeS вместо Types. Поле даты (TIMESTAMP_X, DATE_CREATE) есть почти в каждой сущности, поэтому падает почти любой список.

Пока обновление не вышло, есть два пути:

  • убрать поля даты из колонок — список заработает:

    $this->getHeaderFieldsRule()
        ->setRule(FieldRules::RULE_ALLOW)
        ->setColumns(['ID', 'ACTIVE', 'NAME', 'CODE', 'SORT']);
    
  • поправить строку в модуле — в lib/UI/Columns/Column.php заменить Grid\Editor\TypeS::DATE на Grid\Editor\Types::DATE.

Чему нет замены

setCallbackGetSelectFields из старого класса заменять нечем, и это не упущение: поля запроса теперь собираются из колонок, а колонки задаются правилом getHeaderFieldsRule(). При переводе этот вызов просто исчезает — искать для него метод не нужно.

Форма: правок не требуется

DevBx\Core\Admin\AdminEdit продолжает работать: это второе имя класса DevBx\Core\UI\Edit\Form, конструктор и методы прежние. Переименовать в коде стоит при ближайшей правке — ради единообразия, а не потому, что что-то сломается.