Битрикс. Уменьшение изображений в свойстве инфоблока "Файл"

Битрикс. Уменьшение изображений в свойстве инфоблока "Файл"
Блог
18.02.2019 13:41:00

Так как Битрикс сжимает изображения только в анонсовой и детальной фотографии, а фото добавленные в инфоблок через свойства типа "Файл" нет, то сайт начинает разрастаться. В данной статье мы рассмотрим как сжимать изображения в свойствах типа "Файл".

Что мы будем делать? Создадим собственную функцию, в которой будем перехватывать событие после добавление элемента в инфоблок и событие после его изменения.

На авторство данного скрипта не претендую, нашел где-то в интернете и внес изменения под свои задачи. 

В файле /local/php_interface/init.php добавляем следующий код.


1) Создаем функцию обработки изображения. 

Ее логика в следующем. 

Сначала мы определяем элемент какого инфоблока был добавлен(изменен), и если он соответствует нужному нам инфоблоку, то указываем как называется свойство типа "Файл" и до каких размеров надо уменьшить изображение. 

А если инфоблок другой (не тот что мы указывали), то присвоим переменной значение равное 0.

Удобно использовать конструкцию switch, так как может у нас много инфоблоков с изображениями для уменьшения.

switch ($arFields["IBLOCK_ID"]){
//Если ID инфоблока равен 15
        case 15:
            $IBLOCK_ID = 15; //Переменная содержит идентификатор инфоблока
            $PROPERTY_CODE = "ATTR_FOTOMORE"; //Переменная содержит символьный код свойства типа "Файл", в котором будут наши изображения для уменьшения.
            $MaxWidth = 1920; //Переменная содержит максимальную ширину изображения
            $MaxHeight = 1080; //Переменная содержит максимальную высоту изображения
            break;

//Если ID инфоблока равен 15
        case 18:
            $IBLOCK_ID = 18;
            $PROPERTY_CODE = "ATTR_FILES";
            $MaxWidth = 1920;
            $MaxHeight = 1080;
            break;
			
//Если ID инфоблока не равен выше указанным значениям, значит этот инфоблок нам не нужен
        default:
            $IBLOCK_ID = 0;//то присвоим переменной 0
    }

Почему 0? Потому что Идентификаторы всегда больше 0.

И дальше проверяем.

Если 0, то пропускает (инфоблок не нужен), если не 0 (инфоблок нужен), то уменьшает фото

if($IBLOCK_ID !== 0) {
        $new_files  = array();
        $old_files = array();

        $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) {
                $file_size = getimagesize($_SERVER["DOCUMENT_ROOT"].$file_path);

                if (($file_size[0] > $MaxWidth) || ($file_size[1] > $MaxHeight)) {
                    $file = CFile::ResizeImageGet($ob['VALUE'], array(
                        'width'=>$MaxWidth,
                        'height'=>$MaxHeight
                    ), BX_RESIZE_IMAGE_PROPORTIONAL_ALT, true);

                    $new_files[] = array(
                        "VALUE" => CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"].$file["src"]),
                        "DESCRIPTION" => $ob['DESCRIPTION']);
                } else {

                    $new_files[] = array(
                        "VALUE" => CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"].$file_path),
                        "DESCRIPTION" => $ob['DESCRIPTION']);
                }

                $old_files[] = $ob['VALUE'];
            }
        }

        if(count($new_files) > 0) {
            $PROPERTY_VALUE = $new_files;
            CIBlockElement::SetPropertyValuesEx($arFields["ID"], $arFields["IBLOCK_ID"], array($PROPERTY_CODE => $PROPERTY_VALUE));

            foreach ($old_files as $key=>$val) {
                CFile::Delete($val);
            }
        }
        unset($new_files);
        unset($old_files);
    }

В итоге у нас получился код 

