то ждем ваше обращение в нашей службе тех поддержки.
Примеры работы
Реальный код |
Рассмотрим несколько примеров работы с пользовательскими полями
Фильтрация |
Пользовательские поля разделов могут принимать участие в фильтрации.
$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())
{
echo '', mydump($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_*").Использование пользовательских свойств на примере дополнительных полей в подписке |
Задача: подписчиком будет указываться пол, и в зависимости от этого выбора в письме рассылки она или он получит "Уважаемая" или "Уважаемый" в качестве обращения.
В решении используется демо дистрибутив с настроенным функционалом рассылки. Для использования описанного функционала на ваших проектах нужно провести работы:
- Размещение компонента Форма подписки (bitrix:subscribe.form) в шаблоне сайта.
- Настройка компонента на страницу редактирования подписки пользователя.
- Создание, при необходимости, рубрик подписки.
- Создать раздел управления подписками.
- Размещение компонента Страница рассылок (bitrix:subscribe.index) и настройка ее на страницу редактирования подписки пользователя
- Создание страницы редактирования подписки пользователя и размещение на ней компонента Страница редактирования подписки (bitrix:subscribe.edit).
- Настройка модуля Подписка
Решение. Зададим идентификатор сущности к которой будут привязываться значения дополнительных свойств: MY_SUBSCRIPTION. В качестве уникального идентификатора объектов этой сущности будут выступать b_subscription.ID.
На странице Пользовательские поля (Настройки > Настройки продукта > Пользовательские поля) откроем форму создания нового поля.
Заполните поля:
- Тип данных - Список
- Объект - MY_SUBSCRIPTION
- Код поля - UF_GENDER
Остальные поля не заполняем, нажимаем кнопку Применить.
На вкладке Список задаем возможные значения: Женский и Мужской. Применяем внесенные изменения.
Кастомизиция компонента 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;
}
}
?>
- Расширение пользовательских типов для пользовательских полей главного модуля. (блог)
- Как прикрутить пользовательские свойства к своему модулю (блог)
- Добавление типов данных "Связь с элементом" и "Связь с элементом в виде списка" (блог)
Назад в раздел
Наверх