Привет!
Хочу предложить небольшой инструмент для упрощения задачи настройки и генерации информационных блоков в системе.
Речь пойдет о импорте метаданных с ранее созданного информационного блока при генерации нового.[spoiler]

Коротко о скрипте.
Настройка копирования метаданных задается тремя полями
- Копируем ИБ:
- Копируем в новый ИБ свойства другого ИБ:
- Копируем ИБ в тип:
Поле "Копируем ИБ:" обязательно для заполнения и всегда предустановлено.
В данной секции мы указываем с какого ИБ мы будем импортировать все метаданные за исключением описания свойств.
Поле "Копируем в новый ИБ свойства другого ИБ:" не обязательное, может быть указано для импорта в новый информационный блок только метаданных свойств любого ИБ. В случае если поле не заполнено, метаданные свойств берутся от ИБ указанного в поле "Копируем ИБ:"
Поле "Копируем ИБ в тип:" не обязательное и может быть указано в случае если новый информационный блок необходимо сгенерировать в каком либо типе ИБ. Если настройка не указана, тип импортируется от ИБ указанного в поле "Копируем ИБ:"
В случае успешного завершения к имени нового сгенерированного информационного блока добавится суффикс "_new"
Как видите ни чего сложного, но данный скрипт может оказать неоценимую помощь например при копировании ИБ в котором большую часть занимают списочные свойства или вообще большое количество свойств требующих детальной настройки, не прибегая к использованию механизмов XML экспорта и XML импорта информационных блоков.
Хочу предложить небольшой инструмент для упрощения задачи настройки и генерации информационных блоков в системе.
Речь пойдет о импорте метаданных с ранее созданного информационного блока при генерации нового.[spoiler]

Коротко о скрипте.
Настройка копирования метаданных задается тремя полями
- Копируем ИБ:
- Копируем в новый ИБ свойства другого ИБ:
- Копируем ИБ в тип:
Поле "Копируем ИБ:" обязательно для заполнения и всегда предустановлено.
В данной секции мы указываем с какого ИБ мы будем импортировать все метаданные за исключением описания свойств.
Поле "Копируем в новый ИБ свойства другого ИБ:" не обязательное, может быть указано для импорта в новый информационный блок только метаданных свойств любого ИБ. В случае если поле не заполнено, метаданные свойств берутся от ИБ указанного в поле "Копируем ИБ:"
Поле "Копируем ИБ в тип:" не обязательное и может быть указано в случае если новый информационный блок необходимо сгенерировать в каком либо типе ИБ. Если настройка не указана, тип импортируется от ИБ указанного в поле "Копируем ИБ:"
В случае успешного завершения к имени нового сгенерированного информационного блока добавится суффикс "_new"
CModule::IncludeModule("iblock"); if(intval($_REQUEST["IBLOCK_ID_FIELDS"])>0){ $bError = false; $IBLOCK_ID = intval($_REQUEST["IBLOCK_ID_FIELDS"]); $ib = new CIBlock; $arFields = CIBlock::GetArrayByID($IBLOCK_ID); $arFields["GROUP_ID"] = CIBlock::GetGroupPermissions($IBLOCK_ID); $arFields["NAME"] = $arFields["NAME"]."_new"; unset($arFields["ID"]); if($_REQUEST["IBLOCK_TYPE_ID"]!="empty") $arFields["IBLOCK_TYPE_ID"]=$_REQUEST["IBLOCK_TYPE_ID"]; $ID = $ib->Add($arFields); if(intval($ID)<=0) $bError = true; if($_REQUEST["IBLOCK_ID_PROPS"]!="empty") $iblock_prop=intval($_REQUEST["IBLOCK_ID_PROPS"]); else $iblock_prop=$IBLOCK_ID; $iblock_prop_new = $ID; $ibp = new CIBlockProperty; $properties = CIBlockProperty::GetList(Array("sort"=>"asc", "name"=>"asc"), Array("ACTIVE"=>"Y", "IBLOCK_ID"=>$iblock_prop)); while ($prop_fields = $properties->GetNext()){ if($prop_fields["PROPERTY_TYPE"] == "L"){ $property_enums = CIBlockPropertyEnum::GetList(Array("DEF"=>"DESC", "SORT"=>"ASC"), Array("IBLOCK_ID"=>$iblock_prop, "CODE"=>$prop_fields["CODE"])); while($enum_fields = $property_enums->GetNext()){ $prop_fields["VALUES"][] = Array( "VALUE" => $enum_fields["VALUE"], "DEF" => $enum_fields["DEF"], "SORT" => $enum_fields["SORT"] ); } } $prop_fields["IBLOCK_ID"]=$iblock_prop_new; unset($prop_fields["ID"]); foreach($prop_fields as $k=>$v){ if(!is_array($v))$prop_fields[$k]=trim($v); if($k{0}=='~') unset($prop_fields[$k]); } $PropID = $ibp->Add($prop_fields); if(intval($PropID)<=0) $bError = true; } if(!$bError && $IBLOCK_ID>0) LocalRedirect($APPLICATION->GetCurPageParam("success=Y",array("success","IBLOCK_ID_FIELDS"))); else LocalRedirect($APPLICATION->GetCurPageParam("error=Y",array("success","IBLOCK_ID_FIELDS"))); } $str .='<form action='.$APPLICATION->GetCurPageParam().' method="post"><table>'; if($_REQUEST["success"]=="Y") $str .='<tr><td colspan="2"><font color="green">ИБ успешно скопирован</font><br/></td></tr>'; elseif($_REQUEST["error"]=="Y") $str .='<tr><td colspan="2"><font color="red">Произошла ошибка</font><br/></td></tr>'; $str .='<tr><td colspan="2"><b>Копируем мета данные ИБ в новый ИБ</b><br/></td></tr>'; $res = CIBlock::GetList(Array(),Array(),true); while($ar_res = $res->Fetch()) $arRes[]=$ar_res; $str .='<tr><td>Копируем ИБ:<br><select name="IBLOCK_ID_FIELDS">'; foreach($arRes as $vRes) $str .= '<option value='.$vRes['ID'].'>'.$vRes['NAME'].' ['.$vRes["ID"].']</option>'; $str .='</select></td>'; $str .='<td>Копируем в новый ИБ свойства другого ИБ: *<br><select name="IBLOCK_ID_PROPS">'; $str .='<option value="empty">'; foreach($arRes as $vRes) $str .= '<option value='.$vRes['ID'].'>'.$vRes['NAME'].' ['.$vRes["ID"].']</option>'; $str .='</select></td></tr>'; $str .='<tr><td colspan="2">Копируем ИБ в тип:<br><select name="IBLOCK_TYPE_ID">'; $str .='<option value="empty">'; $db_iblock_type = CIBlockType::GetList(); while($ar_iblock_type = $db_iblock_type->Fetch()){ if($arIBType = CIBlockType::GetByIDLang($ar_iblock_type["ID"], LANG)) $str .= '<option value='.$ar_iblock_type["ID"].'>'.htmlspecialcharsex($arIBType["NAME"])."</option>"; } $str .='</select></td></tr>'; $str .='<tr><td colspan="2"><br/>* если значение не указано мета данные ИБ секции "Свойства" берутся из ИБ первого поля</td></tr>'; $str .='<tr><td colspan="2"><input type="submit" value="копируем"></td></tr>'; $str .='</table></form>'; echo $str; |