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

Пройти скриптом все элементы инфоблока, удалить PREVIEW_PICTURE, конвертировать PNG в JPG

Скрипт проходит все элементы инфоблока. Запускать в браузере.

Он удаляет PREVIEW_PICTURE, проверяет детальную картинку - есть ли такой файл на сервере, конвертирует в jpg (если она в формате png) + проверяет на соответствие настроек инфоблока для загрузки изображений (например если размеры больше максимальных - уменьшает).

Для правильной работы скрипта нужно добавить в инфоблок свойство Строка с кодом TEST.

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

Можно проверить на одном элементе, добавив в arFilter "ID" => ID элемента

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

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

$hasError = false;
$hasEls = 0;

// Для элементов
if(CModule::IncludeModule('iblock')) {
  
  $iblockID = 26;

    $arSelect = Array("ID", "IBLOCK_ID", "NAME", "DETAIL_PICTURE");
    $arFilter = Array("IBLOCK_ID"=>$iblockID, "PROPERTY_TEST"=>false);
    
    $res = CIBlockElement::GetList(Array("ID"=>"ASC"), $arFilter, false, ['nTopCount' => 10], $arSelect);
    while($arItem = $res->Fetch()){ 

        $arParams = array(
            'PREVIEW_PICTURE' => ['del' => 'Y'], // Удалить PREVIEW_PICTURE
            'TIMESTAMP_X' => FALSE,
            );

        if($arItem['DETAIL_PICTURE']) {
          $img = CFile::GetByID($arItem['DETAIL_PICTURE'])->Fetch();

          // Если PNG
          if($img['CONTENT_TYPE'] == 'image/png') {
            $imgSrc = CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"].$img['SRC']);

            if($imgSrc) {
              // Конвертируем PNG в JPG
              $image = imagecreatefrompng($imgSrc['tmp_name']);
              $bg = imagecreatetruecolor(imagesx($image), imagesy($image));
              imagefill($bg, 0, 0, imagecolorallocate($bg, 255, 255, 255));
              imagealphablending($bg, TRUE);
              imagecopy($bg, $image, 0, 0, 0, 0, imagesx($image), imagesy($image));
              imagedestroy($image);
              $quality = 80; // 0 = worst / smaller file, 100 = better / bigger file 
              $tmpFile = $_SERVER["DOCUMENT_ROOT"].'/upload/tmp/'.str_replace('.png', '.jpg', $imgSrc['name']);
              imagejpeg($bg, $tmpFile, $quality);
              imagedestroy($bg);

              $arParams['DETAIL_PICTURE'] = CFile::MakeFileArray($tmpFile);
            } else {
              // Если файла детальной картинки нет на сервере
              $arParams['DETAIL_PICTURE'] = ['del' => 'Y']; // Удалить DETAIL_PICTURE
            }
          } else {
              if($img['SRC']) {
                $arParams['DETAIL_PICTURE'] = CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"].$img['SRC']);
              } else {
                // Если файла детальной картинки нет на сервере
                $arParams['DETAIL_PICTURE'] = ['del' => 'Y']; // Удалить DETAIL_PICTURE
              }
          }

        }

        $el = new \CIBlockElement;
        if($el->Update(
          $arItem['ID'],
          $arParams,
          false,
          false,
          true // bResizePictures
          )
        ) {
          CIBlockElement::SetPropertyValuesEx($arItem['ID'], $iblockID, array('TEST' => 'Y'));
            $hasEls++;
        } else {
            $hasError = true;
            debug($el->LAST_ERROR);
        }

    }   
}

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>
Логотип SiteBERG
Изменено: 01.11.2025 13:10

Статьи

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