Телеграм: @bazarow_ru Почта: mihail@bazarow.ru

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

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

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

Также, в рамках заметки, можно увидеть как вывести название родительского раздела инфоблока, зная 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'];

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

great.geits 05.11.2020
Приветствую! Что-то не выбирает ID категорий. Возвращает NULL.
Есть какой-нибудь пример использования?
great.geits 05.11.2020
Спасибо! А есть пример вывода категорий, отмеченных пользователем? У меня возвращает NULL
Надежда Головина 21.03.2021
Здравствуйте. Воспользовалась вашим решением. Надо вывести наименования разделов из доп. полей (тип - привязка к разделам инфоблока), которые выбраны пользователем. НО! Выводится ВЕСЬ массив. Как это исправить?
Код
<?
//Получаем все возможные поля текущего пользователя
$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);

?>

Записная книжка разработчика

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

Базовая защита "Битрикс виртуальная машина" от DDoS атак. Просмотров: 5856 Данный способ защиты не панацея, и скорее всего не спасет от профессиональной DDoS атаки, ... Вывести информацию, только на первом уровне раздела каталога, в 1С-Би... Просмотров: 5561 Задача: на сайте, в каталоге, выводится два фильтра - боковой и верхний. Оба компонента по... Адаптивное гамбургер меню для битрикс Просмотров: 15139 Заметка коротенькая, но решил оставить ее - так как самому часто нужно нечто подобное. В а... Получение доступа к железу устройства из Битрикс мобильное приложение Просмотров: 6297 Документация к мобильному приложению 1С-Битрикс очень куцая. В основном описывает функцион... Настройка выгрузки товаров в Яндекс Маркет с сайта Битрикс Просмотров: 37972 Настройка выгрузки в Яндекс маркет в формате yml, выполняется достаточно просто, кроме одн... Индивидуальные цены в 1С-Битрикс: в каталоге и при оформлении заказа Просмотров: 6055 В этой заметке постараюсь описать процесс реализации индивидуальных цен, для пользователей... Автоматически отгрузить заказ и сменить статус отгрузки, при выполнен... Просмотров: 950 Проблема: Заказы, на сайте, обрабатываются только в 1С. При этом 1С не работает с отгрузка... Cordova, ввод в input под диктовку. Голосовой поиск в мобильном прило... Просмотров: 1608 Итак, задачка: реализовать голосовой поиск в мобильном приложении на Cordova. По сути, нам... Создание мобильного приложения на cordova, для любого сайта. Просмотров: 15874 Если стоит задача разработки мобильного приложения для сайта, можете воспользоваться данно... Пункты меню из разделов инфоблока Битрикс Просмотров: 93234 В принципе это стандартная возможность системы управления битрикс, но почему-то часто спра... Вывести все товары, с постраничной навигацией, из всех разделов инфоб... Просмотров: 29884 По сути, эта заметка, небольшой лайфхак. Достаточно часто нужно, в корне каталога, в ТОП-е... Дополнительные параметры в меню Битрикс Просмотров: 20769 Иногда нужно присвоить какой-то функционал к конкретному пункту меню в битрикс. Например о... Если папка то применяем...в Битрикс Просмотров: 30407 Бывает, стоит задача применить какой-либо стиль или вывести конкретный кусочек кода для ди... Отфильтровать новости в Битрикс за заданный период Просмотров: 16690 Иногда, нужно отфильтровать элементы (новости например) по дате в Битрикс, с помощью компо... Если предложение SKU в корзине, поменять кнопку добавления на "В корз... Просмотров: 3881 Данная заметка является дополнением к ранее опубликованной: Есл... Установка веб-сервера LAMP на ubuntu 20.04 LTS, оптимизированный под ... Просмотров: 12750 В последнее время, плотно пересел c macOS на ubuntu, и решил настроить себе полноценное ра... Ленивая подгрузка картинок в компоненте, на vue js Битрикс Просмотров: 10348 Если на одну страницу сайта выводится большое количество картинок, которые могут долго под... XML в формате Commerce ML-2, города России и Мира, для выгрузки в инф... Просмотров: 6961 Подвернулась задачка, создать инфоблок для Битрикс, в котором будут просто города России и... Увидеть файл заказов который передаст Битрикс в 1С Просмотров: 24492 Для диагностики обмена заказов, интернет-магазина на 1С Битрикс с 1С Управление Торговлей,... Умный фильтр только на последнем уровне разделов каталога. Просмотров: 11682 Если в разработаываемом магазине или в принципе в каталоге на Битрикс, вы выводите умный ф...