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