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

Объяснение кода:
- Обработка ошибок загрузки файла:
Проверяются ошибки загрузки файла с использованием массива возможных ошибок. Если файл содержит ошибку, она логируется, и обработка заканчивается.
- Работа с 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
----------