Ресайз изображений через обработчик событий Битрикс

Для клиента недавно решил интересную задачу: нужно было сделать так, чтобы при загрузке  изображений в элементы или разделы инфоблока, производилось их пропорциональное уменьшение (resize), если длина или ширина изображения превышает заданное значение.

За основу была взята Битриксовая функция ресайза CIBlock::ResizePicture

Собственно код:

<?
//элементы инфоблока:
AddEventHandler("iblock", "OnBeforeIBlockElementUpdate", Array("AngerroResizeClass", "OnBeforeIBlockElementEventHandler"));
AddEventHandler("iblock", "OnBeforeIBlockElementAdd", Array("AngerroResizeClass", "OnBeforeIBlockElementEventHandler")); 
//разделы инфоблока:
AddEventHandler("iblock", "OnBeforeIBlockSectionUpdate", Array("AngerroResizeClass", "OnBeforeIBlockSectionEventHandler"));
AddEventHandler("iblock", "OnBeforeIBlockSectionAdd", Array("AngerroResizeClass", "OnBeforeIBlockSectionEventHandler")); 
class AngerroResizeClass {
//обработчик для разделов
function OnBeforeIBlockSectionEventHandler(&$arFields){
//Максимальные значения длины и ширины картинки
$PictureMaxWidth = 800;
$PictureMaxHeight = 800;
//Каталог
if ($arFields["IBLOCK_ID"] == 3){
//изображение
if ($arFields['PICTURE']['tmp_name']){
//изменяем размеры картинки:
$arNewFile = CIBlock::ResizePicture($arFields['PICTURE'], array(
"WIDTH" => $PictureMaxWidth,
"HEIGHT" => $PictureMaxHeight,
"METHOD" => "resample",
));
$arFields['PICTURE'] = $arNewFile;
}
}
}
//обработчик для элементов инфоблока
function OnBeforeIBlockElementEventHandler(&$arFields){
//Максимальные значения длины и ширины картинки
$PictureMaxWidth = 800;
$PictureMaxHeight = 800;
//Каталог
if ($arFields["IBLOCK_ID"] == 3){
//картинка для анонса
if ($arFields['PREVIEW_PICTURE']['tmp_name']){
//изменяем размеры картинки:
$arNewFile = CIBlock::ResizePicture($arFields['PREVIEW_PICTURE'], array(
"WIDTH" => $PictureMaxWidth,
"HEIGHT" => $PictureMaxHeight,
"METHOD" => "resample",
));
$arFields['PREVIEW_PICTURE'] = $arNewFile;
}
//детальная картинка
if ($arFields['DETAIL_PICTURE']['tmp_name']){
//изменяем размеры картинки:
$arNewFile = CIBlock::ResizePicture($arFields['DETAIL_PICTURE'], array(
"WIDTH" => $PictureMaxWidth,
"HEIGHT" => $PictureMaxHeight,
"METHOD" => "resample",
));
$arFields['DETAIL_PICTURE'] = $arNewFile;
}
//свойство "Дополнительные фото""
$prop_id_photo = 12;
foreach ($arFields["PROPERTY_VALUES"][$prop_id_photo] as $key=>$moreimg){
if ($arFields["PROPERTY_VALUES"][$prop_id_photo][$key]['VALUE']['tmp_name']){
//изменяем размеры картинки:
$arNewFile = CIBlock::ResizePicture($arFields["PROPERTY_VALUES"][$prop_id_photo][$key]['VALUE'], array(
"WIDTH" => $PictureMaxWidth,
"HEIGHT" => $PictureMaxHeight,
"METHOD" => "resample",
));
$arFields["PROPERTY_VALUES"][$prop_id_photo][$key]['VALUE'] = $arNewFile;
}
}
}
}
}
?>

В данном листинге используются обработчики событий для разделов и элементов инфоблока. Подключаем этот код в init.php.

Profit.

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *