Редактирование списка
Правка прямо в строках списка включается методом canEdit() контроллера-наследника.
<?php
namespace Vendor\Module\UI;
use Bitrix\Main;
use DevBx\Core\UI\List\Controller;
class MyPriceList extends Controller
{
public function initialize(array $options): Main\Result
{
$this->setEntity(\Bitrix\Catalog\PriceTable::getEntity());
return parent::initialize($options);
}
public function canEdit(): bool
{
return true;
}
}
Страница списка при этом остаётся короткой:
$controller = new \Vendor\Module\UI\MyPriceList();
$controller->initialize([]);
(new \DevBx\Core\UI\List\EntityList($controller))->show();
Поля только для чтения
Часть полей из правки исключают правилом полей — getReadOnlyFieldsRule(). Правило хранит список
полей и режим: исключать перечисленные или разрешать только их.
use DevBx\Core\UI\List\FieldRules;
public function initialize(array $options): Main\Result
{
$this->setEntity(\Bitrix\Catalog\PriceTable::getEntity());
$this->getReadOnlyFieldsRule()->setColumns([
'PRODUCT_ID',
'CATALOG_GROUP_ID',
'TIMESTAMP_X',
]);
return parent::initialize($options);
}
Режим по умолчанию — FieldRules::RULE_EXCLUDE: перечисленные поля становятся нередактируемыми,
остальные доступны. Обратный режим задаётся явно:
$this->getReadOnlyFieldsRule()
->setRule(FieldRules::RULE_ALLOW)
->setColumns(['PRICE', 'CURRENCY']);
Теперь редактируются только цена и валюта, остальные поля показываются как есть.
Правка одного поля по своему условию
Когда решение зависит от строки или от прав, переопределяют canColumnEdit($id):
public function canColumnEdit($id): bool
{
if ($id === 'PRICE' && !$GLOBALS['USER']->IsAdmin()) {
return false;
}
return parent::canColumnEdit($id);
}
Базовая проверка внутри parent::canColumnEdit() учитывает и общие права, и правило полей, —
поэтому её вызывают, а не заменяют.