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

Редактирование списка

Правка прямо в строках списка включается методом canEdit() контроллера-наследника.

php · MyPriceList.php
<?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;
    }
}

Страница списка при этом остаётся короткой:

php · list.php
$controller = new \Vendor\Module\UI\MyPriceList();
$controller->initialize([]);

(new \DevBx\Core\UI\List\EntityList($controller))->show();

Поля только для чтения

Часть полей из правки исключают правилом полей — getReadOnlyFieldsRule(). Правило хранит список полей и режим: исключать перечисленные или разрешать только их.

php
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: перечисленные поля становятся нередактируемыми, остальные доступны. Обратный режим задаётся явно:

php
$this->getReadOnlyFieldsRule()
    ->setRule(FieldRules::RULE_ALLOW)
    ->setColumns(['PRICE', 'CURRENCY']);

Теперь редактируются только цена и валюта, остальные поля показываются как есть.

Правка одного поля по своему условию

Когда решение зависит от строки или от прав, переопределяют canColumnEdit($id):

php
public function canColumnEdit($id): bool
{
    if ($id === 'PRICE' && !$GLOBALS['USER']->IsAdmin()) {
        return false;
    }

    return parent::canColumnEdit($id);
}

Базовая проверка внутри parent::canColumnEdit() учитывает и общие права, и правило полей, — поэтому её вызывают, а не заменяют.