Если вам необходимо вывести дополнительное пользовательское поле типа "Привязка к разделам инфоблока", эта записка может оказаться полезной. Опыт использования достаточно узкий, мало где может понадобиться, но...просто оставлю это здесь.
В этой заметке используется метод старого ядра CIBlockSection::GetList - он работоспособен, но рекомендую использовать новые методы ядра D7 по заметке: Получение информации о разделах инфоблока на D7
Допустим, у нас есть инфоблок с разделами, и подразделами:
Также присутствует дополнительное пользовательское поле типа "Привязка к разделам инф. блоков" с кодом "UF_BEL_EXCUTOR_CATEG", связанное с этим инфоблоком:
Пользователь может выбрать несколько подразделов из различных разделов в своем профиле, так как данное свойство поддерживает множественный выбор.
Предположим, что пользователь выбрал определенные разделы, и нам необходимо вывести их названия на сайте. Для начала выведем все поля пользователя, включая дополнительные:
$rsUser = CUser::GetByID($USER->GetID());
$arUser = $rsUser->Fetch();
print_r($arUser);
В массиве $arUser мы найдем данные о текущем авторизованном пользователе, включая массив типа:
[UF_BEL_EXCUTOR_CATEG] => Array(...ID_РАЗДЕЛОВ_ИНФОБЛОКА_ИЗ_ПРОФИЛЯ_ПОЛЬЗОВАТЕЛЯ...)
Теперь, имея ID выбранных пользователем разделов, воспользуемся методом CIBlockSection::GetList(), чтобы получить названия этих разделов:
$dbSections = CIBlockSection::GetList(
array(
'NAME' => 'ASC' // Сортируем на названию
),
array(
'ID' => $arUser['UF_BEL_EXCUTOR_CATEG'] // Фильтр
),
false,
array(
'NAME' // Перечислите нужные поля, если нужно не только название
)
);
while ($arSection = $dbSections->Fetch()) {
echo 'Раздел:' . $arSection['NAME'];
}
Таким образом, мы получим названия всех разделов, выбранных пользователем в своем профиле.
Если вы хотите получить URL раздела, используйте GetNext() вместо Fetch(). Fetch() работает быстрее, но возвращает "сырые" данные без дополнительной обработки.
Получение названия родительского раздела инфоблока
Дополнительно рассмотрим способ вывода названия родительского раздела, имея ID его потомка - раздела инфоблока.
Предположим, что пользователь выбрал разделы "Другая бытовая техника" и "Малая бытовая техника", которые принадлежат разделу "Ремонт бытовой техники". Нам нужно вывести название этого родительского раздела.
Для этого воспользуемся методом CIBlockSection::GetNavChain(), который позволяет получить цепочку разделов:
$dbSections = CIBlockSection::GetList(
array(
'NAME' => 'ASC'
),
array(
'ID' => $arUser['UF_BEL_EXCUTOR_CATEG']
),
false,
array(
'ID',
'NAME'
)
);
while ($arSection = $dbSections->Fetch()) {
$navChain = CIBlockSection::GetNavChain(
false,
$arSection['ID'],
);
while ($arNav=$navChain->GetNext()) {
echo $arNav['NAME']; // Раздел родитель
}
}
Внутри цикла метода CIBlockSection::GetList мы получаем ID выбранного пользователем раздела. Затем, используя этот ID, мы получаем всю информацию о родительском разделе с помощью метода GetNavChain() и выводим его название.
Вариант получения разделов по ID, на D7
Этот код использует D7-синтаксис для работы с разделами инфоблока и пользовательскими полями. Он предполагает загрузку модуля инфоблоков, получение ID текущего пользователя, извлечение значения пользовательского поля и последующий вывод названий выбранных разделов.
use Bitrix\Main\Loader;
use Bitrix\Iblock\SectionTable;
Loader::includeModule('iblock');
$userId = $USER->GetID(); // ID текущего пользователя
$userField = 'UF_BEL_EXCUTOR_CATEG'; // Поле привязки к разделам инфоблока
$user = \Bitrix\Main\UserTable::getList([
'filter' => ['=ID' => $userId],
'select' => ["ID", $userField]
])->fetch();
if ($user && !empty($user[$userField])) {
$sectionIds = $user[$userField];
$dbSections = SectionTable::getList([
'order' => ['NAME' => 'ASC'],
'filter' => ['=ID' => $sectionIds],
'select' => ['ID', 'NAME'] // Перечислите нужные поля
]);
while ($section = $dbSections->fetch()) {
echo 'Раздел: ' . $section['NAME'];
}
}