Расширение пользовательского поля с типом список. Выбор складов

В документации к Битркису есть пример расширения пользовательских полей описанный более 10 лет назад. В новом ядре D7 классы пользовательских полей были переписаны (старые реализации пока работают), а примера я не нашел.

Здесь приведу пример добавления пользовательского свойства типа список для элементов хайлоадблока с возможность выбора склада.

Добавляем минимальную реализацию класса и вешаем обработчик события. Следующий код можно разместить к примеру в файле /bitrix/php_interface/init.php


$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler(
    "main",
    "OnUserTypeBuildList",
    ['UserFieldStoreId', 'getUserTypeDescription']
);

class UserFieldStoreId extends \Bitrix\Main\UserField\Types\EnumType
{
    public const USER_TYPE_ID = 'user_field_store_id';

    /**
     * @return array
     */
    public static function getDescription(): array
    {
        return [
            'DESCRIPTION' => 'Выбор склада',
            'BASE_TYPE' => CUserTypeManager::BASE_TYPE_ENUM,
        ];
    }

    /**
     * @param array $userField
     * @return bool|\CDBResult
     */
    public static function getList(array $userField)
    {
        if (!\Bitrix\Main\Loader::includeModule('catalog')) {
            return false;
        }

        $arReturn = [];

        $dbr = \Bitrix\Catalog\StoreTable::getList([
            'order' => [
                'ID' => 'ASC'
            ],
            'select' => [
                'ID', 
                'TITLE'
            ]
        ]);

        while ($ar = $dbr->Fetch()) {
            $arReturn[] = [
                'ID' => $ar['ID'],
                'VALUE' => '[' . $ar['ID'] . '] ' . $ar['TITLE']
            ];
        }

        $res = new \CDBResult;
        $res->InitFromArray($arReturn);

        return $res;
    }
}
В результате будет доступен новый тип данных при добавлении пользовательского свойства
rasshirenie-polzovatelskogo-polya-s-tipom-spisok-v.png

А в форме редактирования элемента хайлоадблока, для которого добавлено такое пользовательское свойство, будет доступен выбор склада.
rasshirenie-polzovatelskogo-polya-s-tipom-spisok-v-2.png

В списке элементов также все будет выводиться правильно

Обратно к списку