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

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
, которые можно удобно использовать для вывода в верстку.