Пример кода для добавления события в файл 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
----------
Теги:
Битрикс Похожие статьи
В современных веб-приложениях часто требуется определять геолокацию пользователя по его IP-адресу. В «1С-Битрикс: Управление сайтом» для этого предусмотрен функционал в пространстве имён \Bitrix\Main\Service\GeoIp
. Ниже мы рассмотрим, как настроить и использовать этот сервис на практике, а также ...
Класс CurrencyLangTable отвечает за работу с таблицей, в которой хранятся языкозависимые параметры валют в системе 1С-Битрикс. Он предоставляет функционал для получения, добавления, изменения и удаления записей (данных о формате валюты на разных языках). Является наследником класса Bitrix\M...
Функция AddMessage2Log()
предназначена для записи сообщений (логирования)
в специальный журнал системы 1С-Битрикс. Она может использоваться для отладки, отслеживания ошибок и
других служебных целей. В результате вызова данной функции соответствующие данные заносятся в лог-файл,
который по у...
Небольшая обзорная статья по Битрикс D7. Сначала идёт развернутое описание и сравнение со старым ядром, затем приводятся примеры использования.
Класс CurrencyTable предназначен для работы с таблицей, содержащей данные о валютах в системе «1С-Битрикс». Он управляет операциями чтения, записи, обновления и удаления записей в соответствующей таблице базы данных.
Метод CMain::ThrowException
предназначен для создания и хранения исключения (ошибки) в текущем контексте приложения.
В некоторых фреймворках (например, в 1С-Битрикс) он используется для последующего получения информации об ошибке посредством других методов (например,
через GetException()
). ...
EventManager
- это класс, предназначенный для краткосрочной и долгосрочной регистрации обработчиков событий. Он реализует паттерн Singleton (Одиночка), что означает, что существует только один экземпляр этого класса в приложении. Доступ к этому экземпляру осуществляется через метод getInstanc...
Рассматриваем вариант, когда требуется получить название или путь к шаблону сайта без использования констант, типа SITE_TEMPLATE_PATH, к примеру, из административной части.
В 1С-Битрикс привязка своих почтовых событий при оформлении заказа, покупке, оплате и других действиях реализуется через стандартный функционал почтовых событий и обработчиков событий (событийное API). Это позволяет интегрировать кастомные процессы отправки email или изменять шаблоны уведомлений.
Работа с классом Bitrix\Main\Config\Option в Битрикс D7
Метод Bitrix\Main\Localization\Loc::getDefaultLang($lang)
в Битрикс D7 используется для получения языка по умолчанию, если указанный язык недоступен. Этот метод полезен в многоязычных приложениях, где необходимо обеспечить поддержку нескольких языков и предоставить язык по умолчанию, если запраши...
Описание метода Editor::isHtmlDocument
Метод CIBlockFindTools::GetSectionID
в Bitrix используется для получения идентификатора раздела инфоблока по его коду. Этот метод полезен, когда вам нужно получить ID раздела, зная только его символьный код.
Для получения информации о текущем разделе каталога в компоненте bitrix:catalog в файле section.php
, вы можете использовать классы и методы, предусмотренные инфраструктурой Bitrix. Вот основные шаги и пример кода, как это можно сделать:
В PHP вы не можете напрямую вызывать приватные методы внутри статических методов, поскольку статические методы не имеют контекста экземпляра класса и не могут использовать $this. Однако вы можете создать экземпляр класса внутри статического метода и затем вызвать приватный метод через этот экзе...
В 1С-Битрикс для вывода структуры инфоблока, включая разделы и элементы, в файле .left.menu_ext.php
можно воспользоваться следующей логикой. В данном случае мы предполагаем, что необходимо получить названия и ссылки как для разделов, так и для элементов инфоблока с определённым ID.
В 1С-Битрикс статус оплаты заказа можно получить с помощью модуля работы с интернет-магазином и API. Для проверки статуса оплаты по номеру заказа используется класс \Bitrix\Sale\Order.
Если разделы не создаются при импорте товаров из 1С в CMS Битрикс, это может быть связано с различными причинами. Ниже приведены возможные решения этой проблемы:
Ошибки нехватки памяти в CMS Битрикс могут возникать из-за недостаточного выделения оперативной памяти для выполнения скриптов. Вот основные шаги для выявления и устранения этой проблемы:
Метод wakeUp в Битриксе используется для восстановления объекта сущности на основе данных, которые уже известны. Это позволяет избежать повторного запроса к базе данных, если у вас уже есть данные, например, в виде ассоциативного массива. Давайте разберем, в чем заключается его полезность и как о...