Вывести дополнительное пользовательское поле, использование полей в фильтрах

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

Также, в рамках заметки, можно увидеть как вывести название родительского раздела инфоблока, зная ID одного из его потомков (подраздела).

Итак: Предположим, что у нас есть инфоблок с разделами, у которые есть подразделы:


И есть дополнительное пользовательское поле, типа "Привязка к разделам инф. блоков" направленное на этот инфоблок

В профиле пользователя, он может выбрать любой подраздел, любого раздела и самое главное не один. То есть свойство множественное.


И предположим, что пользователь навыбирал какие-то разделы. Нам же нужно вывести выбранные им разделы (названия) где-то на сайте, вообще не важно где

Для начала научимся выводить дополнительные поля пользователя в принципе, любого типа. По сути все просто:

//Получаем все возможные поля текущего пользователя
$rsUser = CUser::GetByID($USER->GetID());
$arUser = $rsUser->Fetch();

//Выводим дополнительное поле (не множественное)
$doppolya = $arUser['UF_...НАЗВНИЕ_ПОЛЯ'];
echo $doppolya;

//Выводим если множественное
foreach ($arUser['UF_...НАЗВНИЕ_ПОЛЯ'] as $propertyUf):
    echo $propertyUf;
endforeach;

Теперь научимся выводить разделы заданного инфоблока, без привязки пользователя- просто все разделы и подразделы списком. Тут опять все просто: используем API Битрикс метод CIBlockSection::GetTreeList - получить дерево разделов

$IBLOCK_ID = 10; // ID нужного инфоблока

//Создаем массив фильтра
$arFilter = array('IBLOCK_ID' => $IBLOCK_ID, 'ACTIVE' => 'Y');

//Создаем массив выводимых полей
$arSelect = array('ID', 'NAME');

//Применяем метод с фильтром и полями
$rsSection = CIBlockSection::GetTreeList($arFilter, $arSelect);

//Выводим названия и ID разделов
while ($arSection = $rsSection->Fetch()) {
    echo $arSection['NAME'];
    echo $arSection['ID'];
}

А теперь самое сложное, нам нужно- зная ID тех разделов которые выбрал пользователь, добавить в фильтрацию к методу CIBlockSection::GetTreeList и результатом получим все разделы которые выбрал пользователь

Сначала просто получаем все разделы выбранные пользователем, и сразу же загоняем их в переменную $sectionsUser

foreach ($arUser['UF_НАЗВАНИЕ_ПОЛЯ'] as $propertyUf):
    $sectionsUser .= '\'' . $propertyUf . '\',';
endforeach;

С помощью eval превращаем эту переменную в массив array, который и применим далее в фильтре. массив (его переменную) называю $fofilter

eval('$fofilter=array(' . $sectionsUser . ');');
extract($fofilter);

И добавляем фильтр к CIBlockSection::GetTreeList

$IBLOCK_ID = 10; // ID нужного инфоблока

//Создаем массив фильтра
$arFilter = array('IBLOCK_ID' => $IBLOCK_ID, 'ACTIVE' => 'Y');

//Добавляем наш массив в котором перечислены ID разделов выбранные пользователем
$sect_id = $fofilter;

//Создаем массив фильтра. В конце переменная фильтра
$arFilter = array('IBLOCK_ID' => $IBLOCK_ID, 'ACTIVE' => 'Y', 'ID' => $sect_id);

//Создаем массив выводимых полей
$arSelect = array('ID', 'NAME');

//Применяем метод с фильтром и полями
$rsSection = CIBlockSection::GetTreeList($arFilter, $arSelect);

//Выводим названия и ID разделов
while ($arSection = $rsSection->Fetch()) {
    echo $arSection['NAME'];
    echo $arSection['ID'];
}

Все, теперь вы можете выводить названия и ID (ID конечно можно убрать из вывода, если ни к чему их показывать)

Получить Название родителя раздела инфоблока

И в качестве дополнения, способ как вывести родителя, зная ID потомка, раздела инфоблока

Итак, пользователь выбрал разделы "Другая бытовая техника" и "Малая бытовая техника". Нам же нужно вывести родителя этих разделов "Ремонт бытовой техники"

Мы, способом описанным выше, может получить ID всех разделов, но нам достаточно одного, если он имеет родителя то и все остальные. Поэтому просто прерываем while на втором шаге шаге

//Выводим названия и ID разделов
while ($arSection = $rsSection->Fetch()) {
    //Присваем переменной ID каждого раздела

    $IdOneSection = $arSection['ID'];
    //Прерываем while, мы получили только один ID одного из разделов
break;
}

