302  /  382
Справочник

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

Просмотров: 81528
Дата последнего изменения: 23.01.2024
Роберт Басыров
Сложность урока:
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())
	{
		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_*").

  Использование пользовательских свойств

Использование пользовательских свойств на примере дополнительных полей в подписке

Задача: подписчиком будет указываться пол, и в зависимости от этого выбора в письме рассылки она или он получит "Уважаемая" или "Уважаемый" в качестве обращения.

В решении используется демо дистрибутив с настроенным функционалом рассылки. Для использования описанного функционала на ваших проектах нужно провести работы:

  • Размещение компонента Форма подписки (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; 
	} 
} 
?>

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

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