Дата последнего изменения: 23.01.2024
Рассмотрим несколько примеров работы с пользовательскими полями.
Фильтрация |
Пользовательские поля разделов могут принимать участие в фильтрации.
$sec_Filter= array( "IBLOCK_ID" => $IBLOCK_ID, "DEPTH_LEVEL" => "2", "!UF_ARC_PAGES" => "" );
IBLOCK_ID
.Будут отобраны все разделы, у которых установлено значение свойства UF_ARC_PAGES
.
Фильтрация по значению пользовательского свойства:
$arSFilter ['=UF_USERS_PROPERTY'] =$users_property_value;
Сортировка |
Сортировать по пользовательским полям разделов:
$arSort = array( "UF_RATING"=>"asc", "sort"=>"asc" );
Получить значение пользовательского поля можно с помощью метода GetList соответствующего класса.
Значение пользовательского поля для пользователя можно получить таким образом:
$rsUser = CUser::GetByID($user); $arUser = $rsUser->Fetch(); $нужное значение = $arUser['код пользовательского поля'];
Чтобы получить значение пользовательского поля определенного пользователя, тип поля – строка, необходимо воспользоваться методом GetList класса CUser. При этом в качестве четвертого аргумента данному методу необходимо передать массив с ключом SELECT, значениями которого являются список кодов пользовательских свойств, которые необходимо получить.
global $USER; $arFilter = array("ID" => $USER->GetID()); $arParams["SELECT"] = array("UF_USER_CARD_CODE"); $arRes = CUser::GetList($by,$desc,$arFilter,$arParams); if ($res = $arRes->Fetch()) { echo $res["UF_USER_CARD_CODE"]; }
Если тип пользовательского поля список, то для получения значения (или значений, если возможен множественный выбор) текущего пользователя нужно воспользоваться методом GetList класса CUserFieldEnum.
global $USER; $arFilter = array("ID" => $USER->GetID()); $arParams["SELECT"] = array("UF_LIST_TASK"); $arRes = CUser::GetList($by,$desc,$arFilter,$arParams); if ($res = $arRes->Fetch()) { foreach ($res["UF_LIST_TASK "] as $id) { $rsRes= CUserFieldEnum::GetList(array(), array( "ID" => $id, )); if($arGender = $rsRes->GetNext()) echo $arGender["VALUE"]; } }
Если необходимо получить список всех значений пользовательского поля объекта USER
типа список, то следует воспользоваться следующим кодом:
global $USER_FIELD_MANAGER; $arFields = $USER_FIELD_MANAGER->GetUserFields("USER"); $obEnum = new CUserFieldEnum; $rsEnum = $obEnum->GetList(array(), array("USER_FIELD_ID" => $arFields["UF_LIST_TASK "]["ID"])); while($arEnum = $rsEnum->GetNext()){ echo $arEnum["VALUE"]; }
Для выбора значения пользовательского поля у раздела информационного блока можно воспользоваться методом CIBlockSection:GetList:
$aSection = CIBlockSection::GetList( array(), array( 'IBLOCK_ID' => 3, 'CODE' => 'test_section', ), false, array( 'UF_DEV2DAY_FIELD' ) )->Fetch();
IBLOCK_ID
) обязательна, иначе выборка пользовательских свойств не будет осуществлена.Получение значения пользовательского поля типа файл конкретного раздела инфоблока:
$iblockID = 1; $sectionID = 10; // ID секции $propertyCode = 'UF_MY_FILE'; // Код свойства $rsResult = CIBlockSection::GetList(array("SORT" => "ASC"), array("ID" => $sectionID, "IBLOCK_ID" => $iblockID), false, $arSelect = array("ID", "IBLOCK_ID", $propertyCode)); if ($arResult = $rsResult -> GetNext()) { print_r($arResult); }
Так как пользовательские поля можно использовать не только с разделами информационного блока, но и с любыми другими сущностями, то для выбора значений по идентификатору сущности используется класс CUserTypeManager. Экземпляр данного класса уже находится в глобальной переменной $USER_FIELD_MANAGER
.
global $USER_FIELD_MANAGER; $aSection = CIBlockSection::GetList( array(), array( 'IBLOCK_CODE' => 'shop_news', 'CODE' => 'test_section', ) )->Fetch(); if( !$aSection ) { throw new Exception( 'Секция не найдена' ); } $aUserField = $USER_FIELD_MANAGER->GetUserFields( 'IBLOCK_3_SECTION', $aSection['ID'] ); // array
В результате мы получим массив содержащий в себе всю информацию о поле и его значении для конкретного объекта.
arSelect
достаточно указать Array("UF_*")
.Использование пользовательских свойств на примере дополнительных полей в подписке
Задача: подписчиком будет указываться пол, и в зависимости от этого выбора в письме рассылки она или он получит "Уважаемая" или "Уважаемый" в качестве обращения.
В решении используется демо дистрибутив с настроенным функционалом рассылки. Для использования описанного функционала на ваших проектах нужно провести работы:
Решение. Зададим идентификатор сущности к которой будут привязываться значения дополнительных свойств: MY_SUBSCRIPTION. В качестве уникального идентификатора объектов этой сущности будут выступать b_subscription.ID.
На странице Пользовательские поля (Настройки > Настройки продукта > Пользовательские поля) откроем форму создания нового поля.
Заполните поля:
Остальные поля не заполняем, нажимаем кнопку Применить.
На вкладке Список задаем возможные значения: Женский и Мужской. Применяем внесенные изменения.
Кастомизиция компонента subscribe.edit
После копирования компонента в свое пространство имён заменяем вызов на странице /personal/subscribe/subscr_edit.php
на путь к копированному компоненту.
Для вывода значения пользовательских свойств подписки в файле component.php после
$arResult["ALLOW_REGISTER"] = $bAllowRegister?"Y":"N";добавляем чтение значений из базы данных
$arResult["USER_PROPERTIES"] = $GLOBALS["USER_FIELD_MANAGER"]->GetUserFields( "MY_SUBSCRIPTION", $arResult["ID"], LANGUAGE_ID );
В файле setting.php шаблона выводим примерно следующее:
<table> <?foreach ($arResult["USER_PROPERTIES"] as $FIELD_NAME => $arUserField):?> <tr> <td><?echo $arUserField["EDIT_FORM_LABEL"]?>:</td> <td><?$APPLICATION->IncludeComponent( "bitrix:system.field.edit", $arUserField["USER_TYPE"]["USER_TYPE_ID"], array( "bVarsFromForm" => false, "arUserField" => $arUserField ), null, array("HIDE_ICONS"=>"Y"));?></td> </tr> <?endforeach;?> </table>Для сохранения значений в базе данных в файле component.php после строк
if($ID>0) { ... $res = $obSubscription->Update($ID, $arFields); ... } else { ... $ID = $obSubscription->Add($arFields); ... }добавляем код установки значений свойств
if($res && $ID > 0) { global $USER_FIELD_MANAGER; $arUserFields = $USER_FIELD_MANAGER->GetUserFields("MY_SUBSCRIPTION"); $arFields = array(); foreach($arUserFields as $FIELD_ID => $arField) $arFields[$FIELD_ID] = $_REQUEST[$FIELD_ID]; $USER_FIELD_MANAGER->Update("MY_SUBSCRIPTION", $ID, $arFields); }
Для полноты действий у данного поля в административной части указываем:
Создайте новую подписку (или отредактируйте уже существующую) и укажите пол подписчика.
Теперь надо сделать так, чтобы #GENDER_HELLO#
будет заменяться на Уважаемая/Уважаемый в зависимости от пола. Создаем обработчик события BeforePostingSendMail:
<? // файл /bitrix/php_interface/init.php // регистрируем обработчик AddEventHandler("subscribe", "BeforePostingSendMail", Array("MyClass", "BeforePostingSendMailHandler")); class MyClass { // создаем обработчик события "BeforePostingSendMail" function BeforePostingSendMailHandler($arFields) { $rs = CSubscription::GetByEmail($arFields["EMAIL"]); if($ar = $rs->Fetch()) { global $USER_FIELD_MANAGER; $arUserFields = $USER_FIELD_MANAGER->GetUserFields("MY_SUBSCRIPTION", $ar["ID"]); if($arUserFields["UF_GENDER"]["VALUE"] == 1) $arFields["BODY"] = str_replace("#GENDER_HELLO#", "Уважаемая", $arFields["BODY"]); elseif($arUserFields["UF_GENDER"]["VALUE"] == 2) $arFields["BODY"] = str_replace("#GENDER_HELLO#", "Уважаемый", $arFields["BODY"]); else $arFields["BODY"] = str_replace("#GENDER_HELLO#", "", $arFields["BODY"]); } else { $arFields["BODY"] = str_replace("#GENDER_HELLO#", "", $arFields["BODY"]); } return $arFields; } } ?>