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

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

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

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

Также присутствует дополнительное пользовательское поле типа "Привязка к разделам инф. блоков" с кодом "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 и группе, а мне нужно как-то для ИБ такую опцию сделать ))

Блог-note: заметки разработчика

Основные функции вывода в шаблонах Битрикс

Знаю, что все их знают. Но иногда не бывает лишним собрать все самое используемое в одну кучку. Ведь у каждого бывают мо...

Input Type File, множественный с дропзоной и показом превью

Задача: Сделать возможность загрузки файлов в множественный input type="file" c помощью drag&drop и показом превью загру...

Увидеть файл заказов который передаст Битрикс в 1С

Для диагностики обмена заказов, интернет-магазина на 1С Битрикс с 1С Управление Торговлей, нужно увидеть xml файл с зака...

Работа с HTTP-запросами в Bitrix: Обзор возможностей класса \Bitrix\Main\HttpRequest

Класс \Bitrix\Main\HttpRequest, является наследником класса Request, представляет собой мощный инструмент для работы с д...

AJAX корзина с отправкой количества из раздела каталога

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

Вывести артикул в печатную форму бланка заказа

Задача: в печатную форму бланка заказа добавить артикулы товаров и данные о пользователе.

Ajax форма обратной связи, реализация в битрикс

Иногда, на сайте требуется создать форму обратной связи, которая будет писать все данные в инфоблок. Способов реализации...

Получить и вывести все цены товара в 1С-Битрикс

Задача: получить и вывести все цены товара по его ID в каталоге 1С-Битрикс (например, в детальной карточке catalog.e...

Сортировка элементов по индексу сортировки значений типа список

Внутри любого компонента есть заранее заложенные поля для сортировки элементов. Можно сортировать элементы в разных напр...