304  /  381
Справочник

Добавление, редактирование, удаление пользовательских свойств и их значений

Просмотров: 129722
Дата последнего изменения: 03.09.2025
Роберт Басыров
Сложность урока:
4 уровень - сложно, требуется сосредоточиться, внимание деталям и точному следованию инструкции.
1
2
3
4
5
Недоступно в лицензиях:
Ограничений нет

За работу с пользовательскими полями отвечают классы CUserTypeEntity в старом ядре и UserField в D7.

Класс UserFieldTable применяют для простого доступа к существующим данным. Для изменения записей надо использовать CUserTypeEntity.

Пример добавления пользовательского свойства типа Строка

/**
* Добавление пользовательского свойства
*/
$userTypeEntity    = new CUserTypeEntity();
 
$userFields    = [
/*
*  Идентификатор сущности, к которой будет привязано свойство.
* Для секция формат следующий - IBLOCK_{IBLOCK_ID}_SECTION
*/
	'ENTITY_ID' => 'IBLOCK_3_SECTION',
/* Код поля. Всегда должно начинаться с UF_ */
	'FIELD_NAME' => 'UF_DEV2DAY_FIELD',
	/* Указываем, что тип нового пользовательского свойства строка */
	'USER_TYPE_ID' => 'string',
/*
* XML_ID пользовательского свойства.
* Используется при выгрузке в качестве названия поля
*/
'XML_ID' => 'XML_ID_DEV2DAY_FIELD',
/* Сортировка */
'SORT' => 500,
/* Является поле множественным или нет */
'MULTIPLE' => 'N',
/* Обязательное или нет свойство */
	'MANDATORY' => 'N',
/*
* Показывать в фильтре списка. Возможные значения:
* не показывать = N, точное совпадение = I,
* поиск по маске = E, поиск по подстроке = S
*/
	'SHOW_FILTER' => 'N',
/*
* Не показывать в списке. Если передать какое-либо значение,
* то будет считаться, что флаг выставлен.
*/
	'SHOW_IN_LIST' => '',
/*
* Пустая строка разрешает редактирование.
* Если передать какое-либо значение, то будет считаться,
* что флаг выставлен.

*/
	'EDIT_IN_LIST' => '',
	/* Значения поля участвуют в поиске */
	'IS_SEARCHABLE' => 'N',
	/*
* Дополнительные настройки поля (зависят от типа).
* В нашем случае для типа string
*/
	'SETTINGS'  => [
	/* Значение по умолчанию */
	'DEFAULT_VALUE' => '',
	/* Размер поля ввода для отображения */
	'SIZE'  => '20',
/* Количество строчек поля ввода */
	'ROWS'  => '1',
	/* Минимальная длина строки (0 - не проверять) */
	'MIN_LENGTH'  => '0',
/* Максимальная длина строки (0 - не проверять) */
	'MAX_LENGTH'  => '0',
	/* Регулярное выражение для проверки */
	'REGEXP' => '',
],
/* Подпись в форме редактирования */
	'EDIT_FORM_LABEL'   => [
		'ru'    => 'Пользовательское свойство',
		'en'    => 'User field',
	],
/* Заголовок в списке */
	'LIST_COLUMN_LABEL' => [
		'ru'    => 'Пользовательское свойство',
		'en'    => 'User field',
	],
/* Подпись фильтра в списке */
	'LIST_FILTER_LABEL' => [
		'ru'    => 'Пользовательское свойство',
		'en'    => 'User field',
],
/* Сообщение об ошибке (не обязательное) */
	'ERROR_MESSAGE'     => [
		'ru'    => 'Ошибка при заполнении пользовательского свойства',
		'en'    => 'An error in completing the user field',
],
/* Помощь */
	'HELP_MESSAGE'      => [
		'ru'    => '',
		'en'    => '',
	],
];
 
$userFieldId   = $userTypeEntity->Add( $userFields ); // int

При удачном добавлении свойства в переменную $userFieldId будет возвращен идентификатор нового пользовательского свойства.

Для создания пользовательских полей других типов замените значение USER_TYPE_ID:

  • enumeration - Список
  • double - Число
  • integer - Целое число
  • boolean - Да/Нет
  • string - Строка
  • file - Файл
  • video - Видео
  • datetime - Дата/Время
  • iblock_section - Привязка к разделам инф. блоков
  • iblock_element - Привязка к элементам инф. блоков
  • string_formatted - Шаблон
  • crm - Привязка к элементам CRM
  • crm_status - Привязка к справочникам CRM

Пример добавления значений в пользовательские поля типа Список.

$enumField = new CUserFieldEnum();
$addEnum = [];

//мы передаем массив, который состоит из таких элементов (наличие n в ключе обязательно)
$addEnum['n'.$i] = [
	'XML_ID' => $key,//xml_id
	'VALUE' => $value,//значение
	'DEF' => 'N',//по умолчанию
	'SORT' => $i*10//сортировка
];

$enumField->SetEnumValues($newID, $addEnum);

Обновление пользовательского свойства

При обновлении пользовательского свойства накладываются ограничения на изменение его типа (USER_TYPE_ID), объекта привязки (ENTITY_ID), кода поля (FIELD_NAME). Это связано с возможными ошибками связей значений и сущностей. Если необходимо изменить одно из этих полей, то нужно сначала создать новое пользовательское свойство, привязать все значения к нему, а затем удалить старое свойство.

Пример обновления пользовательского свойства:

$userTypeEntity->Update( $userFieldId, [
	'MANDATORY' => 'Y',
] ); // boolean;

В примере установлено требование обязательности заполнения поля.


Удаление пользовательского поля

Необходимо передать идентификатор пользовательского поля:

	
$userTypeEntity->Delete( $userFieldId );   // CDBResult

Добавление и обновление значений пользовательских полей

Добавление и обновление реализовано также через класс CUserTypeManager и метод Update.

global $USER_FIELD_MANAGER;
 
$section = CIBlockSection::GetList( [], [
	'IBLOCK_CODE'   => 'shop_news',
	'CODE'          => 'test_section',
])->Fetch();
 
if( !$section ) {
	throw new Exception( 'Секция не найдена' );
}
 
$USER_FIELD_MANAGER->Update( 'IBLOCK_3_SECTION', $section['ID'], [
	'UF_DEV2DAY_FIELD'  => 'updated value'
] ); // boolean

В случае успешного обновления метод вернет true.

Добавить пользовательское свойство к разделу инфоблока

Если необходимо добавить пользовательское свойство к разделу инфоблока через механизм Битрикс-API, нужно использовать следующий код с вариациями:

$userField  = new CUserTypeEntity;
$userField->Add(
    [
        'ENTITY_ID' => 'IBLOCK_2_SECTION',
        'FIELD_NAME' => 'UF_TITLE',
        'USER_TYPE_ID' => 'string',
        'EDIT_FORM_LABEL' => [
            'ru'=>'заголовок',
            'en'=>'title'
        ]
    ]
);

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