Иногда не достаточно картинки анонса, детальной и нужно загружать на сайт больше фотографий к примеру в карточку товара, как правило это делается через множественное свойство с типом "файл" - 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);
}
}
?>

