Кастомное пользовательское поле, тип: привязка к чему-либо
Достаточно простой способ расширить варианты привязок у пользовательских свойств. Покажу на примере "Привязка к свойствам инфоблока".
Куда-нибудь в init.php закидываем код:
\Bitrix\Main\Loader::includeModule('iblock'); \Bitrix\Main\EventManager::getInstance()->addEventHandler('main', 'OnUserTypeBuildList', ['CUserTypePropsLink', 'GetUserTypeDescription']); class CUserTypePropsLink extends \Bitrix\Iblock\UserField\Types\ElementType { public static function getDescription(): array { return array( "USER_TYPE_ID" => 'propslink', "CLASS_NAME" => __CLASS__, "DESCRIPTION" => 'Привязка к свойствам каталога', "BASE_TYPE" => \CUserTypeManager::BASE_TYPE_INT, ); } public static function getList(array $userField) { $result = CIBlockProperty::GetList( ['NAME' => 'ASC'], ['IBLOCK_ID' => $userField["SETTINGS"]["IBLOCK_ID"], 'ACTIVE' => 'Y'] ); if($result) { $result = new \CIBlockElementEnum($result); } return $result; } }
Где метод getDescription- это описание нового свойства. Вам нужно будет поменять в нем ID и описание. А в метод getList это, по сути, сам запрос данных, к которым вы хотите привязываться. В данным случае это запрос в таблицу свойств инфоблока.
На этом можно было бы закончить, но есть одна проблема. В выводе свойства, в админке, битрикс использует поле [VALUE], которого нет в таблице свойств. Поэтому нужно где-то сделать подмену на поле [NAME]. Самый простой способ это компонент main.field.enum. Копируем его в папку /local/components/bitrix/ и добавляем в class.php один метод:
public function setAdditionalParameters(?array $additionalParameters): void { foreach ($additionalParameters['items'] as &$item) { $item['VALUE'] = $item['VALUE'] ?: $item['NAME'].' ['.$item['ID'].'] '; } $this->additionalParameters = $additionalParameters; }
В этом методе можете поэкспериментировать с выводимыми данными, чтобы было удобнее заполнять привязку. В примере выше, выводятся название и ID в квадратных скобках.
Есть вопросы или нашли ошибку? Напишите комментарий (можно без регистрации), отвечать стараюсь быстро.