Как стать автором
Обновить

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

Зачастую нужно реализовать следующий сценарий:- Контент-менеджер загружает файлы (картинки товара или раздела каталога) как есть. С кириллическим названием или пробелами. Как результат при валидации кода (если придет дотошный сеошник) могут вылезти куча ошибок связанных с разрывами в имени файла.Ниже публикую 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 . ' секунд';

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

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.