Дата последнего изменения: 13.11.2023
За работу с пользовательскими полями в D7 отвечает класс UserField, в старом ядре: CUserTypeEntity.
/** * Добавление пользовательского свойства */ $oUserTypeEntity = new CUserTypeEntity(); $aUserFields = array( /* * Идентификатор сущности, к которой будет привязано свойство. * Для секция формат следующий - 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' => array( /* Значение по умолчанию */ 'DEFAULT_VALUE' => '', /* Размер поля ввода для отображения */ 'SIZE' => '20', /* Количество строчек поля ввода */ 'ROWS' => '1', /* Минимальная длина строки (0 - не проверять) */ 'MIN_LENGTH' => '0', /* Максимальная длина строки (0 - не проверять) */ 'MAX_LENGTH' => '0', /* Регулярное выражение для проверки */ 'REGEXP' => '', ), /* Подпись в форме редактирования */ 'EDIT_FORM_LABEL' => array( 'ru' => 'Пользовательское свойство', 'en' => 'User field', ), /* Заголовок в списке */ 'LIST_COLUMN_LABEL' => array( 'ru' => 'Пользовательское свойство', 'en' => 'User field', ), /* Подпись фильтра в списке */ 'LIST_FILTER_LABEL' => array( 'ru' => 'Пользовательское свойство', 'en' => 'User field', ), /* Сообщение об ошибке (не обязательное) */ 'ERROR_MESSAGE' => array( 'ru' => 'Ошибка при заполнении пользовательского свойства', 'en' => 'An error in completing the user field', ), /* Помощь */ 'HELP_MESSAGE' => array( 'ru' => '', 'en' => '', ), ); $iUserFieldId = $oUserTypeEntity->Add( $aUserFields ); // int
При удачном добавлении свойства в переменную $iUserFieldId будет возвращен идентификатор нового пользовательского свойства.
Для создания пользовательских полей других типов замените значение USER_TYPE_ID:
$obEnum = new CUserFieldEnum(); $obEnum->SetEnumValues($newID, $arAddEnum); //мы передаем массив, который состоит из таких элементов (наличие n в ключе обязательно) $arAddEnum['n'.$i] = array( 'XML_ID' => $key,//xml_id 'VALUE' => $value,//значение 'DEF' => 'N',//по умолчанию 'SORT' => $i*10//сортировка );
При обновлении пользовательского свойства накладываются ограничения на изменение его типа (USER_TYPE_ID
), объекта привязки (ENTITY_ID), кода поля (FIELD_NAME). Это связано с возможными ошибками связей значений и сущностей. Если необходимо изменить одно из этих полей, то нужно сначала создать новое пользовательское свойство, привязать все значения к нему, а затем удалить старое свойство.
Пример обновления пользовательского свойства:
$oUserTypeEntity->Update( $iUserFieldId, array( 'MANDATORY' => 'Y', ) ); // boolean;
В примере установлено требование обязательности заполнения поля.
Необходимо передать идентификатор пользовательского поля:
$oUserTypeEntity->Delete( $iUserFieldId ); // CDBResult
Добавление и обновление реализовано также через класс CUserTypeManager и метод Update.
global $USER_FIELD_MANAGER; $aSection = CIBlockSection::GetList( array(), array( 'IBLOCK_CODE' => 'shop_news', 'CODE' => 'test_section', ) )->Fetch(); if( !$aSection ) { throw new Exception( 'Секция не найдена' ); } $USER_FIELD_MANAGER->Update( 'IBLOCK_3_SECTION', $aSection['ID'], array( 'UF_DEV2DAY_FIELD' => 'updated value' ) ); // boolean
В случае успешного обновления метод вернет true.
Если необходимо добавить пользовательское свойство к разделу инфоблока через механизм Битрикс-API, нужно использовать следующий код с вариациями:
$arFields = Array( "ENTITY_ID" => "IBLOCK_2_SECTION", "FIELD_NAME" => "UF_TITLE", "USER_TYPE_ID" => "string", "EDIT_FORM_LABEL" => Array("ru"=>"заголовок", "en"=>"title") ); $obUserField = new CUserTypeEntity; $obUserField->Add($arFields);