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

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

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

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

Также, в рамках заметки, можно увидеть как вывести название родительского раздела инфоблока, зная 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-го года пишу заметки по разработке сайтов на Битрикс.
Вы можете задавать уточняющие вопросы в комментариях- отвечаю или дополняю заметки по возможности.

Менять большую картинку, при клике на маленькую, в детальной карточке Просмотров: 1763 Мини скриптик, может кому пригодится для каталога товаров или новостей при использовании д... Использование WebP изображений в 1С-Битрикс (на Битрикс: Веб окружени... Просмотров: 25894 WebP это современный формат сжатия изображений, который позволяет, при правильных настройк... XML в формате Commerce ML-2, города России и Мира, для выгрузки в инф... Просмотров: 6301 Подвернулась задачка, создать инфоблок для Битрикс, в котором будут просто города России и... Подключение SSL на Битрикс виртуальная машина Просмотров: 11929 С первого января 2017 года, наличие безопасного соединения HTTPS становится практически об... Заполнить свойство инфоблока ценой из торгового каталога Просмотров: 4585 Если вам по какой-то причине нужно скопировать цену товара в свойство этого же инфоблока. ... Изменить размер картинок на лету в битрикс Просмотров: 46794 Встала задачка: на собственном сайте, уменьшить размер превьюшек картинок у анонсов раздел... Вывести артикул в печатную форму бланка заказа Просмотров: 385 Задача: в печатную форму бланка заказа добавить артикулы товаров и данные о пользователе. ... Не дать пользователю купить больше одного товара, в Битрикс Просмотров: 5148 Иногда нужно и такое: Например: на одном из разрабатываемых сайтов, мне нужно было создать... Настройка выгрузки товаров в Яндекс Маркет с сайта Битрикс Просмотров: 36701 Настройка выгрузки в Яндекс маркет в формате yml, выполняется достаточно просто, кроме одн... Почтовое событие на создание нового элемента инфоблока, через API Просмотров: 14341 Иногда при разработке сайта требуется реализовать функционал добавления элементов инфоблок... Помечаем новинки лейблом в каталоге битрикс Просмотров: 20036 Достаточно часто, при разработке каталога товаров или интернет магазина на системе управле... Информация о заказах и содержимое корзины текущего пользователя. Просмотров: 11776 В процессе разработки сайта могут понадобиться рецепты приведенные ниже. Использовать можн... Добавление в избранное или отложенные, на AJAX из карточки товара Просмотров: 27364 В этой заметке рассакажу как добавлять товары в "Отложенные", для иммитации функционала "И... Как подобрать редакцию Битрикс под задачи Просмотров: 6348 Последнее время, все чаще, при общении с заказчиками, сталкиваюсь с вопросом "— К... Минимальная сумма заказа в корзине и оформлении заказа в 1С-Битрикс Просмотров: 8484 В этой заметке добавим возможность установки минимальной суммы заказа, в новом шаблоне кор... Cordova, ввод в input под диктовку. Голосовой поиск в мобильном прило... Просмотров: 1263 Итак, задачка: реализовать голосовой поиск в мобильном приложении на Cordova. По сути, нам... Если пользователь авторизован то... API Битрикс Просмотров: 22252 Достаточно часто, при создании сайта на битрикс нужно вывести в шаблон или компонент, неку... Дать пользователю возможность быстро отредактировать материал Просмотров: 4364 На одном из разрабатываемых сайтов, пользователи формирую его контент. После регистрации, ... Заполнение габаритов товара, после обмена с 1С, из свойств элемента и... Просмотров: 10422 Если Ваш интернет-магазин интегрирован с 1С, скорее всего столкнулись с такой проблемой: 1... Показать пользователю накопительную скидку за все сделанные заказы, и... Просмотров: 1758 Задача: показать, текущему авторизованному, пользователю сумму всех выполненных заказов и ...