Для клиента недавно решил интересную задачу: нужно было сделать так, чтобы при загрузке изображений в элементы или разделы инфоблока, производилось их пропорциональное уменьшение (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.