Скрипты миграций для 1С-Битрикс. Добавление: типа инфоблока, инфоблока, свойств инфоблока
На примере создания инфоблока баннеров.
/** * Описываем свойства нового типа инфоблока */ $arFieldsIblockType = Array( 'ID' => 'banners', 'SECTIONS' => 'N', 'IN_RSS' => 'N', 'SORT' => 900, 'LANG' => array( 'ru' => array( 'NAME' => 'Баннеры', 'SECTION_NAME' => 'Баннеры', 'ELEMENT_NAME' => 'Баннеры', ), 'en' => array( 'NAME' => 'Banners', 'SECTION_NAME' => 'Banners', 'ELEMENT_NAME' => 'Banners' ), ) ); /** * Описываем свойства нового инфоблока */ $arFieldsIblock = array( 'VERSION' => 2, 'ACTIVE' => 'Y', 'NAME' => 'Баннеры', 'IBLOCK_TYPE_ID' => 'banners', 'CODE' => 'banners', 'SITE_ID' => array('s1'), 'SORT' => 500, 'GROUP_ID' => array(2 => 'R'), 'LIST_MODE' => 'C', 'WORKFLOW' => 'N', 'INDEX_ELEMENT' => 'N', 'INDEX_SECTION' => 'N', 'RSS_ACTIVE' => 'N', 'XML_ID' => 'banners', 'LIST_PAGE_URL' => '/#IBLOCK_CODE#/', 'SECTION_PAGE_URL' => '/#IBLOCK_CODE#/#SECTION_CODE_PATH#/', 'DETAIL_PAGE_URL' => '/#IBLOCK_CODE#/#SECTION_CODE_PATH#/#ELEMENT_CODE#.html', 'FIELDS' => array( 'ACTIVE_FROM' => array( 'IS_REQUIRED' => 'Y', 'DEFAULT_VALUE' => '=now', ), 'ACTIVE_TO' => array( 'IS_REQUIRED' => 'Y', 'DEFAULT_VALUE' => '60', ), 'DETAIL_PICTURE' => array( 'IS_REQUIRED' => 'Y', ), 'CODE' => array( 'IS_REQUIRED' => 'N', 'DEFAULT_VALUE' => array( 'UNIQUE' => 'Y', ), ), 'IBLOCK_SECTION' => array( 'IS_REQUIRED' => 'N', ), 'SECTION_CODE' => array( 'IS_REQUIRED' => 'N', 'DEFAULT_VALUE' => array( 'TRANSLITERATION' => 'Y', 'UNIQUE' => 'Y', 'TRANS_CASE' => 'L', 'TRANS_SPACE' => '-', 'TRANS_OTHER' => '-', ), ), ), 'IS_CATALOG' => 'N', 'VAT_ID' => '', ); /** * Описываем поля свойств нового нужных инфоблоков */ $arProperties = array( array( 'NAME' => 'Тип баннера', 'ACTIVE' => 'Y', 'SORT' => 500, 'CODE' => 'TYPE_BANNER', 'IBLOCK_ID' => '{NEW_IBLOCK_ID}', 'PROPERTY_TYPE' => 'L', 'IS_REQUIRED' => 'Y', 'FILTRABLE' => 'Y', 'VALUES' => array( array( 'XML_ID' => 'ON_MAIN_PAGE', 'VALUE' => 'На главной странице', 'DEF' => 'N', 'SORT' => 100, ), array( 'XML_ID' => 'ON_CATALOG_PAGE', 'VALUE' => 'На странице каталога', 'DEF' => 'N', 'SORT' => 200, ), ) ), ); // logic function oGetMessage($key, $fields) { $messages = array( 'A_AM_NEW_IBLOCK_TYPE_MESSAGE_ADDED' => 'Тип информационного блока «#IBLOCK_TYPE#» успешно добавлен', 'A_AM_NEW_IBLOCK_TYPE_MESSAGE_UPDATE' => 'Тип информационного блока «#IBLOCK_TYPE#» успешно обновлён', 'A_AM_NEW_IBLOCK_MESSAGE_ADDED' => 'Информационный блок «#IBLOCK#» [#ID#] успешно добавлен', 'A_AM_NEW_IBLOCK_MESSAGE_UPDATE' => 'Информационный блок «#IBLOCK#» [#ID#] успешно обновлён', 'A_AM_NEW_IBLOCK_MESSAGE_ERROR' => 'Ошибка добавления информационного блока «#IBLOCK#»: #ERROR#', 'A_AM_NEW_IBLOCK_MESSAGE_ERROR_UPDATE' => 'Ошибка обновления информационного блока «#IBLOCK#»: #ERROR#', 'A_AM_NEW_IBLOCK_MESSAGE_EXISTS' => 'Инфоблок «#IBLOCK#» уже существует', 'A_AM_NEW_IBLOCK_PROP_MESSAGE_UPDATE' => 'Свойство «#NAME#» [#ID#] успешно обновлено', 'A_AM_NEW_IBLOCK_PROP_MESSAGE_UPDATE_ERROR' => 'Ошибка обновления свойства «#NAME#» [#ID#]: #ERROR#', 'A_AM_NEW_IBLOCK_PROP_MESSAGE_ADDED' => 'Свойство «#NAME#» [#ID#] успешно добавлено', 'A_AM_NEW_IBLOCK_PROP_MESSAGE_ADDED_ERROR' => 'Ошибка добавления свойства «#NAME#»: #ERROR#', ); return isset($messages[$key]) ? str_replace(array_keys($fields), array_values($fields), $messages[$key]) : ''; } global $DB; $DB->StartTransaction(); try { \Bitrix\Main\Loader::includeModule('iblock'); $info = array(); // {{{ Add type $boolIblockExists = false; $iblockTypeIterator = \Bitrix\Iblock\TypeTable::getById('banners'); if (($iblockType = $iblockTypeIterator->fetch())) { $boolIblockExists = true; } $obBlockType = new CIBlockType; if ($boolIblockExists) { if ($obBlockType->Update($arFieldsIblockType['ID'], $arFieldsIblockType)) { $info[] = oGetMessage('A_AM_NEW_IBLOCK_TYPE_MESSAGE_UPDATE', array( '#IBLOCK_TYPE#' => $arFieldsIblockType['LANG']['ru']['NAME'], )); } else { throw new \Bitrix\Main\SystemException(oGetMessage('A_AM_NEW_IBLOCK_TYPE_MESSAGE_ERROR_UPDATE', array( '#ERROR#' => $obBlockType->LAST_ERROR, ))); } } else { $res = $obBlockType->Add($arFieldsIblockType); if ($res) { $info[] = oGetMessage('A_AM_NEW_IBLOCK_TYPE_MESSAGE_ADDED', array( '#IBLOCK_TYPE#' => $arFieldsIblockType['LANG']['ru']['NAME'], )); } else { throw new \Bitrix\Main\SystemException(oGetMessage('A_AM_NEW_IBLOCK_TYPE_MESSAGE_ERROR', array( '#ERROR#' => $obBlockType->LAST_ERROR, ))); } } // }}} // {{{ Add iblock $newIBlockId = 0; $iblockIterator = \Bitrix\Iblock\IblockTable::getList(array( 'filter' => array( '=IBLOCK_TYPE_ID' => 'banners', ) )); if (($iblock = $iblockIterator->fetch())) { $newIBlockId = $iblock['ID']; } $obIBlock = new CIBlock; if (intval($newIBlockId) > 0) { if ($obIBlock->Update($newIBlockId, $arFieldsIblock)) { $info[] = oGetMessage('A_AM_NEW_IBLOCK_MESSAGE_UPDATE', array( '#IBLOCK#' => $arFieldsIblock['NAME'], '#ID#' => intval($newIBlockId), )); } else { throw new \Bitrix\Main\SystemException(oGetMessage('A_AM_NEW_IBLOCK_MESSAGE_ERROR_UPDATE', array( '#ERROR#' => $obIBlock->LAST_ERROR, ))); } } else { $res = $obIBlock->Add($arFieldsIblock); if ($res) { $newIBlockId = intval($res); $info[] = oGetMessage('A_AM_NEW_IBLOCK_MESSAGE_ADDED', array( '#IBLOCK#' => $arFieldsIblock['NAME'], '#ID#' => $newIBlockId, )); } else { throw new \Bitrix\Main\SystemException(oGetMessage('A_AM_NEW_IBLOCK_MESSAGE_ERROR', array( '#ERROR#' => $obIBlock->LAST_ERROR, ))); } } // }}} // {{{ Add Iblock Props foreach ($arProperties as $arProperty) { $arProperty['IBLOCK_ID'] = str_replace('{NEW_IBLOCK_ID}', $newIBlockId, $arProperty['IBLOCK_ID']); $ibp = new CIBlockProperty(); $resProperty = CIBlockProperty::GetList( array(), array( 'CODE' => $arProperty['CODE'], 'IBLOCK_ID' => $arProperty['IBLOCK_ID'] ) ); if ($arHasProperty = $resProperty->Fetch()) { if ($ibp->Update($arHasProperty['ID'], $arProperty)) { $info[] = oGetMessage('A_AM_NEW_IBLOCK_PROP_MESSAGE_UPDATE', array( '#NAME#' => $arProperty['NAME'], '#ID#' => $arHasProperty['ID'], )); } else { if (($ex = $APPLICATION->GetException())) { throw new \Bitrix\Main\SystemException(oGetMessage('A_AM_NEW_IBLOCK_PROP_MESSAGE_UPDATE_ERROR', array( '#ERROR#' => $ex->GetString(), '#NAME#' => $arProperty['NAME'], '#ID#' => $arHasProperty['ID'], ))); } elseif (isset($ibp->LAST_ERROR)) { throw new \Bitrix\Main\SystemException(oGetMessage('A_AM_NEW_IBLOCK_PROP_MESSAGE_UPDATE_ERROR', array( '#ERROR#' => $ibp->LAST_ERROR, '#NAME#' => $arProperty['NAME'], '#ID#' => $arHasProperty['ID'], ))); } } } else { if (($propID = $ibp->Add($arProperty))) { $info[] = oGetMessage('A_AM_NEW_IBLOCK_PROP_MESSAGE_ADDED', array( '#NAME#' => $arProperty['NAME'], '#ID#' => $propID, )); } else { if (($ex = $APPLICATION->GetException())) { throw new \Bitrix\Main\SystemException(oGetMessage('A_AM_NEW_IBLOCK_PROP_MESSAGE_ADDED_ERROR', array( '#NAME#' => $arProperty['NAME'], '#ERROR#' => $ex->GetString(), ))); } elseif (isset($ibp->LAST_ERROR)) { throw new \Bitrix\Main\SystemException(oGetMessage('A_AM_NEW_IBLOCK_PROP_MESSAGE_ADDED_ERROR', array( '#NAME#' => $arProperty['NAME'], '#ERROR#' => $ibp->LAST_ERROR, ))); } } } } $DB->Commit(); echo implode("<br>\n", $info); } catch (\Bitrix\Main\SystemException $e) { $DB->Rollback(); echo sprintf("%s<br>\n%s", $e->getMessage(), implode("<br>\n", $info) ); } // }}}
Список миграций доступен по тегу Миграции для 1С-Битрикс