21.01.2016
Для создания ресайза изображений в наш init.php вставляем следующий код, где нужно указать свой инфоблок, название свойства типа "файл" и размеры изображений. Если у Вас уже есть что-то в init.php, то просто добавьте данный код под все имеющееся в файле перед закрывающей скобкой ?>, скопировав код уже без скобок <? ?>.
Теперь при загрузке новых фото, они будут автоматически уменьшены. А если у вас уже есть элементы с размещенными не отресайзенными фото, то вам нужно открыть эти элементы и просто еще раз нажать кнопку "сохранить", фото в них тоже обработаются заново. Если у фотографий есть поле для описания, то нужно использовать обработчик данный ниже этого, т.к. этот их не поддерживает
Количество показов: 9254
Автоматический ресайз изображений во множественном свойстве типа файл в Битрикс
Разрабатывая сайт с хотя бы одним модулем, будь то новости, каталог, награды, документы и т.п. зачастую возникает необходимость прикрепления нескольких изображений через свойство типа "Файл". Но и тут же возникает главный вопрос: как уменьшать (ресайзить) загружаемые изображения?! Конечно, никому не хочется заморачиваться перед загрузкой обработкой изображений, а тем более менеджеру, который загружен еще дополнительной работой. На помощь нам приходит "чудо-код" обработки событий, который размещается /bitrix/php_interface/init.php.Для создания ресайза изображений в наш init.php вставляем следующий код, где нужно указать свой инфоблок, название свойства типа "файл" и размеры изображений. Если у Вас уже есть что-то в init.php, то просто добавьте данный код под все имеющееся в файле перед закрывающей скобкой ?>, скопировав код уже без скобок <? ?>.
Теперь при загрузке новых фото, они будут автоматически уменьшены. А если у вас уже есть элементы с размещенными не отресайзенными фото, то вам нужно открыть эти элементы и просто еще раз нажать кнопку "сохранить", фото в них тоже обработаются заново. Если у фотографий есть поле для описания, то нужно использовать обработчик данный ниже этого, т.к. этот их не поддерживает
<?
// События которые срабатывают при создании или изменении элемента инфоблока
AddEventHandler("iblock", "OnAfterIBlockElementAdd", "ResizeUploadedPhoto");
AddEventHandler("iblock", "OnAfterIBlockElementUpdate", "ResizeUploadedPhoto");
function ResizeUploadedPhoto($arFields) {
global $APPLICATION;
CModule::IncludeModule('iblock');
$IBLOCK_ID = 6; // ID инфоблока свойство которых нуждается в масштабировании
$PROPERTY_CODE = "FOTO"; // код свойства
$imageMaxWidth = 1000; // Максимальная ширина картинки
$imageMaxHeight = 800; // Максимальная высота картинки
// для начала убедимся, что изменяется элемент нужного нам инфоблока
if($arFields["IBLOCK_ID"] == $IBLOCK_ID) {
$VALUES = $VALUES_OLD = array();
//Получаем свойство значение сво-ва $PROPERTY_CODE
$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) {
$imsize = getimagesize($_SERVER["DOCUMENT_ROOT"].$file_path); //Узнаём размер файла
// Если размер больше установленного максимума
if($imsize[0] > $imageMaxWidth or $imsize[1] > $imageMaxHeight) {
// Уменьшаем размер картинки
$file = CFile::ResizeImageGet($ob['VALUE'], array(
'width'=>$imageMaxWidth,
'height'=>$imageMaxHeight
), BX_RESIZE_IMAGE_PROPORTIONAL, true);
// добавляем в массив VALUES новую уменьшенную картинку
$VALUES[] = CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"].$file["src"]);
} else {
// добавляем в массив VALUES старую картинку
$VALUES[] = CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"].$file_path);
}
// Собираем в массив ID старых файлов для их удаления (чтобы не занимали место)
$VALUES_OLD[] = $ob['VALUE'];
}
}
// Если в массиве есть информация о новых файлах
if(count($VALUES) > 0) {
$PROPERTY_VALUE = $VALUES; // значение свойства
// Установим новое значение для данного свойства данного элемента
CIBlockElement::SetPropertyValuesEx($arFields["ID"], $arFields["IBLOCK_ID"], array($PROPERTY_CODE => $PROPERTY_VALUE));
// Удаляем старые большие изображения
foreach ($VALUES_OLD as $key=>$val) {
CFile::Delete($val);
}
}
unset($VALUES);
unset($VALUES_OLD);
}
}
?>
Если требуется задать данное событие для нескольких инфоблоков, то меняем строку:
if($arFields["IBLOCK_ID"] == $IBLOCK_ID) {
на
if(($arFields["IBLOCK_ID"] == 1) || ($arFields["IBLOCK_ID"] == 2)) {
Если у множественного свойства типа "Файл" добавлено Описание, т.е. стоит галочка "Выводить поле для описания значения", то используем этот код:
<?
// События которые срабатывают при создании или изменении элемента инфоблока
AddEventHandler("iblock", "OnAfterIBlockElementAdd", "ResizeUploadedPhoto");
AddEventHandler("iblock", "OnAfterIBlockElementUpdate", "ResizeUploadedPhoto");
function ResizeUploadedPhoto($arFields) {
global $APPLICATION;
CModule::IncludeModule('iblock');
$IBLOCK_ID = 6; // ID инфоблока свойство которых нуждается в масштабировании
$PROPERTY_CODE = "FOTO"; // код свойства
$imageMaxWidth = 1000; // Максимальная ширина картинки
$imageMaxHeight = 800; // Максимальная высота картинки
// для начала убедимся, что изменяется элемент нужного нам инфоблока
if($arFields["IBLOCK_ID"] == $IBLOCK_ID) {
$VALUES = $VALUES_OLD = array();
//Получаем свойство значение сво-ва $PROPERTY_CODE
$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) {
$imsize = getimagesize($_SERVER["DOCUMENT_ROOT"].$file_path); //Узнаём размер файла
// Если размер больше установленного максимума
if($imsize[0] > $imageMaxWidth or $imsize[1] > $imageMaxHeight) {
// Уменьшаем размер картинки
$file = CFile::ResizeImageGet($ob['VALUE'], array(
'width'=>$imageMaxWidth,
'height'=>$imageMaxHeight
), BX_RESIZE_IMAGE_PROPORTIONAL, true);
// добавляем в массив VALUES новую уменьшенную картинку
$VALUES[] = array("VALUE" => CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"].$file["src"]), "DESCRIPTION" => $ob['DESCRIPTION']);
} else {
// добавляем в массив VALUES старую картинку
$VALUES[] = array("VALUE" => CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"].$file_path), "DESCRIPTION" => $ob['DESCRIPTION']);
}
// Собираем в массив ID старых файлов для их удаления (чтобы не занимали место)
$VALUES_OLD[] = $ob['VALUE'];
}
}
// Если в массиве есть информация о новых файлах
if(count($VALUES) > 0) {
$PROPERTY_VALUE = $VALUES; // значение свойства
// Установим новое значение для данного свойства данного элемента
CIBlockElement::SetPropertyValuesEx($arFields["ID"], $arFields["IBLOCK_ID"], array($PROPERTY_CODE => $PROPERTY_VALUE));
// Удаляем старые большие изображения
foreach ($VALUES_OLD as $key=>$val) {
CFile::Delete($val);
}
}
unset($VALUES);
unset($VALUES_OLD);
}
}
?>
Чтобы было легче понять в чем отличие этого кода от того, что выше, то у данного в массив добавляется значение Описания в этом месте:
// добавляем в массив VALUES новую уменьшенную картинку
$VALUES[] = array("VALUE" => CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"].$file["src"]), "DESCRIPTION" => $ob['DESCRIPTION']);
} else {
// добавляем в массив VALUES старую картинку
$VALUES[] = array("VALUE" => CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"].$file_path), "DESCRIPTION" => $ob['DESCRIPTION']);
}
Количество показов: 9254