Конвертация изображений в формат WEBP при загрузке в PREVIEW_PICTURE и DETAIL_PICTURE элемента инфоблока 1С-Битрикс

Пример кода для добавления события в файл init.php проекта на Bitrix, который будет автоматически преобразовывать изображения в формат WebP при их загрузке в PREVIEW_PICTURE и DETAIL_PICTURE элемента инфоблока 1С-Битрикс

Конвертация изображений в формат WEBP при загрузке

Объяснение кода:

  • Обработка ошибок загрузки файла:

    Проверяются ошибки загрузки файла с использованием массива возможных ошибок. Если файл содержит ошибку, она логируется, и обработка заканчивается.

  • Работа с GD:

    Используется библиотека GD для обработки изображений. Поддерживаются форматы JPEG, PNG и GIF.

  • Конвертация в WebP:

    Создается временный файл для нового изображения в формате WebP с качеством 80%, чтобы заменить временное имя загружаемого файла.

  • Логирование:

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

  • Обработка исключений:

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

Что нужно проверить дополнительно?

  • Убедитесь, что параметры PHP, такие как post_max_size, upload_max_filesize и memory_limit, соответствуют требованиям к файлам, которые загружаются.
  • Проверьте, что на сервере включены необходимые расширения (например, GD или Imagick, если планируете использовать его вместо GD).
  • Проверьте настройку прав на временную папку системной функции sys_get_temp_dir.

AddEventHandler("iblock", "OnBeforeIBlockElementAdd", "BeforeAddOrUpdateElement");
AddEventHandler("iblock", "OnBeforeIBlockElementUpdate", "BeforeAddOrUpdateElement");

function BeforeAddOrUpdateElement(&$arFields)
{
    // Функция для обработки загружаемых изображений
    if (!empty($arFields['PREVIEW_PICTURE'])) {
        $arFields['PREVIEW_PICTURE'] = ConvertImageToWebp($arFields['PREVIEW_PICTURE']);
    }

    if (!empty($arFields['DETAIL_PICTURE'])) {
        $arFields['DETAIL_PICTURE'] = ConvertImageToWebp($arFields['DETAIL_PICTURE']);
    }

    return $arFields;
}

function ConvertImageToWebp($file)
{
    // Проверяем массив файла и выводим в лог его структуру для отладки
    if (!is_array($file)) {
        AddMessage2Log("ConvertImageToWebp: Обработанный файл не является массивом. Данные: " . print_r($file, true));
        return $file;
    }

    // Печатаем содержимое перед обработкой
    AddMessage2Log("ConvertImageToWebp: Входной файл: " . print_r($file, true));

    // Код обработки ошибок загрузки
    if (isset($file['error']) && $file['error'] !== UPLOAD_ERR_OK) {
        $errorMessages = [
            UPLOAD_ERR_INI_SIZE => "Размер загружаемого файла превышает upload_max_filesize в php.ini",
            UPLOAD_ERR_FORM_SIZE => "Размер загружаемого файла превышает MAX_FILE_SIZE, указанное в форме HTML",
            UPLOAD_ERR_PARTIAL => "Файл был загружен только частично",
            UPLOAD_ERR_NO_FILE => "Файл не был загружен",
            UPLOAD_ERR_NO_TMP_DIR => "Не найдена временная папка для загрузки",
            UPLOAD_ERR_CANT_WRITE => "Не удалось записать файл на диск",
            UPLOAD_ERR_EXTENSION => "Загрузка файла остановлена расширением PHP",
        ];
        $errorMsg = $errorMessages[$file['error']] ?? "Неизвестная ошибка загрузки файла";
        AddMessage2Log("Ошибка загрузки файла: " . $errorMsg);
        return $file; // Возвращаем файл как он есть, не обработанный
    }

    // Проверяем наличие временного имени файла
    if (empty($file['tmp_name']) || !file_exists($file['tmp_name'])) {
        AddMessage2Log("ConvertImageToWebp: Отсутствует временный файл либо он не существует. Данные: " . print_r($file, true));
        return $file;
    }

    // Устанавливаем имя для нового файла webp
    $originalFileName = $file['name'];
    $tempFileName = $file['tmp_name'];
    $newFileName = preg_replace('/\\.[^.\\s]+$/', '.webp', $originalFileName);

    // Используем GD для конвертации в WebP
    $imageType = mime_content_type($tempFileName);
    $image = null;

    try {
        switch ($imageType) {
            case 'image/jpeg':
                $image = imagecreatefromjpeg($tempFileName);
                break;
            case 'image/png':
                $image = imagecreatefrompng($tempFileName);
                break;
            case 'image/gif':
                $image = imagecreatefromgif($tempFileName);
                break;
            default:
                AddMessage2Log("ConvertImageToWebp: Неподдерживаемый формат файла ($imageType). Оригинальный файл: " . $originalFileName);
                return $file; // Возвращаем оригинальный файл
        }

        if ($image) {
            // Сохраняем изображение в формате WebP
            $webpTempFile = tempnam(sys_get_temp_dir(), 'webp_');
            if (imagewebp($image, $webpTempFile, 80)) { // Качество 80%
                imagedestroy($image); // Освобождаем память
                $file['name'] = $newFileName;
                $file['type'] = 'image/webp';
                $file['tmp_name'] = $webpTempFile;
                $file['size'] = filesize($webpTempFile);
                AddMessage2Log("ConvertImageToWebp: Успешно преобразовано в WebP ($newFileName), временный файл: $webpTempFile");
                return $file;
            } else {
                AddMessage2Log("ConvertImageToWebp: Ошибка сохранения файла WebP ($newFileName).");
                imagedestroy($image);
                return $file;
            }
        } else {
            AddMessage2Log("ConvertImageToWebp: Не удалось создать изображение из исходного файла ($originalFileName).");
            return $file;
        }
    } catch (Exception $e) {
        AddMessage2Log("ConvertImageToWebp: Исключение при обработке файла ($originalFileName): " . $e->getMessage());
        return $file;
    }
}

