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

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