Иногда не достаточно картинки анонса, детальной и нужно загружать на сайт больше фотографий к примеру в карточку товара, как правило это делается через множественное свойство с типом "файл" - MORE_PHOTO.
Всё неудобство в том, что нельзя автоматом настроить ресайз этих фотографий при добавлении, а клиенты незнающие этих тонкостей начинают грузить на сайт фотки с разрешением 6000х4000 пикселей и выше, и однажды наступает момент, что сайт перестаёт работать от переполнения ограниченного пространства на хостинге.
Чтобы уменьшить фотки и нанести на них watermark - используем простенький обработчик в файл:
/bitrix/php_interface/init.php
Ресайз MORE_PHOTO
<? // ##### Ресайз MORE_PHOTO ###### AddEventHandler("iblock", "OnAfterIBlockElementAdd", Array("MorePhotoResizeClass", "OnAfterIBlockElement")); AddEventHandler("iblock", "OnAfterIBlockElementUpdate", Array("MorePhotoResizeClass", "OnAfterIBlockElement")); class MorePhotoResizeClass { function Clear() { $_WFILE = glob($_SERVER['DOCUMENT_ROOT']."/upload/tmp/*"); foreach($_WFILE as $_file) unlink($_file); return true; } function OnAfterIBlockElement(&$arFields) { global $APPLICATION, $USER; $PROPERTY_CODE = "MORE_PHOTO"; // код свойства с которым работаем $imageMaxWidth = 600; // Максимальная ширина уменьшенной картинки $imageMaxHeight = 600; // Максимальная высота уменьшенной картинки // Находим свойство $dbRes = CIBlockElement::GetProperty($arFields["IBLOCK_ID"], $arFields["ID"], "sort", "asc", array("CODE" => $PROPERTY_CODE)); while ($arMorePhoto = $dbRes->GetNext(true, false)) { if ($arMorePhoto["PROPERTY_TYPE"] == "F" && $arMorePhoto["MULTIPLE"] == "Y") { // находим подробные сведения о файле $arFile = CFile::GetFileArray($arMorePhoto["VALUE"]); // проверяем, что файл является картинкой if (!CFile::IsImage($arFile["FILE_NAME"])) { continue; } // Если размер больше допустимого if ($arFile["WIDTH"] > $imageMaxWidth || $arFile["HEIGHT"] > $imageMaxHeight) { // Временная картинка $tmpFilePath = $_SERVER['DOCUMENT_ROOT']."/upload/tmp/".$arFile["FILE_NAME"]; // Уменьшаем картинку $resizeRez = CFile::ResizeImageFile( // уменьшение картинки для превью $source = $_SERVER['DOCUMENT_ROOT'].$arFile["SRC"], $dest = $tmpFilePath, array( 'width' => $imageMaxWidth, 'height' => $imageMaxHeight, ), $resizeType = BX_RESIZE_IMAGE_PROPORTIONAL, // метод ресайза $jpgQuality = 95 // качество уменьшенной картинки в процентах // Настройки водяного знака если "$waterMark = array()," водяной знак (пустой) $waterMark = array( "name" => "watermark", "position" => "center", "type" => "image", "size" => "big", "file" => $_SERVER["DOCUMENT_ROOT"].'/upload/watermark.png' // файл водяного знака ), ); // Записываем изменение в свойство if ($resizeRez) { $arNewFile = CFile::MakeFileArray($tmpFilePath); CIBlockElement::SetPropertyValueCode($arFields["ID"], $PROPERTY_CODE, array($arMorePhoto["PROPERTY_VALUE_ID"] => array( "VALUE" => $arNewFile, "DESCRIPTION"=> $arMorePhoto["DESCRIPTION"], )) ); // Стираем временные файлы MorePhotoResizeClass::Clear(); } } } } } } // ##### Конец-кода Ресайз MORE_PHOTO ###### ?>
Ещё способ
<? // События которые срабатывают при создании или изменении элемента инфоблока AddEventHandler("iblock", "OnAfterIBlockElementAdd", "ResizeUploadedPhoto"); AddEventHandler("iblock", "OnAfterIBlockElementUpdate", "ResizeUploadedPhoto"); function ResizeUploadedPhoto($arFields) { global $APPLICATION; CModule::IncludeModule('iblock'); $IBLOCK_ID = 6; // ID инфоблока свойство которых нуждается в масштабировании $PROPERTY_CODE = "FOTO"; // код свойства $imageMaxWidth = 1000; // Максимальная ширина картинки $imageMaxHeight = 800; // Максимальная высота картинки // для начала убедимся, что изменяется элемент нужного нам инфоблока if($arFields["IBLOCK_ID"] == $IBLOCK_ID) { $VALUES = $VALUES_OLD = array(); //Получаем свойство значение сво-ва $PROPERTY_CODE $res = CIBlockElement::GetProperty($arFields["IBLOCK_ID"], $arFields["ID"], "sort", "asc", array("CODE" => $PROPERTY_CODE)); while ($ob = $res->GetNext()) { $file_path = CFile::GetPath($ob['VALUE']); // Получаем путь к файлу if($file_path) { $imsize = getimagesize($_SERVER["DOCUMENT_ROOT"].$file_path); //Узнаём размер файла // Если размер больше установленного максимума if($imsize[0] > $imageMaxWidth or $imsize[1] > $imageMaxHeight) { // Уменьшаем размер картинки $file = CFile::ResizeImageGet($ob['VALUE'], array( 'width'=>$imageMaxWidth, 'height'=>$imageMaxHeight ), BX_RESIZE_IMAGE_PROPORTIONAL, true); // добавляем в массив VALUES новую уменьшенную картинку $VALUES[] = CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"].$file["src"]); } else { // добавляем в массив VALUES старую картинку $VALUES[] = CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"].$file_path); } // Собираем в массив ID старых файлов для их удаления (чтобы не занимали место) $VALUES_OLD[] = $ob['VALUE']; } } // Если в массиве есть информация о новых файлах if(count($VALUES) > 0) { $PROPERTY_VALUE = $VALUES; // значение свойства // Установим новое значение для данного свойства данного элемента CIBlockElement::SetPropertyValuesEx($arFields["ID"], $arFields["IBLOCK_ID"], array($PROPERTY_CODE => $PROPERTY_VALUE)); // Удаляем старые большие изображения foreach ($VALUES_OLD as $key=>$val) { CFile::Delete($val); } } unset($VALUES); unset($VALUES_OLD); } } ?>