Как известно в полях инфоблоков Битрикс хранятся различные настройки для элементов. В частности настройки изображения для анонса и детального изображения: возможность уменьшения изображения при добавлении его к элементу а также размеры до которых оно может быть уменьшено.
Все бы хорошо, но при экспорте инфоблока в формат XML, эти настройки не сохраняются в файле. Получается, что при импорте их нужно устанавливать вручную. Хорошо, если вы помните их значения и сможете внести их в настройки полей, но большинство их не запоминает. К тому же кто-то может просто не обратить на них внимание, понадеявшись, что они загрузятся из файла импорта. В итоге изображения на сайте выведутся некорректно.
Что же делать, чтобы эти настройки инфоблоков переносились при импорте XML-файла? Нужно написать обработчик события создания инфоблока. Это событие называется “OnAfterIBlockAdd”.
Данные о размерах изображения для анонса и детального изображения сохраним в отдельном файле в виде массива. Файл с настройками полей инфоблоков будет иметь следующий вид.
PHP
<?
return array(
"employees" => Array(
"IBLOCK_ID" => "2",
"IBLOCK_CODE" => "employees",
"NAME"=> "Команда",
"PREVIEW_PICTURE_WIDTH"=>"340",
"PREVIEW_PICTURE_HEIGHT"=>"340",
"DETAIL_PICTURE_WIDTH"=>"600",
"DETAIL_PICTURE_HEIGHT"=>"600",
)
);
?>
Здесь я привел описание одного инфоблока bitrix, в реальности этих элементов в массиве может быть много – вернее столько, сколько у вас инфоблоков.
Поясню, что означают элементы массива:
- IBLOCK_ID – ИД инфоблока;
- IBLOCK_CODE – символьный код инфоблока;
- NAME – название инфоблока;
- PREVIEW_PICTURE_WIDTH – максимальная ширина изображения для анонса;
- PREVIEW_PICTURE_HEIGHT – максимальная высота изображения для анонса;
- DETAIL_PICTURE_WIDTH – максимальная ширина детального изображения;
- DETAIL_PICTURE_HEIGHT - максимальная высота детального изображения;
В файле /bitrix/php_interface/init.php (или /local/php_interface/init.php) разместим код регистрации обработчика события “OnAfterIBlockAdd”.
PHP
AddEventHandler("iblock", "OnAfterIBlockAdd", Array("MyClass", "OnAfterIBlockAddHandler"));
Далее размещаем код самого обработчика события.
PHP
<?
class MyClass
{
// создаем обработчик события "OnAfterIBlockAdd"
function OnAfterIBlockAddHandler(&$arFields){
// подключим файл с массивом данных об инфоблоке
if(file_exists($_SERVER["DOCUMENT_ROOT"] . "/local/php_interface/include/sett_flds.php"))
$arSettFlds = include $_SERVER["DOCUMENT_ROOT"] . "/local/php_interface/include/sett_flds.php";
if($arFields["ID"] > 0 && array_key_exists($arFields["CODE"], $arSettFlds)){
if(CModule::IncludeModule('iblock')){
$arFlds = Array();
$curIBId = $arFields["ID"];
$arFlds = CIBlock::GetFields($curIBId);
if(!empty($arSettFlds[$arFields["CODE"]]["PREVIEW_PICTURE_WIDTH"]) || !empty($arSettFlds[$arFields["CODE"]]["PREVIEW_PICTURE_HEIGHT"])){
$arFlds["PREVIEW_PICTURE"]["DEFAULT_VALUE"]["SCALE"] = "Y";
$arFlds["PREVIEW_PICTURE"]["DEFAULT_VALUE"]["WIDTH"] = $arSettFlds[$arFields["CODE"]]["PREVIEW_PICTURE_WIDTH"];
$arFlds["PREVIEW_PICTURE"]["DEFAULT_VALUE"]["HEIGHT"] = $arSettFlds[$arFields["CODE"]]["PREVIEW_PICTURE_HEIGHT"];
}
if(!empty($arSettFlds[$arFields["CODE"]]["DETAIL_PICTURE_WIDTH"]) || !empty($arSettFlds[$arFields["CODE"]]["DETAIL_PICTURE_HEIGHT"])){
$arFlds["DETAIL_PICTURE"]["DEFAULT_VALUE"]["SCALE"] = "Y";
$arFlds["DETAIL_PICTURE"]["DEFAULT_VALUE"]["WIDTH"] = $arSettFlds[$arFields["CODE"]]["DETAIL_PICTURE_WIDTH"];
$arFlds["DETAIL_PICTURE"]["DEFAULT_VALUE"]["HEIGHT"] = $arSettFlds[$arFields["CODE"]]["DETAIL_PICTURE_HEIGHT"];
}
CIBlock::SetFields($curIBId, $arFlds);
}
else{
AddMessage2Log('Не установлен модуль «Информационные блоки» (iblock)');
}
}
else
AddMessage2Log("Ошибка добавления записи (".$arFields["RESULT_MESSAGE"].").");
}
}
?>
В нем мы сначала подключаем файл sett_flds.php, в котором хранятся настройки полей инфоблоков. Далее проверяем значение аргументов, которые переданы в обработчик события. В первую очередь нас интересует ID созданного инфоблока и существует ли массив с настройками этого инфоблока в нашем массиве настроек. Если эти условия выполнены, то далее подключаем модуль «Информационные блоки» (iblock) и получаем параметры только что созданного инфоблока. Сохраняем их в переменной $arFlds. Если в нашем массиве существуют настройки для этого инфоблока, мы помещаем их значения в соответствующие элементы массива $arFlds. Делаем это 2 раза – для изображения для анонса и для детального изображения. Далее сохраняем настройки инфоблока в строке с кодом CIBlock::SetFields($curIBId, $arFlds);
Вот таким несложным способом мы можем перенести значения настроек полей инфоблоков при импорте из XML файла с одного сайта на другой.