Получение и вывод пользовательского свойства UF_* типа список в section.php в 1С-Битрикс

Задача: для инфоблока с ID 1 получить XML_ID и VALUE пользовательского свойства раздела UF_BADGE в файле section.php комплексного компонента bitrix:catalog.

Получение значений поля UF_* типа список в section.php
Update. Исправлено. Ранее отображался не весь код

Пояснение. Зачем нам понадобились поле XML_ID - в нем мы храним название класса, который хотим вывести на странице, как метку (бейдж) - Новинка, Хит продаж, Эксклюзив и т.п. Т.е. получив XML_ID, мы просто подставим его в имя класса и сразу визуально отобразим нужное нам значение, а имя возьмем из VALUE.


В теории мы можем воспользоваться таким кодом, но по факту не получим искомое, а только ID нашего значения из списка пользовательского свойства.



            use Bitrix\Iblock\SectionTable;

            $result = SectionTable::getList([
                'select' => ['ID', 'NAME', 'ACTIVE', 'SORT'],
                'filter' => [
                    '=IBLOCK_ID' => 1,
                    '=ACTIVE' => 'Y',
                    '=CODE' => $arResult["VARIABLES"]["SECTION_CODE"]
                ],
                'order' => ['SORT' => 'ASC'],
            ]);

            while ($row = $result->fetch())
            {
               $sectionId = $row['ID'];
            }

            $rsSection = CIBlockSection::GetList(
                [],
                [
                    "IBLOCK_ID" => 1,
                    "ID"        => $sectionId
                ],
                false,
                ["UF_BADGE"] // список выбираемых пользовательских полей
            );

            while ($section = $rsSection->fetch())
            {
                print_r($section);
            }

Т.к. в section.php нам напрямую недоступен ID раздела, то его можно получить, используя конструкцию $arResult["VARIABLES"]["SECTION_CODE"] в фильтре.


[UF_BADGE] => Array ( [0] => 7 )

Ниже приведён универсальный пример кода, который вы можете разместить непосредственно в файле section.php вашего комплексного компонента. Он покажет, как получить ID, XML_ID и VALUE пользовательского поля UF_BADGE (типа «список») текущего раздела (при этом учитывая, что оно может быть как одиночным, так и множественным).


1. Получаем данные о разделе и поле UF_BADGE

<?php
use Bitrix\Main\Loader;
use Bitrix\Iblock\SectionTable;

Loader::includeModule("iblock");

// В переменной $arResult["VARIABLES"]["SECTION_CODE"] обычно лежит символьный код раздела.
// Либо может быть $arResult["VARIABLES"]["SECTION_ID"] — зависит от настроек компонента.
// Замените при необходимости на ваш способ получения ID/SYMBOL_CODE раздела.

$sectionCode = $arResult["VARIABLES"]["SECTION_CODE"];

// 1. С помощью D7 API находим ID раздела
$sectionId = 0;
$sectionDb = SectionTable::getList([
    'select' => ['ID', 'NAME'],
    'filter' => [
        '=IBLOCK_ID' => 1,
        '=CODE'      => $sectionCode,
        '=ACTIVE'    => 'Y'
    ],
    'limit' => 1
]);
if ($sectionData = $sectionDb->fetch()) {
    $sectionId = (int)$sectionData['ID'];
}

// 2. Используем CIBlockSection, чтобы запросить пользовательское поле UF_BADGE
$arResult['UF_BADGE_ENUM'] = []; // сюда соберём всё (ID, XML_ID, VALUE)

if ($sectionId > 0) 
{
    $rsSection = \CIBlockSection::GetList(
        [],
        [
            "IBLOCK_ID" => 1,
            "ID"        => $sectionId
        ],
        false,
        ["UF_BADGE"] // указываем, что хотим получить это поле
    );

    if ($arSection = $rsSection->Fetch()) 
    {
        // Превращаем в массив, чтобы обрабатывать одинаково одиночное и множественное значение
        $ufBadgeValues = (array)$arSection['UF_BADGE'];
        // Очищаем от пустых значений (на всякий случай)
        $ufBadgeValues = array_filter($ufBadgeValues);

        if (!empty($ufBadgeValues)) 
        {
            // 3. Достаем из b_user_field_enum записи, соответствующие этим ID
            $rsEnum = CUserFieldEnum::GetList([], [
                'ID' => $ufBadgeValues
            ]);
            while ($arEnum = $rsEnum->Fetch()) {
                // Собираем в массив, чтобы потом вывести в шаблоне
                $arResult['UF_BADGE_ENUM'][] = [
                    'ID'     => $arEnum['ID'],
                    'XML_ID' => $arEnum['XML_ID'],
                    'VALUE'  => $arEnum['VALUE'],
                ];
            }
        }
    }
}

// После сбора данных вы можете их либо выводить прямо здесь, либо передать дальше в шаблон
?>

2. Пример вывода в том же файле (или в подключаемом шаблоне)

<?php if (!empty($arResult['UF_BADGE_ENUM'])): ?>
    <div class="badge-wrapper">
        <?php foreach ($arResult['UF_BADGE_ENUM'] as $item): ?>
            <span class="<?= htmlspecialcharsbx($item['XML_ID']) ?>">
                <?= htmlspecialcharsbx($item['VALUE']) ?>
            </span>
        <?php endforeach; ?>
    </div>
<?php endif; ?>

Обратите внимание, что для безопасного вывода в HTML я использовал функцию htmlspecialcharsbx() (распространённая в Битриксе), чтобы экранировать потенциально небезопасные символы.


Если вам нужно только одно значение

Если поле UF_BADGE не множественное и всегда хранит ровно одно значение, код выше всё равно сработает: просто в массиве $arResult['UF_BADGE_ENUM'] будет один элемент. При желании можно забрать первый элемент из него, например:

<?php
$singleValue = reset($arResult['UF_BADGE_ENUM']);
if ($singleValue) {
    echo $singleValue['XML_ID'];  // выводим XML_ID
    echo $singleValue['VALUE'];   // выводим VALUE
}
?>

Или вообще не использовать цикл. Выбор зависит от структуры вашего шаблона.

Что важно запомнить

  • Если в админке у поля UF_BADGE стоит тип «Список» (или «Привязка к элементам»), то при выборке UF_BADGE через CIBlockSection::GetList() возвращается ID записи в таблице b_user_field_enum (или другая логика для привязок).
  • Чтобы добраться до XML_ID и текста (VALUE), нужно делать дополнительный запрос через CUserFieldEnum::GetList().
  • В итоговом варианте вы получаете одновременно и ID, и XML_ID, и VALUE, которые можно удобно использовать для вывода в верстку.
Теги:  Битрикс, рецепты

Интернет-магазин от 120 000 руб., срок от 4 недель

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

Корпоративный сайт от 60 000 руб., срок от 3 недель

Готовый информационный ресурс, включающий лицензию на 1С-Битрикс «Стандарт», технологию «Композитный сайт».

Лендинг от 25 000 руб., срок от 2 недель

Компактный сайт, идеально подходящий для старта. На одной странице можно представить ключевые преимущества вашей компании и разместить форму для обратной связи.