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

Добавление редактируемых полей

Список умеет править не только поля сущности, но и то, чего в ней нет: вычисляемые значения, данные из связанной таблицы, служебные отметки.

Добавить колонку, которой нет в сущности

Состав колонок задаёт getColumnsFieldId(). К полям сущности можно дописать своё имя:

php · ElementList.php
public function getColumnsFieldId(): array
{
    $columns = parent::getColumnsFieldId();
    $columns[] = 'PROPERTY_ARTICLE';

    return $columns;
}

Дальше своё поле обслуживают знакомой парой методов:

php
public function getRowFieldPROPERTY_ARTICLEViewData($rowId, $fieldId, array $row)
{
    return $this->articles[$rowId] ?? '';
}

public function getRowFieldPROPERTY_ARTICLEEditData($rowId, $fieldId, array $row): string
{
    $value = htmlspecialcharsbx($this->articles[$rowId] ?? '');

    return '<input type="text" name="' . $fieldId . '" value="' . $value . '">';
}

Сохранение своего поля

Значение приходит в updateEntityRow() вместе с остальными полями строки. Своё поле оттуда забирают до того, как массив уйдёт в сущность, — иначе она отвергнет неизвестное поле:

php
protected function updateEntityRow(array $primary, $row): \Bitrix\Main\ORM\Data\UpdateResult
{
    $article = $row['PROPERTY_ARTICLE'] ?? null;
    unset($row['PROPERTY_ARTICLE']);

    $result = parent::updateEntityRow($primary, $row);

    if ($result->isSuccess() && $article !== null) {
        \CIBlockElement::SetPropertyValuesEx($primary['ID'], false, ['ARTICLE' => $article]);
    }

    return $result;
}

Пользовательские поля

Поля UF_* список поддерживает сам: он читает их через менеджер пользовательских полей и рисует теми же элементами управления, что и админка Битрикса. Отдельного кода для них не нужно — достаточно, чтобы у сущности был задан идентификатор набора пользовательских полей.