Как выводить пользовательские поля и названия разделов инфоблока в Битриксе

Просмотров: 19376

Если вам необходимо вывести дополнительное пользовательское поле типа "Привязка к разделам инфоблока", эта записка может оказаться полезной. Опыт использования достаточно узкий, мало где может понадобиться, но...просто оставлю это здесь

Допустим, у нас есть инфоблок с разделами, и подразделами:

Также присутствует дополнительное пользовательское поле типа "Привязка к разделам инф. блоков" с кодом "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'];
    }
}
Евгений 30.11.2023
Есть похожая задача, но немного в другой интерпретации)) Есть справочник в виде инфоблока. Записи - ФИО сотрудников и email, разделение в ИБ в виде подразделов - руководство, менеджеры, партнеры.

Как сделать вывод текста (HTML) для отдельных групп инфоблока по ID раздела?

То есть проблематично создавать группу пользователей (много людей, которые постоянно меняются), нужно написать правило вывода по разделу по логике:
Код
<?if ( CSite::InGroup( array(4,5) ) ):?>
Текст
<?endif?>

Вопрос можно перефразировать:
из инфоблока не выводится информация, как обычно, а это некая база сотрудников.

В ней также есть свое ID = ID USER битрикса.

Подразделы - это в логике своей тоже самое, что и группы пользователей.
Нужно написать код вывода, если человек есть в группе, то для него выводится текст, если нет - то не выводится.  
Михаил Базаров 01.12.2023
Нет, три раза перечитал - пока совсем не понял что хотите сделать  :)  
Видимо, нужно еще подробнее, на пальцах объяснить, суть задачи.
Евгений 01.12.2023
Михаил, извините, плохо изложил ))  Я хочу чтобы инфоблок выполнял не типичную роль, то есть не выводил информацию для отображения. В записях инфоблока - 3 подраздела, в каждом подразделе - много записей с ФИО и данными сотрудников / партнеров.

Есть статичный html код с тарифами и текстом. Но, этот код не единый для всех разделов. Нужно чтобы не нужно было создавать группы пользователей с правами или в самом инфоблоке права устанавливать, а нужно чтобы записи в подразделах ИБ и были условиями вывода данных. То есть, те люди, которые в подразделе ИБ 1 - видят html код №1, кто подразделе ИБ 2 - видят html код №2.

То есть записи в инфоблоке являются ключом вывода информации, как группы в битриксе. А сейчас я нашел подобные условия вывода только по ID User и группе, а мне нужно как-то для ИБ такую опцию сделать ))