Так как Битрикс сжимает изображения только в анонсовой и детальной фотографии, а фото добавленные в инфоблок через свойства типа "Файл" нет, то сайт начинает разрастаться. В данной статье мы рассмотрим как сжимать изображения в свойствах типа "Файл".
Что мы будем делать? Создадим собственную функцию, в которой будем перехватывать событие после добавление элемента в инфоблок и событие после его изменения.
На авторство данного скрипта не претендую, нашел где-то в интернете и внес изменения под свои задачи.
В файле /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);
}
}
Теперь в каждом новом элементе или если Вы редактируете старый элемент инфоблока будут уменьшаться имеющиеся в нем фотографии.
Продолжая использовать этот сайт, Вы принимаете условия политики конфиденциальности и даёте согласие на обработку пользовательских данных. Подробнее
Продолжая использовать этот сайт, Вы принимаете условия политики конфиденциальности и даёте согласие на обработку пользовательских данных (файлов cookie), в том числе с использованием систем аналитики «Яндекс. Метрика» и «Google Analytics», (IP-адрес; версия ОС; версия веб-браузера; сведения об устройстве (тип, производитель, модель); разрешение экрана и количество цветов экрана; наличие программного обеспечения для блокирования рекламы; наличие Cookies; наличие JavaScript; язык ОС и Браузера; время, проведенное на сайте; глубина просмотра; действия пользователя на сайте; географические данные) в целях определения посещаемости сайта. Отказаться от обработки пользовательских данных и использования «cookie» можно, выбрав соответствующие настройки в браузере. Однако это может повлиять на работу некоторых функций сайта. Скрыть