Решение задачи переноса изображений с одного сайта на другой. При условии, что в обоих случаях совпадают CODE разделов, а для секций на исходном сайте у которых не задано изображение его нужно получить из любого входящего в раздел товара с изображением.
require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php'); if(!CModule::IncludeModule("catalog")){die();} $arFilter=[ 'IBLOCK_ID' => 17, 'IBLOCK_TYPE' => '1c_catalog', //'ACTIVE' => 'Y' ]; $arSelect = [ "ID", "NAME", "CODE", "PICTURE", "PREVIEW_PICTURE", "DETAIL_PICTURE", "SECTION_PAGE_URL" ]; //Получаем перечень разделов инфоблока $sections = CIBlockSection::GetTreeList($arFilter, $arSelect); while($ar_dep = $sections->GetNext()) { if(!empty($ar_dep['PICTURE']) || !empty($ar_dep['DETAIL_PICTURE'])){ //Если у раздело задано изображение $result[$ar_dep['CODE']] = $ar_dep; $img = $ar_dep['PICTURE'] ? $ar_dep['PICTURE'] : $ar_dep['DETAIL_PICTURE']; $result[$ar_dep['CODE']]['SRC'] = CFile::GetPath($img); }else{ Получаем последний товар именно в нужный раздел $elementIterator = \Bitrix\Iblock\ElementTable::getList([ 'select' => [ "ID", "NAME", "PREVIEW_PICTURE", "DETAIL_PICTURE", "IBLOCK_SECTION_ID", "CODE", ], 'filter' => [ '=IBLOCK_ID' => 17, '=IBLOCK_SECTION_ID' => $ar_dep['ID'], '=ACTIVE' => 'Y', '!=DETAIL_PICTURE' => '', ], 'order' => ['ID' => 'DESC'], // сортировка 'limit' => 1, ]); $elems = $elementIterator->fetchAll(); //Если товар в разделе найден, то записываем src изображений foreach ($elems as $element) { $result[$ar_dep['CODE']] = $ar_dep; $img = $element['DETAIL_PICTURE'] ? $element['DETAIL_PICTURE'] : $element['PREVIEW_PICTURE']; $result[$ar_dep['CODE']]['SRC'] = CFile::GetPath($img); $result[$ar_dep['CODE']]['DETAIL_PAGE_URL'] = $element['CODE']; } //Если src не найден if(!isset($result[$ar_dep['CODE']]['SRC'])){ //Ищем первый попавшийся товар входящий в данный раздел или любой подраздел данного раздела $rsResult = CIBlockElement::GetList( array( "SORT"=>"ASC" ), array( "ACTIVE" => "Y", "IBLOCK_ID" => 17, "SECTION_ID" => $ar_dep['ID'], "INCLUDE_SUBSECTIONS" => "Y", ), false, $arNavStartParams = Array("nTopCount"=>1), array("ID", "NAME", "PREVIEW_PICTURE", "DETAIL_PICTURE", "IBLOCK_SECTION_ID", "CODE") ); while( $obElement = $rsResult->GetNext()) { $result[$ar_dep['CODE']] = $obElement; $img = $obElement['DETAIL_PICTURE'] ? $obElement['DETAIL_PICTURE'] : $obElement['PREVIEW_PICTURE']; $result[$ar_dep['CODE']]['SRC'] = CFile::GetPath($img); $result[$ar_dep['CODE']]['DETAIL_PAGE_URL'] = $obElement['CODE']; } } } } //Функция для исправления кодировки получаемых данных //Если json_encode не работает function safe_json_encode($value, $options = 0, $depth = 512){ $encoded = json_encode($value, $options, $depth); switch (json_last_error()) { case JSON_ERROR_NONE: return $encoded; case JSON_ERROR_DEPTH: return 'Maximum stack depth exceeded'; // or trigger_error() or throw new Exception() case JSON_ERROR_STATE_MISMATCH: return 'Underflow or the modes mismatch'; // or trigger_error() or throw new Exception() case JSON_ERROR_CTRL_CHAR: return 'Unexpected control character found'; case JSON_ERROR_SYNTAX: return 'Syntax error, malformed JSON'; // or trigger_error() or throw new Exception() case JSON_ERROR_UTF8: $clean = utf8ize($value); return safe_json_encode($clean, $options, $depth); default: return 'Unknown error'; // or trigger_error() or throw new Exception() } } function utf8ize($mixed) { if (is_array($mixed)) { foreach ($mixed as $key => $value) { $mixed[$key] = utf8ize($value); } } else if (is_string ($mixed)) { return utf8_encode($mixed); } return $mixed; } echo safe_json_encode($result);Обновляем найденные совпадающие по code разделы
require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php'); $arTotal = array(); $url = 'Путь к файлу c оыщт'; $postdata = array(); $post = http_build_query($postdata); $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post); $response = curl_exec($ch); curl_close($ch); //Преобразовываем std в массив $response = json_decode($response, True); $arTotal['Получено разделов'] = count($response); if(!CModule::IncludeModule("iblock")){die();} $IDS = $KEYS = $ERRORS = array(); foreach ($response as $key => $value){ $IDS[$key]['SRC'] = $value['SRC']; array_push($KEYS,$key); } $arFilter = Array('IBLOCK_TYPE'=>'1c_catalog', 'IBLOCK_ID'=>22, 'GLOBAL_ACTIVE'=>'Y', 'CODE'=>$KEYS); $db_list = CIBlockSection::GetList(Array($by=>$order), $arFilter, true); $i = $obnovleno = $neobnovleno = 0; while($ar_result = $db_list->GetNext()) { $src = 'SERVER_ADRESS'.$IDS[$ar_result['CODE']]['SRC']; $arFile = CFile::MakeFileArray($src); $arPICTURE = $arFile; $arPICTURE["MODULE_ID"] = "iblock"; $bs = new CIBlockSection; $arFields = Array( "PICTURE" => $arPICTURE, ); $res = $bs->Update($ar_result['ID'], $arFields, false, false, true); if($res){ $obnovleno++; }else{ $neobnovleno++; array_push($ERRORS,$res->LAST_ERROR); } $i++; } $arTotal['Найдено разделов на новом сайте'] = $i; $arTotal['Обновлено разделов на новом сайте'] = $obnovleno; $arTotal['Ошибок обновления разделов на новом сайте'] = $neobnovleno; $arTotal['Перечень ошибок'] = $ERRORS;