Пользовательские поля – прекрасный инструмент для расширения стандартных возможностей битрикса. Он хорошо применим не только в инфоблоках и их разделах, но и в доп. полях пользователя.
Как вывести весь список привязок к свойству для авторизованного пользователя в Битриксе
В данном примере будем выбирать только выделенные для авторизованного пользователя значения. Для всего остального используйте api инфоблоков.
Поможет в выводе этих свойств CUser::GetList, но для начала создадим 2 пользовательских свойства с типом “привязка к элементам инфоблока” (ваши инфоблоки уже должны быть созданы). В строке “Код поля” вводим соответственно UF_ORGANIZATION и UF_CONTR, с привязкой к разным информационным блокам. Если привязка будет множественная, то есть, через зажатый Ctrl вы сможете выбрать сразу несколько значений а не одно, то выбирайте соответствующую галочку при создании сразу – потом будет поздно, и придется все делать по новой.
Готово, наши свойства созданы, и в информационных блоках есть по 2-3 тестовых значения. Теперь заходите в админку, настройки вашего пользователя, доп. поля. Выбирайте значения и сохраняйте, дальше займемся их выводом.
На тестовой странице пишем:
// find organization and contragent global $USER; $order = array('sort' => 'asc'); $tmp = 'sort'; $filter = array('ID' => $USER->GetID()); $select = array("SELECT" => array("UF_ORGANIZATION", "UF_CONTR")); $rsUsers = CUser::GetList($order, $tmp, $filter, $select); while ($arUser = $rsUsers->Fetch()) { $organization = $arUser['UF_ORGANIZATION']; $contr = $arUser['UF_CONTR']; }
Основной массив, на который стоит обратить свое внимание это $select. Именно в него мы должны передать “символьные коды” наших “доп полей”. Если мы распечатаем массив $organization, то увидим следующую картину:
[0] => 43
Массив с идентификатором элемента инфоблока. Стоит отметить, что данный массив можно передать в дальнейшем для фильтра CIBlockElement::GetList. Если вы выбрали “множественное” при создании доп свойства битрикса, то в массиве добавятся и другие записи:
[0] => 43, [1] => 44
Где 43 и 44 это ID элементов, привязанных и выбранных у текущего авторизованного пользователя. Не забывайте в своих скриптах рассматривать вариант для не авторизованных.
Как в битриксе узнать значения свойств, зная их ID
Как уже неоднократно было сказано ранее, это всего-лишь ID элементов, а значит, нам нужно API для элементов инфоблока. Использовать будем CIBlockElement::GetByID.
<? global $USER; $order = array('sort' => 'asc'); $tmp = 'sort'; $filter = array('ID' => $USER->GetID()); $select = array("SELECT" => array("UF_ORGANIZATION", "UF_CONTR")); $rsUsers = CUser::GetList($order, $tmp, $filter, $select); while ($arUser = $rsUsers->Fetch()) { $organization = $arUser['UF_ORGANIZATION']; $contr = $arUser['UF_CONTR']; } // contr if (is_array($contr)) { foreach($contr as $key) { $res = CIBlockElement::GetByID($key); if ($ar_res = $res->GetNext()) { $orgName = $ar_res['NAME']; } $arContr[$key] = $orgName; } } ?> <select name="org"> <?if (is_array($arContr) && count($arContr) > 0) {?> <?foreach($arContr as $k => $item) {?> <option value="<?=$k?>"><?=$item?></option> <?}?> <?} else {?> <option value="">Не выбрана</option> <?}?> </select>
Полный код выглядит так, а наш итоговый массив теперь выглядит как “ключ” => “значение” или же “id элемента” => “название элемента”. В самом конце кода выводим их как option для select`а.
Если селект является частью веб-формы, то по его “имени” можно провести дальнейшую фильтрацию. При выборе нам видно лишь имя, но при submit отправится ID, который лежит в option value=””.