289  /  378

Примеры работы

Просмотров: 15227 (Статистика ведётся с 06.02.2017)
Сложность урока:
3 уровень - средняя сложность. Необходимо внимание и немного подумать.
1
2
3
4
5
Недоступно в редакциях:
Ограничений нет

Реальный код

Рассмотрим несколько примеров работы с пользовательскими полями

  • Фильтрация
  • Сортировка
  • Получение значений
  • Использование пользовательских свойств на примере дополнительных полей в подписке

  • Фильтрация

    Пользовательские поля разделов могут принимать участие в фильтрации.

    $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; 
    	} 
    } 
    ?>


    10
    Курсы разработаны в компании «1С-Битрикс»

    Если вы нашли неточность в тексте, непонятное объяснение, пожалуйста, сообщите нам об этом в комментариях.
    Развернуть комментарии