Конвертация изображений в формат 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
----------

Теги:  Битрикс

Похожие статьи

Использование геолокации в Битрикс D7

В современных веб-приложениях часто требуется определять геолокацию пользователя по его IP-адресу. В «1С-Битрикс: Управление сайтом» для этого предусмотрен функционал в пространстве имён \Bitrix\Main\Service\GeoIp. Ниже мы рассмотрим, как настроить и использовать этот сервис на практике, а также ...

Класс CurrencyLangTable

Класс CurrencyLangTable отвечает за работу с таблицей, в которой хранятся языкозависимые параметры валют в системе 1С-Битрикс. Он предоставляет функционал для получения, добавления, изменения и удаления записей (данных о формате валюты на разных языках). Является наследником класса Bitrix\M...

Функция AddMessage2Log() в Bitrix

Функция AddMessage2Log() предназначена для записи сообщений (логирования) в специальный журнал системы 1С-Битрикс. Она может использоваться для отладки, отслеживания ошибок и других служебных целей. В результате вызова данной функции соответствующие данные заносятся в лог-файл, который по у...

Понимание Битрикс D7

Небольшая обзорная статья по Битрикс D7. Сначала идёт развернутое описание и сравнение со старым ядром, затем приводятся примеры использования.

Описание класса CurrencyTable в 1С-Битрикс

Класс CurrencyTable предназначен для работы с таблицей, содержащей данные о валютах в системе «1С-Битрикс». Он управляет операциями чтения, записи, обновления и удаления записей в соответствующей таблице базы данных.

CMain::ThrowException — описание метода

Метод CMain::ThrowException предназначен для создания и хранения исключения (ошибки) в текущем контексте приложения. В некоторых фреймворках (например, в 1С-Битрикс) он используется для последующего получения информации об ошибке посредством других методов (например, через GetException()). ...

EventManager в 1С-Битрикс: управление событиями и обработчиками

EventManager - это класс, предназначенный для краткосрочной и долгосрочной регистрации обработчиков событий. Он реализует паттерн Singleton (Одиночка), что означает, что существует только один экземпляр этого класса в приложении. Доступ к этому экземпляру осуществляется через метод getInstanc...

Получение название шаблона и пути для сайта

Рассматриваем вариант, когда требуется получить название или путь к шаблону сайта без использования констант, типа SITE_TEMPLATE_PATH, к примеру, из административной части.

Отправка своих почтовых событий в при оформлении заказа

В 1С-Битрикс привязка своих почтовых событий при оформлении заказа, покупке, оплате и других действиях реализуется через стандартный функционал почтовых событий и обработчиков событий (событийное API). Это позволяет интегрировать кастомные процессы отправки email или изменять шаблоны уведомлений.

Работа с классом Bitrix\Main\Config\Option

Работа с классом Bitrix\Main\Config\Option в Битрикс D7

Описание метода Bitrix D7 getDefaultLang

Метод Bitrix\Main\Localization\Loc::getDefaultLang($lang) в Битрикс D7 используется для получения языка по умолчанию, если указанный язык недоступен. Этот метод полезен в многоязычных приложениях, где необходимо обеспечить поддержку нескольких языков и предоставить язык по умолчанию, если запраши...

Описание метода Editor::isHtmlDocument в 1С-Битрикс

Описание метода Editor::isHtmlDocument

Как использовать CIBlockFindTools::GetSectionID для поиска ID раздела инфоблока

Метод CIBlockFindTools::GetSectionID в Bitrix используется для получения идентификатора раздела инфоблока по его коду. Этот метод полезен, когда вам нужно получить ID раздела, зная только его символьный код.

Как получить информацию от текущем разделе в section.php

Для получения информации о текущем разделе каталога в компоненте bitrix:catalog в файле section.php, вы можете использовать классы и методы, предусмотренные инфраструктурой Bitrix. Вот основные шаги и пример кода, как это можно сделать:

Вызов приватной функции внутри статической функции в пределах класса

В PHP вы не можете напрямую вызывать приватные методы внутри статических методов, поскольку статические методы не имеют контекста экземпляра класса и не могут использовать $this. Однако вы можете создать экземпляр класса внутри статического метода и затем вызвать приватный метод через этот экзе...

Вывод разделов и элементов для .left.menu_ext.php

В 1С-Битрикс для вывода структуры инфоблока, включая разделы и элементы, в файле .left.menu_ext.php можно воспользоваться следующей логикой. В данном случае мы предполагаем, что необходимо получить названия и ссылки как для разделов, так и для элементов инфоблока с определённым ID.

Как в CMS Битриксе проверить статус оплаты по номеру заказа через API

В 1С-Битрикс статус оплаты заказа можно получить с помощью модуля работы с интернет-магазином и API. Для проверки статуса оплаты по номеру заказа используется класс \Bitrix\Sale\Order.

Решение проблемы с созданием разделов при импорте из 1С в Битрикс

Если разделы не создаются при импорте товаров из 1С в CMS Битрикс, это может быть связано с различными причинами. Ниже приведены возможные решения этой проблемы:

Как выявить ошибку нехватки памяти в CMS Битрикс

Ошибки нехватки памяти в CMS Битрикс могут возникать из-за недостаточного выделения оперативной памяти для выполнения скриптов. Вот основные шаги для выявления и устранения этой проблемы:

В чем смысл метода wakeUp в Битрикс?

Метод wakeUp в Битриксе используется для восстановления объекта сущности на основе данных, которые уже известны. Это позволяет избежать повторного запроса к базе данных, если у вас уже есть данные, например, в виде ассоциативного массива. Давайте разберем, в чем заключается его полезность и как о...

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