Создание сайтов на 1С-Битрикс

Удалить PREVIEW_PICTURE и уменьшить размер DETAIL_PICTURE

Ради уменьшения объема файлов стояла задача удалить картинки для анонса и уменьшить детальные картинки до максимально допустимого (уменьшили в настройках инфоблока, но нужно было обновить существующие#.

Также при удалении проверяем что файл физически удалился, а не только из таблицы b_file. И в конце удаляем файл webp с таким же названием в этой папке, т.к. они делаются скриптом, который мы использовали на сайте.

Перед применением в инфоблок нужно добавить свойство типа "Строка" с кодом CODE_TEST.

Настоятельно рекомендуется сначала проверить на одном / нескольких элементах — для этого в переменную $id записываем id элемента. Как вы можете заметить, поле DETAIL_TEXT каждый раз добавляется в $arParams — это потому что методом проб было обнаружено что оно при обновлении элемента "обнуляется". 

Итак, просто создаём в корне любой файл, например test.php, добавляем в него код, правим под себя и запускаем в браузере.

<?
require($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php');
$APPLICATION->SetTitle("test");

global $USER;
if (!$USER->IsAdmin()) die("Доступ запрещен");

?>
<style>
img {
    width: 100px;
    height: auto;    
}
pre {
    margin-bottom: 0.25em;
}
</style>
<br>
<?

$hasError = false;
$hasEls = 0;


$pageSize = 50; // Кол-во на странице (элементов за один проход)
$iblockID = 9;  // ID инфоблока
$maxWidth = 1656;   

$id = false;

if(CModule::IncludeModule('iblock')) {
    $arSelect = Array("ID", "IBLOCK_ID", "NAME", "PREVIEW_PICTURE", "DETAIL_PICTURE", "DETAIL_TEXT");
    $arFilter = Array("IBLOCK_ID"=>$iblockID, "!DETAIL_PICTURE"=>false);
    
    if($id) {
        $arFilter['ID'] = $id;
    } else {
        // $arFilter['!PREVIEW_PICTURE'] = false;
        $arFilter['PROPERTY_CODE_TEST'] = false;
    }

    $res = CIBlockElement::GetList(Array("ID"=>"ASC"), $arFilter, false, Array("nPageSize"=>$pageSize), $arSelect);
    while($arItem = $res->Fetch()){ 

        $hasEls++;
        $deletePreviewPicture = false;
        echo '<br>';
        echo($arItem['ID'].' - '.$arItem['NAME']);

        $arItemPreview = CFile::GetByID($arItem['PREVIEW_PICTURE'])->Fetch();
        $arItemDetail = CFile::GetByID($arItem['DETAIL_PICTURE'])->Fetch();

        if($arItemPreview['ORIGINAL_NAME'] == $arItemDetail['ORIGINAL_NAME']) {
            $deletePreviewPicture = true;
            echo('Удалили PREVIEW_PICTURE<br>');

            $filePreview = $_SERVER['DOCUMENT_ROOT'].$arItemPreview['SRC'];
            if(file_exists($filePreview)) {
                $info = pathinfo($filePreview);
                $webpFile = $info['dirname'].'/'.$info['filename'].'.webp';

                if($info['extension'] != 'webp') {
                    if(file_exists($webpFile)) {
                        if(unlink($webpFile)) {
                            echo('Удалили файл webp PREVIEW<br>');
                        }
                    }
                }
            }
            // echo '<img src="'.$arItemPreview['SRC'].'">&nbsp;';
        }

        $bResizePictures = false;
        if($arItemDetail['WIDTH'] > $maxWidth) {
            echo ('DETAIL width: '.$arItemDetail['WIDTH'].'x'.$arItemDetail['HEIGHT'].'<br>');
            $bResizePictures = true;
        }

        if($deletePreviewPicture || $bResizePictures) {

            $arParams = array(
                'TIMESTAMP_X' => FALSE,
                'DETAIL_TEXT' => $arItem['DETAIL_TEXT'],
                'DETAIL_TEXT_TYPE' => $arItem['DETAIL_TEXT_TYPE'],
            );

            if($deletePreviewPicture)
                $arParams['PREVIEW_PICTURE'] = ['del' => 'Y']; // Удалить PREVIEW_PICTURE

            if($bResizePictures)
                $arParams['DETAIL_PICTURE'] = CFile::MakeFileArray($arItem['DETAIL_PICTURE']);

            $el = new \CIBlockElement;
            if($el->Update(
                $arItem['ID'],
                $arParams,
                false,
                false,
                $bResizePictures // bResizePictures
                )
            ) {
                if($deletePreviewPicture) {
                    // Физически удаляем файл Preview если он остался на диске
                    $filePreview = $_SERVER['DOCUMENT_ROOT'].$arItemPreview['SRC'];
                    if(file_exists($filePreview)) {
                        $info = pathinfo($filePreview);
                        $webpFile = $info['dirname'].'/'.$info['filename'].'.webp';

                        if(unlink($filePreview)) {
                            echo('Удалили файл PREVIEW<br>');
                        }

                        if($info['extension'] != 'webp') {
                            if(file_exists($webpFile)) {
                                if(unlink($webpFile)) {
                                    echo('Удалили файл webp PREVIEW<br>');
                                }
                            }
                        }
                    }
                }

                // Если уменьшаем Detail_picture — удаляем файл webp
                if($bResizePictures) {
                    $fileDetail = $_SERVER['DOCUMENT_ROOT'].$arItemDetail['SRC'];
                    $info = pathinfo($fileDetail);
                    $webpFile = $info['dirname'].'/'.$info['filename'].'.webp';

                    if($info['extension'] != 'webp') {
                        if(file_exists($webpFile)) {
                            if(unlink($webpFile)) {
                                echo('Удалили файл webp DETAIL<br>');
                            }
                        }
                    }
                }
            } else {
                $hasError = true;
                echo($el->LAST_ERROR);
            }
        }
        // if($id)
        CIBlockElement::SetPropertyValues($arItem['ID'], $arItem['IBLOCK_ID'], 'Y', 'CODE_TEST');
    }
}


if(!$hasError && $hasEls) {
    echo '<div id="success">Успешно</div>';
}

?>
<script>
document.addEventListener("DOMContentLoaded", function() {
    'use strict';

    let success = document.getElementById('success');

    if(success) {
        setTimeout(() => {
            location.reload();
        }, 1000);
    }
});
</script>
<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_after.php");

Скрипт будет работать только для администраторов сайта. На всякий случай )

Скачать:

test.zip (1.87 КБ)
Логотип SiteBERG
Изменено: 24.12.2025 18:38

Статьи

Что нужно сделать?