Здравствуйте форумчане, у меня возник такой вот вопрос по ресайзу фотографии перед сохранением элемента инфоблока.
Задача стоит такая, есть инфоблок - "Фотоотчеты", ну и в элементах этого инфоблока я подгружаю свои фото отчеты. Фотографии в каждый элемент закачиваю через множественное свойство файл - "FOTOREPORTS" - символьный код свойства. Все работает хорошо но есть потребность в уменьшении размера фотографии при загрузке так как они могут быть размером в 7 мб. с разрешением 8000х4000 (к примеру).
Погуглив я нашёл вот такой топик который как раз помогает мне решить мою проблему, но чего то не получается у меня его реализовать на своем сайте, вроде все делаю по инструкции.
Различие между тем что описывается в данной статье и между моей сутиацей в том что в статье он работает с детальной новостью а я вывожу список новостей.
Ну вот в целом все, вот ссылка на исходную статью откуда я взял материал
Ниже я представлю свой код которые я модифицировал под себя и если не сложно можно посмотреть в чем моя ошибка и ткнуть меня в неё носом)))
Далее в /bitrix/templates/asside/components/bitrix/news/fotoreports/ bitrix/news.list/.default/ здесь создаем файл result_modifier.php и вписываем туда этот код - вместо $arResult у меня $arItem так как я работаю со списком новостей.
вот код с помощью которого я вывожу данные
И ещё раз ссылка на статью откуда я взял материал
Задача стоит такая, есть инфоблок - "Фотоотчеты", ну и в элементах этого инфоблока я подгружаю свои фото отчеты. Фотографии в каждый элемент закачиваю через множественное свойство файл - "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/
| Код |
|---|
<?
$arResult["MORE_PHOTO"] = array();
if(isset($arResult["PROPERTIES"]["MORE_PHOTO"]["VALUE"]) && is_array($arResult["PROPERTIES"]["MORE_PHOTO"]["VALUE"]))
{
foreach($arResult["PROPERTIES"]["MORE_PHOTO"]["VALUE"] as $FILE)
{
$FILE = CFile::GetFileArray($FILE);
if(is_array($FILE))
$arResult["MORE_PHOTO"][]=$FILE;
}
}
?>
|
вот код с помощью которого я вывожу данные
| Код |
|---|
<? foreach ($arItem["PROPERTIES"]["FOTOREPORTS"]["VALUE"] as $key => $value):?>
<? $foto = CFile::GetPath($value);
if ($key >= 1) { ?>
<a href="<?=$foto?>" rel="fancybox_<?=$datetime["YYYY"]?>_<?=$datetime["MM"]?>" class="display fancybox"></a>
<? }
else {?>
<a href="<?=$foto?>" rel="fancybox_<?=$datetime["YYYY"]?>_<?=$datetime["MM"]?>" class="display fancybox">
<?if($arParams["DISPLAY_DATE"]!="N" && $arItem["DISPLAY_ACTIVE_FROM"]):?>
<p><? echo ToLower(FormatDate("f", MakeTimeStamp($arItem['DISPLAY_ACTIVE_FROM'])));?></p>
<?endif?>
<img src="<?=$foto?>" class="img-responsive"/></a>
<? } ?>
<? endforeach ?>
|
и для пользовательских свойств - в вашем случае нужно писать PROPERTY_VALUE_ID (это например)