Битрикс: Перенос изображений разделов каталога с одного сайта на другой
Последние записи
Описываю решение задачи переноса изображений с одного сайта на другой. При условии, что в обоих случаях совпадают CODE
разделов, а для секций на исходном сайте у которых не задано изображение его нужно получить из любого входящего в раздел товара с изображением.
Получаем список разделов с изображениями в json
формате
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;
Комментарии