function resizePropertyFilePhoto($arFields){
    global $APPLICATION;
    CModule::IncludeModule('iblock');

    switch ($arFields["IBLOCK_ID"]){
        case 15:
            $IBLOCK_ID = 15;
            $PROPERTY_CODE = "ATTR_FOTOMORE";
            $MaxWidth = 1920;
            $MaxHeight = 1080;
            break;

        case 18:
            $IBLOCK_ID = 18;
            $PROPERTY_CODE = "ATTR_FILES";
            $MaxWidth = 1920;
            $MaxHeight = 1080;
            break;
        default:
            $IBLOCK_ID = 0;
    }



    if($IBLOCK_ID !== 0) {
        $new_files  = array();
        $old_files = array();

        $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) {
                $file_size = getimagesize($_SERVER["DOCUMENT_ROOT"].$file_path);

                if (($file_size[0] > $MaxWidth) || ($file_size[1] > $MaxHeight)) {
                    $file = CFile::ResizeImageGet($ob['VALUE'], array(
                        'width'=>$MaxWidth,
                        'height'=>$MaxHeight
                    ), BX_RESIZE_IMAGE_PROPORTIONAL_ALT, true);

                    $new_files[] = array(
                        "VALUE" => CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"].$file["src"]),
                        "DESCRIPTION" => $ob['DESCRIPTION']);
                } else {

                    $new_files[] = array(
                        "VALUE" => CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"].$file_path),
                        "DESCRIPTION" => $ob['DESCRIPTION']);
                }

                $old_files[] = $ob['VALUE'];
            }
        }

        if(count($new_files) > 0) {
            $PROPERTY_VALUE = $new_files;
            CIBlockElement::SetPropertyValuesEx($arFields["ID"], $arFields["IBLOCK_ID"], array($PROPERTY_CODE => $PROPERTY_VALUE));

            foreach ($old_files as $key=>$val) {
                CFile::Delete($val);
            }
        }
        unset($new_files);
        unset($old_files);
    }
}


2) Остается теперь перехватывать события после добавления или редактирования элемента в инфоблоках, для этого прописываем команды

AddEventHandler("iblock", "OnAfterIBlockElementAdd", "resizePropertyFilePhoto");
AddEventHandler("iblock", "OnAfterIBlockElementUpdate", "resizePropertyFilePhoto");

Все вместе будет так 

AddEventHandler("iblock", "OnAfterIBlockElementAdd", "resizePropertyFilePhoto");
AddEventHandler("iblock", "OnAfterIBlockElementUpdate", "resizePropertyFilePhoto");

function resizePropertyFilePhoto($arFields){
    global $APPLICATION;
    CModule::IncludeModule('iblock');



    switch ($arFields["IBLOCK_ID"]){
        case 15:
            $IBLOCK_ID = 15;
            $PROPERTY_CODE = "ATTR_FOTOMORE";
            $MaxWidth = 1920;
            $MaxHeight = 1080;
            break;

        case 18:
            $IBLOCK_ID = 18;
            $PROPERTY_CODE = "ATTR_FILES";
            $MaxWidth = 1920;
            $MaxHeight = 1080;
            break;
        default:
            $IBLOCK_ID = 0;
    }



    if($IBLOCK_ID !== 0) {
        $new_files  = array();
        $old_files = array();

        $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) {
                $file_size = getimagesize($_SERVER["DOCUMENT_ROOT"].$file_path);

                if (($file_size[0] > $MaxWidth) || ($file_size[1] > $MaxHeight)) {
                    $file = CFile::ResizeImageGet($ob['VALUE'], array(
                        'width'=>$MaxWidth,
                        'height'=>$MaxHeight
                    ), BX_RESIZE_IMAGE_PROPORTIONAL_ALT, true);

                    $new_files[] = array(
                        "VALUE" => CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"].$file["src"]),
                        "DESCRIPTION" => $ob['DESCRIPTION']);
                } else {

                    $new_files[] = array(
                        "VALUE" => CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"].$file_path),
                        "DESCRIPTION" => $ob['DESCRIPTION']);
                }

                $old_files[] = $ob['VALUE'];
            }
        }

        if(count($new_files) > 0) {
            $PROPERTY_VALUE = $new_files;
            CIBlockElement::SetPropertyValuesEx($arFields["ID"], $arFields["IBLOCK_ID"], array($PROPERTY_CODE => $PROPERTY_VALUE));

            foreach ($old_files as $key=>$val) {
                CFile::Delete($val);
            }
        }
        unset($new_files);
        unset($old_files);
    }
}

Теперь в каждом новом элементе или если Вы редактируете старый элемент инфоблока будут уменьшаться имеющиеся в нем фотографии. 

Что я предлагаю

Создам для Вас -

  • Уникальный адаптивный дизайн
  • Заключение договора

Заполните форму