Очень удобно дополнительные картинки товара загружать в множественное свойство с типом "файл" - MORE_PHOTO.
Но есть одно неудобство - нельзя штатными средствами настроить автоматический ресайз этих фотографий при добавлении. Так, клиент может грузить на сайт фотки с разрешением 4000х3000 пикселей, и дисковое пространство будет неоправданно забиваться.
Чтобы уменьшить фотки - можно использовать такой обработчик:
/bitrix/php_interface/init.php
Данный скрипт можно применить как на новом сайте, так и на уже существующем (например, если у товара уже были загружены большие фотки, то если зайти на страницу редактирования этого товара и нажать "сохранить" то фотки автоматом уменьшатся). При этом старый файл с диска удалится (перезапишется на новый).
Кроме того, данный способ сохраняет свойство description если оно было задано у картинок.
Но есть одно неудобство - нельзя штатными средствами настроить автоматический ресайз этих фотографий при добавлении. Так, клиент может грузить на сайт фотки с разрешением 4000х3000 пикселей, и дисковое пространство будет неоправданно забиваться.
Чтобы уменьшить фотки - можно использовать такой обработчик:
/bitrix/php_interface/init.php
AddEventHandler("iblock", "OnAfterIBlockElementAdd", Array("MyResizeClass", "OnAfterIBlockElement"));
AddEventHandler("iblock", "OnAfterIBlockElementUpdate", Array("MyResizeClass", "OnAfterIBlockElement"));
class MyResizeClass
{
function OnAfterIBlockElement(&$arFields)
{
global $APPLICATION, $USER;
$PROPERTY_CODE = "MORE_PHOTO"; // код свойства
$imageMaxWidth = 1024; // Максимальная ширина уменьшенной картинки
$imageMaxHeight = 768; // Максимальная высота уменьшенной картинки
// Находим свойство
$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, // метод ресайза
$waterMark = array(), // водяной знак (пустой)
$jpgQuality = 95 // качество уменьшенной картинки в процентах
);
// Записываем изменение в свойство
if ($resizeRez)
{
$arNewFile = CFile::MakeFileArray($tmpFilePath);
CIBlockElement::SetPropertyValueCode($arFields["ID"], $PROPERTY_CODE,
array($arMorePhoto["PROPERTY_VALUE_ID"] => array(
"VALUE" => $arNewFile,
"DESCRIPTION"=> $arMorePhoto["DESCRIPTION"]
))
);
// Удалим временный файл
unlink($tmpFilePath);
}
}
}
}
}
}
|
Данный скрипт можно применить как на новом сайте, так и на уже существующем (например, если у товара уже были загружены большие фотки, то если зайти на страницу редактирования этого товара и нажать "сохранить" то фотки автоматом уменьшатся). При этом старый файл с диска удалится (перезапишется на новый).
Кроме того, данный способ сохраняет свойство description если оно было задано у картинок.
