Здравствуйте форумчане, у меня возник такой вот вопрос по ресайзу фотографии перед сохранением элемента инфоблока. Задача стоит такая, есть инфоблок - "Фотоотчеты", ну и в элементах этого инфоблока я подгружаю свои фото отчеты. Фотографии в каждый элемент закачиваю через множественное свойство файл - "FOTOREPORTS" - символьный код свойства. Все работает хорошо но есть потребность в уменьшении размера фотографии при загрузке так как они могут быть размером в 7 мб. с разрешением 8000х4000 (к примеру). Погуглив я нашёл вот такой топик который как раз помогает мне решить мою проблему, но чего то не получается у меня его реализовать на своем сайте, вроде все делаю по инструкции. Различие между тем что описывается в данной статье и между моей сутиацей в том что в статье он работает с детальной новостью а я вывожу список новостей.
Ниже я представлю свой код которые я модифицировал под себя и если не сложно можно посмотреть в чем моя ошибка и ткнуть меня в неё носом)))
Код
<?
AddEventHandler("iblock", "OnAfterIBlockElementAdd", Array("VANES_class", "ResizeMORE_PHOTO"));
AddEventHandler("iblock", "OnAfterIBlockElementUpdate", Array("VANES_class", "ResizeMORE_PHOTO"));
class VANES_class {
function ResizeMORE_PHOTO(&$arFields) {
global $APPLICATION;
$IBLOCK_ID = array(3); //ID инфоблоков свойство которых нуждается в масштабировании (через запятую)
$PROPERTY_CODE = "FOTOREPORTS"; // код свойства
$imageMaxWidth = 1700; //Максимальная ширина картинки
$imageMaxHeight = 800; //Максимальная высота картинки
if(in_array(intval($arFields["IBLOCK_ID"]), $IBLOCK_ID)) {
$VALUES = array();
$VALUES_OLD = array();
//Получаем свойство значение сво-ва MOREPHOTO
$res = CIBlockElement::GetProperty($arFields["IBLOCK_ID"], $arFields["ID"], "sort", "asc", array("CODE" => "FOTOREPORTS"));
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) {
$ELEMENT_ID = $arFields["ID"]; // код элемента
$PROPERTY_VALUE = $VALUES; // значение свойства
// Установим новое значение для данного свойства данного элемента
CIBlockElement::SetPropertyValuesEx($ELEMENT_ID, $arFields["IBLOCK_ID"], array($PROPERTY_CODE => $PROPERTY_VALUE));
// Удаляем старые большие изображения
foreach ($VALUES_OLD as $key=>$val) {
CFile::Delete($val);
}
}
}
}
}
?>
Далее в /bitrix/templates/asside/components/bitrix/news/fotoreports/bitrix/news.list/.default/ здесь создаем файл result_modifier.php и вписываем туда этот код - вместо $arResult у меня $arItem так как я работаю со списком новостей.
здесь можно просто $IBLOCK_ID = 3; если у вас только из одного инфоблока берутся данные. CIBlockElement::GetProperty - здесь рекомендуют в последнем параметре, где вы пишете какие поля хотите достать, еще указывать ID, потому что так написано в документации и для пользовательских свойств - в вашем случае нужно писать PROPERTY_VALUE_ID (это например)
вот отрывок из документации:
Код
Возвращается объект CDBResult, содержащий поля свойств и поля со значениями:
PROPERTY_VALUE_ID - код значения свойства,
VALUE - значение свойства,
DESCRIPTION - описание значения свойства,
VALUE_ENUM - код значения свойства типа "список",
VALUE_XML_ID - внешний код значения свойства типа "список".
Вы предложили решение, при котором все загружаемые на сайт изображения будут уменьшаться, независимо от инфоблока, свойства и т.д. Думаю, это не очень корректно.
Матвеев прижал руки к груди, поднял плечи, согнулся и побежал. (Д. Хармс про Битрикс)
Вы предложили решение, при котором все загружаемые на сайт изображения будут уменьшаться, независимо от инфоблока, свойства и т.д. Думаю, это не очень корректно.
Используйте событие
Цитата
по ресайзу фотографии перед сохранением элемента инфоблока
Всем привет. Сделал ресайз по методу из 1 поста, но не сохраняется теперь описание для фотографий, подскажите что добавить что бы описание каждой фотографии тоже сохранялось?