Скрипты миграций для 1С-Битрикс. Добавление: типа инфоблока, инфоблока, свойств инфоблока
//<?php
/**
* Описываем свойства нового типа инфоблока
*/
$arFieldsIblockType = Array(
'ID' => 'banners',
'SECTIONS' => 'N',
'IN_RSS' => 'N',
'SORT' => 900,
'LANG' => array(
'ru' => array(
'NAME' => 'Баннеры 2.0',
'SECTION_NAME' => 'Баннеры',
'ELEMENT_NAME' => 'Баннеры',
),
'en' => array(
'NAME' => 'Banners',
'SECTION_NAME' => 'Banners',
'ELEMENT_NAME' => 'Banners'
),
)
);
/**
* Описываем свойства нового инфоблока
*/
$arFieldsIblock = array(
'VERSION' => 2,
'ACTIVE' => 'Y',
'NAME' => 'Баннеры 2.0',
'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' => '',
'VALUE' => 'ON_MAIN_PAGE',
'DEF' => 'N',
'SORT' => 100,
),
array(
'XML_ID' => '',
'VALUE' => 'ON_INDEX_WOMAN',
'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)
);
}
// }}}