Блог специалистов
21.01.2016

Автоматический ресайз изображений во множественном свойстве типа файл в Битрикс

Разрабатывая сайт с хотя бы одним модулем, будь то новости, каталог, награды, документы и т.п. зачастую возникает необходимость прикрепления нескольких изображений через свойство типа "Файл". Но и тут же возникает главный вопрос: как уменьшать (ресайзить) загружаемые изображения?! Конечно, никому не хочется заморачиваться перед загрузкой обработкой изображений, а тем более менеджеру, который загружен еще дополнительной работой. На помощь нам приходит "чудо-код" обработки событий, который размещается /bitrix/php_interface/init.php.

Для создания ресайза изображений в наш init.php вставляем следующий код, где нужно указать свой инфоблок, название свойства типа "файл" и размеры изображений. Если у Вас уже есть что-то в init.php, то просто добавьте данный код под все имеющееся в файле перед закрывающей скобкой ?>, скопировав код уже без скобок <? ?>.

Теперь при загрузке новых фото, они будут автоматически уменьшены. А если у вас уже есть элементы с размещенными не отресайзенными фото, то вам нужно открыть эти элементы и просто еще раз нажать кнопку "сохранить", фото в них тоже обработаются заново. Если у фотографий есть поле для описания, то нужно использовать обработчик данный ниже этого, т.к. этот их не поддерживает <? // События которые срабатывают при создании или изменении элемента инфоблока 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); } } ?> Если требуется задать данное событие для нескольких инфоблоков, то меняем строку: if($arFields["IBLOCK_ID"] == $IBLOCK_ID) { на if(($arFields["IBLOCK_ID"] == 1) || ($arFields["IBLOCK_ID"] == 2)) { Если у множественного свойства типа "Файл" добавлено Описание, т.е. стоит галочка "Выводить поле для описания значения", то используем этот код: <? // События которые срабатывают при создании или изменении элемента инфоблока 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[] = array("VALUE" => CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"].$file["src"]), "DESCRIPTION" => $ob['DESCRIPTION']); } else { // добавляем в массив VALUES старую картинку $VALUES[] = array("VALUE" => CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"].$file_path), "DESCRIPTION" => $ob['DESCRIPTION']); } // Собираем в массив 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); } } ?> Чтобы было легче понять в чем отличие этого кода от того, что выше, то у данного в массив добавляется значение Описания в этом месте: // добавляем в массив VALUES новую уменьшенную картинку $VALUES[] = array("VALUE" => CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"].$file["src"]), "DESCRIPTION" => $ob['DESCRIPTION']); } else { // добавляем в массив VALUES старую картинку $VALUES[] = array("VALUE" => CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"].$file_path), "DESCRIPTION" => $ob['DESCRIPTION']); }

Количество показов: 8710




Возврат к списку