Переход со старых классов 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 |
есть |
Псевдоним — это объявление старого имени как второго имени нового класса. Пока он есть, старый код работает без правок. Со списком так не вышло: у нового устройства другой конструктор и другие точки настройки.
Список: было и стало
Раньше список создавался одной строкой, а поведение задавалось массивом настроек и функциями обратного вызова:
$list = new DevBx\Core\Admin\AdminList('iblock', '\Bitrix\Catalog\PriceTable', [
'ALLOW_EDIT' => true,
'READ_ONLY_FIELDS' => ['PRODUCT_ID', 'CATALOG_GROUP_ID'],
]);
$list->display();
Теперь список — это контроллер, который отвечает на вопросы «что показывать», «что можно менять», «как отфильтровать», и представление, которое его рисует:
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() |
Порядок перехода
- Найти в коде
DevBx\Core\Admin\AdminList— обычно это одна-две страницы в/bitrix/admin/. - Завести класс-наследник
DevBx\Core\UI\List\Controllerрядом со своим модулем. - Перенести настройки из массива в методы наследника по таблице выше.
- На странице оставить три строки: создание контроллера,
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,
конструктор и методы прежние. Переименовать в коде стоит при ближайшей правке — ради единообразия,
а не потому, что что-то сломается.