Пример полученного лога после загрузки изображений

Host: sitename.ru
Date: 2025-01-21 12:21:53
ConvertImageToWebp: Входной файл: Array
(
    [name] => xwpu9xttzwwbaxty62z905t962g1848j.jpg
    [type] => image/jpeg
    [tmp_name] => /server_address/public_html/upload/tmp/BXTEMP-2025-01-21/23/bxu/main/95ceebe58cda9efb78d875203683c975/file1737451426755/default
    [size] => 89589
    [error] => 0
    [description] => 
    [COPY_FILE] => Y
    [MODULE_ID] => iblock
    [old_file] => 3865
)

#0: AddMessage2Log
	/server_address/public_html/local/php_interface/init.php:33
#1: ConvertImageToWebp
	/server_address/public_html/local/php_interface/init.php:14
#2: BeforeAddOrUpdateElement
	
#3: call_user_func_array
	/server_address/public_html/bitrix/modules/main/tools.php:5246
#4: ExecuteModuleEventEx
	/server_address/public_html/bitrix/modules/iblock/classes/general/iblockelement.php:5473
#5: CAllIBlockElement->CheckFields
	/server_address/public_html/bitrix/modules/iblock/classes/mysql/iblockelement.php:1411
----------
Host: sitename.ru
Date: 2025-01-21 12:21:53
ConvertImageToWebp: Успешно преобразовано в WebP (xwpu9xttzwwbaxty62z905t962g1848j.webp), временный файл: /tmp/webp_Mvk0zN
#0: AddMessage2Log
	/server_address/public_html/local/php_interface/init.php:91
#1: ConvertImageToWebp
	/server_address/public_html/local/php_interface/init.php:14
#2: BeforeAddOrUpdateElement
	
#3: call_user_func_array
	/server_address/public_html/bitrix/modules/main/tools.php:5246
#4: ExecuteModuleEventEx
	/server_address/public_html/bitrix/modules/iblock/classes/general/iblockelement.php:5473
#5: CAllIBlockElement->CheckFields
	/server_address/public_html/bitrix/modules/iblock/classes/mysql/iblockelement.php:1411
----------
Host: sitename.ru
Date: 2025-01-21 12:21:53
ConvertImageToWebp: Входной файл: Array
(
    [name] => 89mckwupzarj5evj39a6vfudxvv051iu.jpg
    [type] => image/jpeg
    [tmp_name] => /server_address/public_html/upload/tmp/BXTEMP-2025-01-21/23/bxu/main/95ceebe58cda9efb78d875203683c975/file1737451575645/default
    [size] => 228223
    [error] => 0
    [description] => 
    [COPY_FILE] => Y
    [MODULE_ID] => iblock
    [old_file] => 3864
)

#0: AddMessage2Log
	/server_address/public_html/local/php_interface/init.php:33
#1: ConvertImageToWebp
	/server_address/public_html/local/php_interface/init.php:18
#2: BeforeAddOrUpdateElement
	
#3: call_user_func_array
	/server_address/public_html/bitrix/modules/main/tools.php:5246
#4: ExecuteModuleEventEx
	/server_address/public_html/bitrix/modules/iblock/classes/general/iblockelement.php:5473
#5: CAllIBlockElement->CheckFields
	/server_address/public_html/bitrix/modules/iblock/classes/mysql/iblockelement.php:1411
----------
Host: sitename.ru
Date: 2025-01-21 12:21:53
ConvertImageToWebp: Успешно преобразовано в WebP (89mckwupzarj5evj39a6vfudxvv051iu.webp), временный файл: /tmp/webp_Zvslmn
#0: AddMessage2Log
	/server_address/public_html/local/php_interface/init.php:91
#1: ConvertImageToWebp
	/server_address/public_html/local/php_interface/init.php:18
#2: BeforeAddOrUpdateElement
	
#3: call_user_func_array
	/server_address/public_html/bitrix/modules/main/tools.php:5246
#4: ExecuteModuleEventEx
	/server_address/public_html/bitrix/modules/iblock/classes/general/iblockelement.php:5473
#5: CAllIBlockElement->CheckFields
	/server_address/public_html/bitrix/modules/iblock/classes/mysql/iblockelement.php:1411
----------

Теги:  конвертация изображений, формат WEBP, PREVIEW_PICTURE, DETAIL_PICTURE, инфоблоки, оптимизация изображений, ускорение сайта, загрузка изображений, веб-разработка

Стоимость услуг по разработке и сопровождению сайтов на 1C-Битрикс

Разработка корпоративного сайта

от 7 дней

от 40 000 рублей

Разработка сайта без системы оплаты заказов через корзину

* стоимость зависит от наличия верстки, использования готового решения и т.д.

Техническая поддержка

выполняется с сайтами на основе любых CMS

от 5 000 рублей
Оптимизация производительности действующих интернет-проектов, наполнение и сопровождение, полная техническая поддержка и продвижение в поисковых сетях.

* стоимость зависит от объема и сложности выполняемых работ, используемой CMS.

Модули и компоненты для «1С-Битрикс»

оценка производится на основе предоставленного Технического Задания

от 20 000 рублей
Разработка дополнительных модулей для 1С-Битрикс, расширение функционала, внедрение любых решений, требующихся для выполнения ваших бизнес-задач.

* стоимость зависит от конкретной задачи, ее объема и сложности выполняемых работ.