Скрипты миграций для 1С-Битрикс. Добавление/обновление пользовательских свойств
На очереди кусок кода для миграции пользовательских свойств. Есть поддержка обновления значения свойств типа «Список».
Всё, что вам остаётся — описать массив $aUserFields с нужными свойствами для миграции.
//<?php /** * Добавление/обновление пользовательских свойтв * @param array $aUserFields Массив свойств * @doc https://dev.1c-bitrix.ru/api_help/main/reference/cusertypeentity/index.php * @doc https://dev.1c-bitrix.ru/api_help/main/reference/cuserfieldenum/index.php */ global $APPLICATION; $info = array(); function oGetMessage($key, $fields) { $messages = array( 'USER_TYPE_UPDATE' => 'Пользовательское свойство #FIELD_NAME# [#ENTITY_ID#] успешно обновлено', 'USER_TYPE_UPDATE_ERROR' => 'Ошибка обновления пользовательского свойства #FIELD_NAME# [#ENTITY_ID#]: #ERROR#', 'USER_TYPE_ADDED' => 'Пользовательское свойство #FIELD_NAME# [#ENTITY_ID#] успешно добавлено', 'USER_TYPE_ADDED_ERROR' => 'Ошибка добавления пользовательского свойства #FIELD_NAME# [#ENTITY_ID#]: #ERROR#', 'USER_TYPE_ENUMS_SET_ERROR' => 'Ошибка установки значений пользовательского свойства #FIELD_NAME# [#ENTITY_ID#]: #ERROR#', ); return isset($messages[$key]) ? str_replace(array_keys($fields), array_values($fields), $messages[$key]) : ''; } // @TODO edit $aUserFields = array( array( 'ENTITY_ID' => 'USER', 'FIELD_NAME' => 'UF_HOODS', 'USER_TYPE_ID' => 'enumeration', 'SORT' => 500, 'MULTIPLE' => 'N', 'MANDATORY' => 'N', 'IS_SEARCHABLE' => 'N', 'SETTINGS' => array( 'DEFAULT_VALUE' => '', 'SIZE' => '40', 'ROWS' => '3', ), 'EDIT_FORM_LABEL' => array( 'ru' => 'Вытяжки', 'en' => 'Hoods', ), 'LIST_COLUMN_LABEL' => array( 'ru' => 'Вытяжки', 'en' => 'Hoods', ), 'LIST_FILTER_LABEL' => array( 'ru' => 'Вытяжки', 'en' => 'Hoods', ), 'VALUES' => array( array( 'VALUE' => 'К1', 'XML_ID' => 'К1', 'DEF' => 'N', 'SORT' => 100, ), array( 'VALUE' => 'К2', 'XML_ID' => 'К2', 'DEF' => 'N', 'SORT' => 200, ), ), ), ); $oUserTypeEntity = new CUserTypeEntity(); foreach ($aUserFields as $aUserField) { $resProperty = CUserTypeEntity::GetList( array(), array('ENTITY_ID' => $aUserField['ENTITY_ID'], 'FIELD_NAME' => $aUserField['FIELD_NAME']) ); if ($aUserHasField = $resProperty->Fetch()) { $idUserTypeProp = $aUserHasField['ID']; if ($oUserTypeEntity->Update($idUserTypeProp, $aUserField)) { $info[] = oGetMessage('USER_TYPE_UPDATE', array( '#FIELD_NAME#' => $aUserHasField['FIELD_NAME'], '#ENTITY_ID#' => $aUserHasField['ENTITY_ID'], )); } else { if (($ex = $APPLICATION->GetException())) { throw new \Bitrix\Main\SystemException(oGetMessage('USER_TYPE_UPDATE_ERROR', array( '#FIELD_NAME#' => $aUserHasField['FIELD_NAME'], '#ENTITY_ID#' => $aUserHasField['ENTITY_ID'], '#ERROR#' => $ex->GetString(), ))); } } } else { if ($idUserTypeProp = $oUserTypeEntity->Add($aUserField)) { $info[] = oGetMessage('USER_TYPE_ADDED', array( '#FIELD_NAME#' => $aUserField['FIELD_NAME'], '#ENTITY_ID#' => $aUserField['ENTITY_ID'], )); } else { if (($ex = $APPLICATION->GetException())) { throw new \Bitrix\Main\SystemException(oGetMessage('USER_TYPE_ADDED_ERROR', array( '#FIELD_NAME#' => $aUserField['FIELD_NAME'], '#ENTITY_ID#' => $aUserField['ENTITY_ID'], '#ERROR#' => $ex->GetString(), ))); } } } $obEnum = new CUserFieldEnum; $valuesEnums = array(); foreach ($aUserField['VALUES'] as $arUserFieldEnum) { $valuesEnums[] = $arUserFieldEnum + array('USER_FIELD_ID' => $idUserTypeProp); } $userTypeEnumsIterator = CUserFieldEnum::GetList(array('SORT' => 'ASC'), array('USER_FIELD_ID' => $idUserTypeProp)); if ($userTypeEnumsIterator->SelectedRowsCount()) { $valuesEnumsNews = array(); foreach ($valuesEnums as $idValueEnum => $valueEnum) { $userTypeEnumsHasIterator = CUserFieldEnum::GetList(array(), array('USER_FIELD_ID' => $idUserTypeProp, 'VALUE' => $valueEnum['VALUE'])); if ($arTypeEnumsHasIterator = $userTypeEnumsHasIterator->Fetch()) { $valuesEnumsNews[$arTypeEnumsHasIterator['ID']] = $valueEnum; } else { $valuesEnumsNews['n' . $idValueEnum] = $valueEnum; } } } else { $valuesEnumsNews = array(); foreach ($valuesEnums as $idValueEnum => $valueEnum) { $valuesEnumsNews['n' . $idValueEnum] = $valueEnum; } } if (!$obEnum->SetEnumValues($idUserTypeProp, $valuesEnumsNews)) { $strError = ''; if ($ex = $APPLICATION->GetException()) { $strError = $ex->GetString(); } throw new \Bitrix\Main\SystemException(oGetMessage('USER_TYPE_ENUMS_SET_ERROR', array( '#FIELD_NAME#' => $aUserField['FIELD_NAME'], '#ENTITY_ID#' => $aUserField['ENTITY_ID'], '#ERROR#' => $strError, ))); } } echo implode("<br>\n", $info);
Список миграций доступен по тегу Миграции для 1С-Битрикс
2 комментария
Ещё бы где-нибудь как прописать ID HL блока при 'USER_TYPE_ID' => 'hlblock'," в "SETTINGS"
Описание связи с Highload'ом - лежит тут: bitrix\modules\highloadblock\classes\general\cusertypehlblock.php
Значит можно юзать оттуда:
"SETTINGS" => [ "DISPLAY" => $disp, "LIST_HEIGHT" => ($height < 1? 1: $height), "HLBLOCK_ID" => $hlblock_id, "HLFIELD_ID" => $hlfield_id, "DEFAULT_VALUE" => $element_id, ];