Pull to refresh

Скрипт перезаписи названий файлов для БУС

Зачастую нужно реализовать следующий сценарий:- Контент-менеджер загружает файлы (картинки товара или раздела каталога) как есть. С кириллическим названием или пробелами. Как результат при валидации кода (если придет дотошный сеошник) могут вылезти куча ошибок связанных с разрывами в имени файла.Ниже публикую 2 скрипта, которые позволяют поправить эту ошибку перезаписав имена на корректные с точки зрения seo.

!!! ВАЖНО !!! Перед выполнением скрипта в настройках главного модуля должны быть следующие настройки (см. скриншот). И не забывайте указать свой ID инфоблока.

1. Для разделов

$start = microtime(true);
// включение модуля
\Bitrix\Main\Loader::includeModule('iblock'); 

$arOrder = array('ID' => 'ASC');
$arFilter = array('IBLOCK_ID' => 60); // указать id инфоблока
$arSelect = array('ID', 'NAME', 'PICTURE');

$countSection = 0;
$countPicture = 0;

// достаем список разделов
$res = CIBlockSection::GetList($arOrder, $arFilter, false, $arSelect, false);

// цикл перебора разделов
while($arSection = $res->Fetch()){
   $countSection += 1;
   // получаем id файла в системе
   $fileID = $arSection['PICTURE'];
   
   // если id файла не получен, значит раздел без картинки
   if(isset($fileID)){
      $countPicture += 1;
      // получим картинку как объект по id
      $fileInfo = CFile::GetByID($fileID);
      
      if($fileArr = $fileInfo->Fetch()){
         // указываем расположение для временного хранения в склейке с именем файла
         // !!! путь к папке задается от корня /upload/
         $newFilePath = 'user_files/'.$fileArr['FILE_NAME'];
         // копируем файл во временную папку 
         $fileCopy = CFile::CopyFile($fileID, true, $newFilePath);
      }
      
      // получаем информацию в массиве
      $arrTmp = CFile::MakeFileArray($fileCopy);
      
      // начинаем обновлять картинку
      $bs = new CIBlockSection;
      // определим данные для корректной записи массива 'PICTURE'
      $picture = array(
         'name'       => $arrTmp['name'],
         'type'       => $arrTmp['type'],
         'tmp_name'    => $arrTmp['tmp_name'],
         'error'    => 0,
         'size'       => $arrTmp['size'],
         'MODULE_ID' => 'iblock',
      );
      
      $arFields = array(
            'PICTURE' => $picture,
         );
      
      // обновляем раздел
      $bs->Update($arSection['ID'], $arFields, false, false, true);
      
      unset($fileID);
   }
}
$time = microtime(true) - $start;
echo 'Всего найдено ' . $countSection . ' разделов <br>';
echo 'Обновлено ' . $countPicture . ' картинок <br>';
echo 'Время выполнения ' . $time . ' секунд';
  1. Для элементов

$start = microtime(true);
// включение модуля
\Bitrix\Main\Loader::includeModule('iblock'); 

$arOrder = array('ID' => 'ASC');
$arFilter = array('IBLOCK_ID' => 55); // указать id инфоблока
$arSelect = array('ID', 'NAME', 'PREVIEW_PICTURE', 'DETAIL_PICTURE');

$countElement = 0;
$countPicture = 0;

// достаем список элементов
$ar_res = CIBlockElement::GetList($arOrder, $arFilter, false, false, $arSelect);

// цикл перебора элементов
while($arElement = $ar_res->Fetch()){
   $countElement += 1;
   $res = CIBlockElement::GetByID($arElement['ID']);
   if($arElement = $res->GetNext()){
      
      /*КАРТИНКА АНОНСА*/
      
      if(isset($arElement['PREVIEW_PICTURE'])){
         $countPicture += 1;
         // получим картинку как объект по id
         $fileInfo = CFile::GetByID($arElement['PREVIEW_PICTURE']);
         if($fileArr = $fileInfo->Fetch()){
            // указываем расположение для временного хранения в склейке с именем файла
            // !!! путь к папке задается от корня /upload/
            $newFilePath = 'user_files/'.$fileArr['FILE_NAME'];
            // копируем файл во временную папку 
            $fileCopy = CFile::CopyFile($arElement['PREVIEW_PICTURE'], true, $newFilePath);
         }
         
         // получаем информацию в массиве
         $arrTmp = CFile::MakeFileArray($fileCopy);
         
         // обновляем элемент
         $el = new CIBlockElement;
         // определим данные для корректной записи массива 'PICTURE'
         $picture = array(
            'name'       => $arrTmp['name'],
            'type'       => $arrTmp['type'],
            'tmp_name'    => $arrTmp['tmp_name'],
            'error'    => 0,
            'size'       => $arrTmp['size'],
            'MODULE_ID' => 'iblock',
         );
         
         $arFields = array(
               'PREVIEW_PICTURE' => $picture,
            );
         $res = $el->Update($arElement['ID'], $arFields);
      }
      
      /*КАРТИНКА ДЕТАЛЬНАЯ*/
      
      if(isset($arElement['DETAIL_PICTURE'])){
         $countPicture += 1;
         // получим картинку как объект по id
         $fileInfo = CFile::GetByID($arElement['DETAIL_PICTURE']);
         if($fileArr = $fileInfo->Fetch()){
            // указываем расположение для временного хранения в склейке с именем файла
            // !!! путь к папке задается от корня /upload/
            $newFilePath = 'user_files/'.$fileArr['FILE_NAME'];
            // копируем файл во временную папку 
            $fileCopy = CFile::CopyFile($arElement['DETAIL_PICTURE'], true, $newFilePath);
         }
         
         // получаем информацию в массиве
         $arrTmp = CFile::MakeFileArray($fileCopy);
         
         // обновляем элемент
         $el = new CIBlockElement;
         // определим данные для корректной записи массива 'PICTURE'
         $picture = array(
            'name'       => $arrTmp['name'],
            'type'       => $arrTmp['type'],
            'tmp_name'    => $arrTmp['tmp_name'],
            'error'    => 0,
            'size'       => $arrTmp['size'],
            'MODULE_ID' => 'iblock',
         );
         
         $arFields = array(
               'DETAIL_PICTURE' => $picture,
            );
         $res = $el->Update($arElement['ID'], $arFields);
      }
   }
}


$time = microtime(true) - $start;
echo 'Всего найдено ' . $countElement . ' элементов <br>';
echo 'Обновлено ' . $countPicture . ' картинок <br>';
echo 'Время выполнения ' . $time . ' секунд';

Оставлю этот тут, вдруг кому-то пригодится.

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.