И просто выводим вот такую конструкцию, в которую подстваили ID одного из известных разделов методом CIBlockSection::GetByID

$ID = $sect_id;
$res = CIBlockSection::GetByID($IdOneSection);
if ($ar_res = $res->GetNext())
$SectionId = $ar_res['IBLOCK_SECTION_ID'];

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

Просмотров: 12837 | Комментариев: 3
Внимание! все сообщения проходят премодерацию. Ваше сообщение появится после проверки
 
Текст сообщения*
Перетащите файлы
Ничего не найдено
Защита от автоматических сообщений
Загрузить файл
Нажимая кнопку "Отправить", Вы принимаете условия
Политики конфиденциальности и обработки персональных данных
great.geits
Приветствую! Что-то не выбирает ID категорий. Возвращает NULL.
Есть какой-нибудь пример использования?
Имя Цитировать
great.geits
Спасибо! А есть пример вывода категорий, отмеченных пользователем? У меня возвращает NULL
Имя Цитировать
Надежда Головина
Здравствуйте. Воспользовалась вашим решением. Надо вывести наименования разделов из доп. полей (тип - привязка к разделам инфоблока), которые выбраны пользователем. НО! Выводится ВЕСЬ массив. Как это исправить?
Код
<?
//Получаем все возможные поля текущего пользователя
$rsUser = CUser::GetByID($USER->GetID());
$arUser = $rsUser->Fetch();

//Выводим если множественное
foreach ($arUser['UF_TAGI'] as $propertyUf):
    echo $propertyUf;
endforeach;

$IBLOCK_ID = 27; // ID нужного инфоблока

//Создаем массив фильтра
$arFilter = array('IBLOCK_ID' => $IBLOCK_ID, 'ACTIVE' => 'Y');

//Добавляем наш массив в котором перечислены ID разделов выбранные пользователем
$sect_id = $fofilter;

//Создаем массив фильтра. В конце переменная фильтра
$arFilter = array('IBLOCK_ID' => $IBLOCK_ID, 'ACTIVE' => 'Y', 'ID' => $sect_id);

//Создаем массив выводимых полей
$arSelect = array('ID', 'NAME');

//Применяем метод с фильтром и полями
$rsSection = CIBlockSection::GetTreeList($arFilter, $arSelect);

//Выводим названия разделов
while ($arSection = $rsSection->Fetch()) {
    echo $arSection['NAME'];
}

foreach ($arUser['UF_TAGI'] as $propertyUf):
    $sectionsUser .= '\'' . $propertyUf . '\',';
endforeach;

eval('$fofilter=array(' . $sectionsUser . ');');
extract($fofilter);

?>
Имя Цитировать

Цены на разработку сайта или приложения

Что бы узнать точные стоимость и срок разработки:
достаточно, как можно подробнее, заполнить опросник и выслать на электронную почту info@bazarow.ru.
После ознакомления, смогу задать уточняющие вопросы и оценить.

В стоимость разработки уже включены и не требуют доплат:
  • Лицензия на необходимую редакцию 1С-Битрикс: Управление сайтом и лицензии на дополнительные модули, если требуются для конкретного проекта.
  • Применение технологии композитный сайт: Оптимизация скорости работы проекта под нагрузками.
  • Один год, бесплатной, технической поддержки от 1С-Битрикс
Интернет-магазин от 250 000 рублей
Полно-комплексная разработка интернет-магазина любой сложности. Интеграция с 1С, службами доставки и оплаты. Внутренняя СЕО оптимизация перед запуском.
Сайт компании от 200 000 рублей
Сайт с каталогом товаров или услуг, без функционала магазина. Включает формы обратной связи внутри карточек каталога. Любое количество статичных и динамичных разделов.
Инфоресурс от 200 000 рублей
Портал или доска объявлений с большим количеством разделов. Возможность включения форумов, блогов, регистрации пользователей, внутри сайтовая социальная сеть.
Сайт на готовом решении от 40 000 рублей
Подбор решения из более 200-от готовых сайтов, в соответствии с тематикой бизнеса. Запуск сайта на сервере или хостинге, со всеми настройками. Не большие доработки под задачу.
Мобильное приложение от 200 000 рублей

Кроме сайтов, занимаюсь разработкой мобильных приложений на технологии Apache Cordova. Это полноценные приложения, которые публикуются и распостранияются через официальные магазины GooglePlay и AppStore

  • Полная интеграция с базой данных, основного сайта.
  • Вывод каталогов продукции и услуг, прямо в приложении.
  • Персональные разделы пользователей с историей заказов.
  • Прямой доступ к устройству: GPS, камера, звонки и медиабиблиотека

attention