-
Vadim TsukanovРазработчик
-
Дата публикации13.10.2019
-
Категория1С-Битрикс
Довольно часто необходимо создать копию инфоблока и его формы редактирования. Для решения первой задачи есть специальные модули на маркетплейсе, а вот что делать с формами редактирования?
Необходимо сделать полную копию инфоблока, со всем содержимым и формой админ панели.
1. Копируем инфоблок
Можно воспользоваться стандартным импортом/экспортом с заменой ID. Однако данный путь довольно долог, особенно,когда необходимо по очереди все инфоблоки копировать, поэтому предлагаю воспользоваться модулем «Модуль быстрое копирование инфоблоков со свойствами» от nBrains. Модуль ведет себе корректно и без ошибок.
2. Копируем форму редактирования в админ панели
Как оказалось, простое копирование настроек в БД не даст ничего, так как ID свойств инфоблока будут разным даже при копировании, из-за чего и возникают проблемы. Я написал небольшую шпаргалку для этого момента. Т.к. делали сайт с довольно большим количеством св-в, и делать каждый раз новые формы — очень долго.
Создаем файлик, кидаем туда код, меняем переменные $iblock_from и $iblock_to и все!
Могут быть проблемы, если уже в БД есть настройки этой формы, для этого — надо их убить через БД (таблица b_user_option, где name = form_element_26) и запустить скрипт снова.
<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
CModule::IncludeModule("iblock");
//Форму какого инфоблока копируем и в какой. У меня из 4 в 26
$iblock_from = 4;
$iblock_to = 26;
//Получаем все св-ва инфоблоков
$res = CIBlock::GetProperties($iblock_from);
while($res_arr = $res->Fetch()){
$iblock_from_properties[] = $res_arr;
}
$res = CIBlock::GetProperties($iblock_to);
while($res_arr = $res->Fetch()){
$iblock_to_properties[] = $res_arr;
}
//Делаем массивы с соответствием св-в для замены
foreach ($iblock_from_properties as $key => $iblock_property) {
$arSearch[]='PROPERTY_'.$iblock_property['ID'];
$res = CIBlock::GetProperties($iblock_to, Array(), Array("CODE"=>$iblock_property['CODE']));
while($res_arr = $res->Fetch()){
$arReplace[] = 'PROPERTY_'.$res_arr['ID'];
}
}
//
//получаем табы формы из копируемого инфоблока
$tabs = CAdminFormSettings::getTabsArray('form_element_'.$iblock_from);
//У полученного массива меняем ID PROPERTY, чтобы все нормально работало.
$str_tabs = json_encode($tabs);
$new_tabs = str_replace($arSearch,$arReplace,$str_tabs);
$arTabs = json_decode($new_tabs,true);
//Применяем настройки инфоблока
CAdminFormSettings::setTabsArray('form_element_'.$iblock_to, $arTabs, $common = true, $userID);
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");
?>
Если нашли вариант улучшить скрипт — буду только рад. Пишите — обсудим.