Найти тему

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

В документации к Битркису есть пример расширения пользовательских полей описанный более 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;
}
}

В результате будет доступен новый тип данных при добавлении пользовательского свойства

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

-2

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