Зачастую нужно реализовать следующий сценарий:
- Контент-менеджер загружает файлы (картинки товара или раздела каталога) как есть. С кириллическим названием или пробелами. Как результат при валидации кода (если придет дотошный сеошник) могут вылезти куча ошибок связанных с разрывами в имени файла.
Ниже публикую 2 скрипта, которые позволяют поправить эту ошибку перезаписав имена на корректные с точки зрения seo.
!!! ВАЖНО !!! Перед выполнением скрипта в настройках главного модуля должны быть следующие настройки (см. скриншот). И не забывайте указать свой ID инфоблока.
1. Для разделов
2. Для элементов
Писалось на скорую руку, так что как есть))
Оставлю это тут на всякий случай.
- Контент-менеджер загружает файлы (картинки товара или раздела каталога) как есть. С кириллическим названием или пробелами. Как результат при валидации кода (если придет дотошный сеошник) могут вылезти куча ошибок связанных с разрывами в имени файла.
Ниже публикую 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 . ' секунд'; |
2. Для элементов
$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 . ' секунд'; |
Писалось на скорую руку, так что как есть))
Оставлю это тут на всякий случай.