[ "verify_peer"=>false, "verify_peer_name"=>false, ], ]; $bitrix_existed_brands = []; $bitrix_enabled_brands = []; $bitrix_existed_models = []; $bitrix_enabled_models = []; $api_brands = []; $api_models = []; $bitrix_existed_modifications = []; $bitrix_enabled_modifications = []; $bitrix_existed_cars = []; $bitrix_enabled_cars = []; $all_brands_search_res = CIBlockElement::GetList( [], [ "IBLOCK_ID" => IBLOCK_ID_BRANDS, "ACTIVE" => "Y" ], false, false, [] ); while($all_brands_search_ob = $all_brands_search_res->GetNextElement()) { $brand_search = $all_brands_search_ob->GetFields(); $brand_search['PROPERTIES'] = $all_brands_search_ob->GetProperties(); array_push( $bitrix_existed_brands, $brand_search['PROPERTIES']['UID']['VALUE'] ); if($brand_search['ACTIVE'] == "Y") { array_push( $bitrix_enabled_brands, $brand_search['PROPERTIES']['UID']['VALUE'] ); } } $all_models_search_res = CIBlockElement::GetList( [], [ "IBLOCK_ID" => IBLOCK_ID_MODELS, "ACTIVE" => "Y" ], false, false, [] ); while($all_models_search_ob = $all_models_search_res->GetNextElement()) { $model_search = $all_models_search_ob->GetFields(); $model_search['PROPERTIES'] = $all_models_search_ob->GetProperties(); array_push( $bitrix_existed_models, $model_search['PROPERTIES']['UID']['VALUE'] ); if($model_search['ACTIVE'] == "Y") { array_push( $bitrix_enabled_models, $model_search['PROPERTIES']['UID']['VALUE'] ); } } $all_modifications_search_res = CIBlockElement::GetList( [], [ "IBLOCK_ID" => 10, "ACTIVE" => "Y" ], false, false, [] ); while($all_modifications_search_ob = $all_modifications_search_res->GetNextElement()) { $modification_search = $all_modifications_search_ob->GetFields(); array_push( $bitrix_existed_modifications, $modification_search['CODE'] ); if($modification_search['ACTIVE'] == "Y") { array_push( $bitrix_existed_modifications, $modification_search['CODE'] ); } } $all_cars_search_res = CIBlockElement::GetList( [], [ "IBLOCK_ID" => 1, ], false, false, [] ); while($all_cars_search_ob = $all_cars_search_res->GetNextElement()) { $car_search = $all_cars_search_ob->GetFields(); $car_search['PROPERTIES'] = $all_cars_search_ob->GetProperties(); array_push( $bitrix_existed_cars, $car_search['PROPERTIES']['UID']['VALUE'] ); if($car_search['ACTIVE'] == "Y") { array_push( $bitrix_enabled_cars, $car_search['PROPERTIES']['UID']['VALUE'] ); } } print "bitrix_existed_brands = ".count($bitrix_existed_brands)."\n"; print "bitrix_existed_models = ".count($bitrix_existed_models)."\n"; print "bitrix_existed_modifications = ".count($bitrix_existed_modifications)."\n"; print "bitrix_existed_cars = ".count($bitrix_existed_cars)."\n"; $api_modifications_url = API_HOST."/site/Vehicle/GetModifications"; $content = file_get_contents($api_modifications_url, false, stream_context_create($arrContextOptions)); print $api_modifications_url."\n\n"; file_put_contents("./api_modifications.json", $content); $json = json_decode($content, true); $brands_and_models = []; //print "---------------\n\n"; //print_r(); //print "---------------\n\n"; $c = 0; $api_data_titles = []; $api_data = []; $api_brands = []; $api_models = []; $api_modifications = []; $api_cars = []; //prepare brands list from API foreach($json AS $entry) { if(!isset($api_data[ $entry['brand']['id'] ])) { $api_data[ $entry['brand']['id'] ] = [ "models" => [] ]; } if(!isset($api_data_titles[ $entry['brand']['name'] ])) { $api_data_titles[ $entry['brand']['name'] ] = [ "models" => [] ]; } if(!in_array($entry['brand']['id'], $api_brands)) { array_push($api_brands, $entry['brand']['id']); } } //prepare models list from API foreach($json AS $entry) { if(!isset($api_data[ $entry['brand']['id'] ]['models'][ $entry['model']['id'] ])) { $api_data[ $entry['brand']['id'] ]['models'][ $entry['model']['id'] ] = [ "modifications" => [] ]; } if(!isset($api_data_titles[ $entry['brand']['name'] ]['models'][ $entry['model']['name'] ])) { $api_data_titles[ $entry['brand']['name'] ]['models'][ $entry['model']['name'] ] = [ "modifications" => [] ]; } if(!in_array($entry['model']['id'], $api_models)) { array_push($api_models, $entry['model']['id']); } } //prepare modifications list from API foreach($json AS $entry) { if(!isset($api_data[ $entry['brand']['id'] ]['models'][ $entry['model']['id'] ]['modifications'][ $entry['modification'] ])) { $api_data[ $entry['brand']['id'] ]['models'][ $entry['model']['id'] ]['modifications'][ $entry['modification'] ] = [ "cars" => [] ]; } if(!isset($api_data_titles[ $entry['brand']['name'] ]['models'][ $entry['model']['name'] ]['modifications'][ $entry['modification'] ])) { $api_data_titles[ $entry['brand']['name'] ]['models'][ $entry['model']['name'] ]['modifications'][ $entry['modification'] ] = [ "cars" => [] ]; } if(!in_array($entry['modification'], $api_modifications)) { array_push($api_modifications, $entry['modification']); } } //prepare cars list from API foreach($json AS $entry) { if(!isset($api_data[ $entry['brand']['id'] ]['models'][ $entry['model']['id'] ]['modifications'][ $entry['modification'] ]['cars'][ $entry['uid'] ])) { array_push($api_data[ $entry['brand']['id'] ]['models'][ $entry['model']['id'] ]['modifications'][ $entry['modification'] ]['cars'], $entry['uid']); } if(!isset($api_data_titles[ $entry['brand']['name'] ]['models'][ $entry['model']['name'] ]['modifications'][ $entry['modification'] ]['cars'][ $entry['uid'] ])) { array_push($api_data_titles[ $entry['brand']['name'] ]['models'][ $entry['model']['name'] ]['modifications'][ $entry['modification'] ]['cars'], $entry['uid']); } if(!in_array($entry['uid'], $api_cars)) { array_push($api_cars, $entry['uid']); } } ksort($api_data_titles); foreach($api_data_titles AS $k => $v) { $models = $v['models']; ksort($models); foreach($models AS $kk => $vv) { $modifications = $vv['modifications']; ksort($modifications); $models[$kk]['modifications'] = $modifications; } $api_data_titles[$k]['models'] = $models; } file_put_contents("./api_data_titles.json", json_encode($api_data_titles)); //print_r($bitrix_existed_models); foreach($bitrix_existed_models AS $existed_model) { //print $existed_model." ?\n"; if(!in_array($existed_model, $api_models)) { print "HIDE MODEL ".$existed_model."\n"; } } ////print_r($api_data); ////die(); foreach($json AS $entry) { if(!isset($brands_and_models[ $entry['brand']['id'] ])) { $brands_and_models[ $entry['brand']['id'] ] = [ "name" => $entry['brand']['name'], "models" => [ $entry['model']['id'] => [ "name" => $entry['model']['name'], "modifications" => [ $entry['modification'] ], ] ], ]; } else { if(!isset($brands_and_models[ $entry['brand']['id'] ][ 'models' ][ $entry['model']['id'] ])) { $brands_and_models[ $entry['brand']['id'] ][ 'models' ][ $entry['model']['id'] ] = [ "name" => $entry['model']['name'], "modifications" => [ $entry['modification'] ], ]; } if(!in_array($entry['modification'], $brands_and_models[ $entry['brand']['id'] ][ 'models' ][ $entry['model']['id'] ][ 'modifications' ])) { array_push($brands_and_models[ $entry['brand']['id'] ][ 'models' ][ $entry['model']['id'] ][ 'modifications' ], $entry['modification']); } } if($c === 0) { print_r($entry); } $c++; } //print_r($brands_and_models); //die(); $c = 0; $bitrix_brands = []; $bitrix_models = []; $bitrix_modifications = []; $bitrix_modifications_codes = []; foreach($brands_and_models AS $brand_uid => $brand) { //print $uid." - ".$brand['name']."\n"; //if($c < 2) //{ //добавляем новую марку $brand_existed = null; $brand_search_res = CIBlockElement::GetList( [], [ "IBLOCK_ID" => IBLOCK_ID_BRANDS, "PROPERTY_UID" => $brand_uid ], false, ["nPageSize" => 1], [] ); while($brand_search_ob = $brand_search_res->GetNextElement()) { $brand_existed = $brand_search_ob->GetFields(); $brand_existed['PROPERTIES'] = $brand_search_ob->GetProperties(); $bitrix_brands[ $brand_uid ] = $brand_existed['ID']; } $code = CUtil::translit( $brand['name'], "ru", [ "max_len" => 255, "change_case" => "L", "replace_space" => "-", "replace_other" => "-", ] ); if($brand_existed !== null) { $brand_update_payload = [ "ACTIVE" => "Y", "CODE" => $code, "NAME" => $brand['name'], ]; $update_element = new CIBlockElement; $update_result = $update_element->Update($brand_existed['ID'], $brand_update_payload); $result = models_check($bitrix_models, $bitrix_modifications, $bitrix_modifications_codes, $brand_uid, $brand); $bitrix_models = $result['bitrix_models']; $bitrix_modifications = $result['bitrix_modifications']; $bitrix_modifications_codes = $result['bitrix_modifications_codes']; } else { $brand_element = new CIBlockElement; $brand_payload = [ "IBLOCK_SECTION_ID" => false, "IBLOCK_ID" => IBLOCK_ID_BRANDS, "PROPERTY_VALUES" => [ "UID" => $brand_uid, "TRANSCRIPTION" => $brand['name'], ], "NAME" => $brand['name'], "CODE" => $code, "ACTIVE" => "Y", ]; if($new_brand_id = $brand_element->Add($brand_payload)) { $bitrix_brands[$brand_uid] = $new_brand_id; } else { echo "brand error: ".$brand_element->LAST_ERROR; } $result = models_check($bitrix_models, $bitrix_modifications, $bitrix_modifications_codes, $brand_uid, $brand); $bitrix_models = $result['bitrix_models']; $bitrix_modifications = $result['bitrix_modifications']; $bitrix_modifications_codes = $result['bitrix_modifications_codes']; } //print "\n------------------------------\n"; //} $c++; } function set_brand_activity($brand_uid, $active = "N") { $brand_id = null; $brand_search_res = CIBlockElement::GetList( [], [ "IBLOCK_ID" => IBLOCK_ID_BRANDS, "PROPERTY_UID" => $brand_uid ], false, false, [] ); while($brand_search_ob = $brand_search_res->GetNextElement()) { $brand_search = $brand_search_ob->GetFields(); $brand_id = $brand_search['ID']; } if($brand_id !== null) { $update_element = new CIBlockElement; $update_result = $update_element->Update($brand_id, [ "ACTIVE" => $active, ]); } } function set_model_activity($model_uid, $active = "N") { $model_id = null; $model_search_res = CIBlockElement::GetList( [], [ "IBLOCK_ID" => IBLOCK_ID_MODELS, "PROPERTY_UID" => $model_uid ], false, false, [] ); while($model_search_ob = $model_search_res->GetNextElement()) { $model_search = $model_search_ob->GetFields(); $model_id = $model_search['ID']; } if($model_id !== null) { $update_element = new CIBlockElement; $update_result = $update_element->Update($model_id, [ "ACTIVE" => $active, ]); } } function set_modification_activity($modification_code, $active = "N") { $modification_id = null; $modification_search_res = CIBlockElement::GetList( [], [ "IBLOCK_ID" => 10, "CODE" => $modification_code ], false, false, [] ); while($modification_search_ob = $modification_search_res->GetNextElement()) { $modification_search = $modification_search_ob->GetFields(); $modification_id = $modification_search['ID']; } if($modification_id !== null) { $update_element = new CIBlockElement; $update_result = $update_element->Update($modification_id, [ "ACTIVE" => $active, ]); } } function set_car_activity($car_uid, $active = "N") { //print "SET ACTIVE ".$car_uid." | ".$active."\n"; $car_id = null; $car_search_res = CIBlockElement::GetList( [], [ "IBLOCK_ID" => IBLOCK_ID_CATALOG_CARS_NEW, "PROPERTY_UID" => $car_uid ], false, false, [] ); while($car_search_ob = $car_search_res->GetNextElement()) { $car_search = $car_search_ob->GetFields(); $car_id = $car_search['ID']; } if($car_id !== null) { $update_element = new CIBlockElement; $update_result = $update_element->Update($car_id, [ "ACTIVE" => $active, ]); } } function models_check($bitrix_models, $bitrix_modifications, $bitrix_modifications_codes, $brand_uid, $brand) { foreach($brand['models'] AS $model_uid => $model) { $model_name = $model['name']; $model_existed = null; $model_search_res = CIBlockElement::GetList( [], [ "IBLOCK_ID" => IBLOCK_ID_MODELS, "PROPERTY_UID" => $model_uid ], false, ["nPageSize" => 1], [] ); while($model_search_ob = $model_search_res->GetNextElement()) { $model_existed = $model_search_ob->GetFields(); $model_existed['PROPERTIES'] = $model_search_ob->GetProperties(); $bitrix_models[$model_uid] = $model_existed['ID']; } $code = CUtil::translit( $model_name, "ru", [ "max_len" => 255, "change_case" => "L", "replace_space" => "-", "replace_other" => "-", ] ); if($model_existed !== null) { //print "MODEL ".$model_uid." EXISTED"; $model_update_payload = [ "ACTIVE" => "Y", "NAME" => $model_name, "CODE" => $code, ]; $update_element = new CIBlockElement; $update_result = $update_element->Update($model_existed['ID'], $model_update_payload); } else { $model_element = new CIBlockElement; $model_payload = [ "IBLOCK_SECTION_ID" => false, "IBLOCK_ID" => IBLOCK_ID_MODELS, "PROPERTY_VALUES" => [ "BRAND_UID" => $brand_uid, "UID" => $model_uid, ], "NAME" => $model_name, "CODE" => $code, "ACTIVE" => "Y", ]; if($new_model_id = $model_element->Add($model_payload)) { $bitrix_models[$model_uid] = $new_model_id; //echo "new_model_id: ".$new_model_id; } else { echo "model error: ".$model_element->LAST_ERROR; } } foreach($model['modifications'] AS $modification) { print "MOD ".$modification."\n"; $modification_existed = null; $NAME = $brand['name']." ".$model_name." ".$modification; $CODE = CUtil::translit( $NAME, "ru", [ "max_len" => 255, "change_case" => "L", "replace_space" => "-", "replace_other" => "-", ] ); //"ID" $modification_search_res = CIBlockElement::GetList( [], [ "IBLOCK_ID" => 10, "CODE" => $CODE ], false, ["nPageSize" => 1], [] ); while($modification_search_ob = $modification_search_res->GetNextElement()) { $m_res = $modification_search_ob->GetFields(); if(isset($m_res['ID'])) { $modification_existed = $m_res['ID']; $bitrix_modifications[md5($brand_uid.$model_uid.$modification)] = $m_res['ID']; array_push($bitrix_modifications_codes, $CODE); } } if($modification_existed === null) { $modification_element = new CIBlockElement; $modification_payload = [ "IBLOCK_SECTION_ID" => false, "IBLOCK_ID" => 10, "PROPERTY_VALUES" => [ "MODEL_UID" => $model_uid, "TITLE" => $modification ], "NAME" => $NAME, "CODE" => $CODE, "ACTIVE" => "Y", ]; if($new_modification_id = $modification_element->Add($modification_payload)) { $bitrix_modifications[md5($brand_uid.$model_uid.$modification)] = $new_modification_id; array_push($bitrix_modifications_codes, $CODE); } else { echo "modification error: ".$modification_element->LAST_ERROR; } } } } return [ "bitrix_models" => $bitrix_models, "bitrix_modifications" => $bitrix_modifications, "bitrix_modifications_codes" => $bitrix_modifications_codes ]; } print "bitrix brands count: ".count($bitrix_brands)."\n"; //print_r($bitrix_brands); print "bitrix models count: ".count($bitrix_models)."\n"; //print_r($bitrix_models); print "bitrix modifications count: ".count($bitrix_modifications)."\n"; //print_r($bitrix_modifications); //кешируем новые UID ТС $json_new_cars = []; foreach($json AS $car) { array_push($json_new_cars, $car['uid']); } $car_codes = []; $c = 0; foreach($json AS $car) { if(!in_array($car['uid'], $bitrix_existed_cars)) { $c++; } //обновляем список ТС в битриксе $modification_content = file_get_contents(API_HOST."/site/Vehicle/GetCatalog?id=". $car['uid'] ."", false, stream_context_create($arrContextOptions)); $modification_json = json_decode($modification_content, true); $name = "".$car['brand']['name']." ".$car['model']['name']." ".$car['modification'].""; $title = $name." ".$car['modificationYear'].""; $code = CUtil::translit( str_replace([""", " ", "+"], ['"', "-", "-plus-"], $title), "ru", [ "max_len" => 255, "change_case" => "L", "replace_space" => "-", "replace_other" => "-", "safe_chars" => "-" ] ); //print "new car --- uid ".$car['uid']." | code ".$code."\n"; $PROPERTY_VALUES = [ "UID" => $car['uid'], "BRAND" => $bitrix_brands[ $car['brand']['id'] ], "MODEL" => $bitrix_models[ $car['model']['id'] ], "MODIFICATION" => $bitrix_modifications[ md5($car['brand']['id'].$car['model']['id'].$car['modification']) ], "MODIFICATION_YEAR" => $car['modificationYear'], "GEAR" => $car['gear'], "DRIVE" => $car['drive'], "BODY" => $car['body'], "ENGINE_POWER" => $car['engine']['power'], "ENGINE_VOLUME" => $car['engine']['volume'], "ENGINE_FUEL" => $car['engine']['fuel'], "PRICE" => $car['price'], "IMAGE_URL" => $car['url'], "COMPLECTATION_BODY" => json_encode($modification_json['body']), "COMPLECTATION_INTERIOR" => json_encode($modification_json['interior']), "COMPLECTATION_SECURITY" => json_encode($modification_json['security']), "COMPLECTATION_GUARANTEE" => json_encode($modification_json['guarantee']), "COMPLECTATION_TECHNICAL_DESCRIPTION" => json_encode($modification_json['technicalDescription']), "COMPLECTATION_FUNCTIONAL_EQUIPMENT" => json_encode($modification_json['functionalEquipment']), "COMPLECTATION_TOTAL_INFORMATION" => json_encode($modification_json['totalInformation']), "LEASING_PROGRAMS" => $car['programms'], ]; //"ID" $car_existed = null; $car_search_res = CIBlockElement::GetList( [], [ "IBLOCK_ID" => IBLOCK_ID_CATALOG_CARS_NEW, "PROPERTY_UID" => $car['uid'] ], false, ["nPageSize" => 1], [] ); while($car_search_ob = $car_search_res->GetNextElement()) { $car_existed = $car_search_ob->GetFields(); //print "CAR FOUND\n\n"; //print_r($car_existed); } $car_update_payload = [ "IBLOCK_SECTION" => false, "NAME" => $name, "CODE" => $code, "ACTIVE" => "Y", ]; if($car_existed !== null) { $car_update_element = new CIBlockElement; $car_update_result = $car_update_element->Update($car_existed['ID'], $car_update_payload); CIBlockElement::SetPropertyValuesEx($car_existed['ID'], IBLOCK_ID_CATALOG_CARS_NEW, $PROPERTY_VALUES, []); } else { //if($c === 0) //{ $car_element = new CIBlockElement; $car_payload = [ "IBLOCK_SECTION_ID" => false, "IBLOCK_ID" => 1, "NAME" => $name, "CODE" => $code, "PROPERTY_VALUES" => $PROPERTY_VALUES, "ACTIVE" => "Y", ]; if($new_car_id = $car_element->Add($car_payload)) { //$bitrix_brands[$brand_uid] = $new_brand_id; //echo "new car id: ".$new_car_id; } else { print "CAR ERROR: ".$car_element->LAST_ERROR." | ".$car['uid']." | ".$code."\n"; if($car_element->LAST_ERROR == "Элемент с таким символьным кодом уже существует.
") { $car_with_problem = null; $car_with_problem_res = CIBlockElement::GetList( [ "ID" => "ASC" ], [ "IBLOCK_ID" => IBLOCK_ID_CATALOG_CARS_NEW, "CODE" => $code ], false, ["nPageSize" => 1], [] ); while($car_with_problem_ob = $car_with_problem_res->GetNextElement()) { $car_with_problem = $car_with_problem_ob->GetFields(); $car_with_problem['PROPERTIES'] = $car_with_problem_ob->GetProperties(); } if($car_with_problem !== null) { print "REPLACE FOR ".$car_with_problem['ID']." uid => ".$car['uid']."\n\n"; print_r([ "ID" => $car_with_problem['ID'], "NAME" => $car_with_problem['NAME'], "CODE" => $car_with_problem['CODE'], "UID" => $car_with_problem['CODE'], ]); print "\n\n\n"; CIBlockElement::SetPropertyValuesEx($car_with_problem['ID'], IBLOCK_ID_CATALOG_CARS_NEW, $PROPERTY_VALUES, []); } } } //} } } //print "car_codes?\n"; /* foreach($car_codes AS $cc => $count) { if($count > 1) { print "cc ".$cc." - ".$count."\n"; } } */ $traceback_message = "Отчет:\n\n"; $trace = "Новых ТС: ".$c; $traceback_message .= $trace."\n"; print "\n\n".$trace."\n\n"; //print "bitrix_existed_cars = ".count($bitrix_existed_cars)."\n"; //print "json_new_cars = ".count($json_new_cars)."\n"; $h = 0; foreach($bitrix_enabled_cars AS $enabled_car_uid) { if(!in_array($enabled_car_uid, $json_new_cars)) { $h++; set_car_activity($enabled_car_uid, "N"); } } $trace = "Снято с публикации ТС: ".$h; $traceback_message .= $trace."\n"; print "\n\n".$trace."\n\n"; //print "bitrix_existed_brands\n"; $c = 0; foreach($bitrix_existed_brands AS $k => $b) { if($c < 10) { //print $k." => ".$b."\n"; $c++; } } //print "bitrix_brands\n"; $c = 0; foreach($bitrix_brands AS $k => $b) { if($c < 10) { //print $k." => ".$b."\n"; $c++; } } $md = 0; foreach($bitrix_enabled_modifications AS $enabled_modifications_code) { if(!in_array($enabled_modifications_code, $bitrix_modifications_codes)) { set_modification_activity($enabled_modifications_code, "N"); $md++; } } $trace = "Снято с публикации модификаций: ".$md; $traceback_message .= $trace."\n"; print "\n\n".$trace."\n\n"; $m = 0; foreach($bitrix_enabled_models AS $enabled_model_uid) { if($bitrix_models[$enabled_model_uid] !== null) {} else { if(!in_array($enabled_model_uid, $api_models)) { set_model_activity($enabled_model_uid, "N"); $m++; } } } $trace = "Снято с публикации моделей: ".$m; $traceback_message .= $trace."\n"; print "\n\n".$trace."\n\n"; $b = 0; foreach($bitrix_enabled_brands AS $enabled_brand_uid) { if($bitrix_brands[$enabled_brand_uid] !== null) {} else { if(!in_array($enabled_brand_uid, $api_brands)) { set_brand_activity($enabled_brand_uid, "N"); $b++; } } } $trace = "Снято с публикации марок: ".$b; $traceback_message .= $trace."\n"; print "\n\n".$trace."\n\n"; /* search reindex start -------------------------------------------------------------*/ $reindex_handler = false; $reindex_handler = CSearch::ReIndexAll(false, 60, $reindex_handler); while(is_array($reindex_handler)) { $reindex_handler = CSearch::ReIndexAll(false, 60, $reindex_handler); } /* search reindex end -------------------------------------------------------------*/ /* sitemap regen start -------------------------------------------------------------*/ $ID = 1; $NS = []; $SESSION = []; $arSitemap = null; if($ID > 0) { $dbSitemap = SitemapTable::getById($ID); $arSitemap = $dbSitemap->fetch(); $dbSite = SiteTable::getByPrimary($arSitemap['SITE_ID']); $arSitemap['SITE'] = $dbSite->fetch(); } $arSitemap['SETTINGS'] = unserialize($arSitemap['SETTINGS'], ['allowed_classes' => false]); $arSitemapSettings = array( 'SITE_ID' => $arSitemap['SITE_ID'], 'PROTOCOL' => $arSitemap['SETTINGS']['PROTO'] == 1 ? 'https' : 'http', 'DOMAIN' => $arSitemap['SETTINGS']['DOMAIN'], ); function seoSitemapGetFilesData($PID, $arSitemap, $arCurrentDir, $sitemapFile) { global $ID; global $NS; global $SESSION; global $arSitemap; global $arSitemapSettings; //global $NS; $arDirList = array(); if($arCurrentDir['ACTIVE'] == SitemapRuntimeTable::ACTIVE) { $list = \CSeoUtils::getDirStructure( $arSitemap['SETTINGS']['logical'] == 'Y', $arSitemap['SITE_ID'], $arCurrentDir['ITEM_PATH'] ); foreach($list as $dir) { $dirKey = "/".ltrim($dir['DATA']['ABS_PATH'], "/"); if($dir['TYPE'] == 'F') { if(!isset($arSitemap['SETTINGS']['FILE'][$dirKey]) || $arSitemap['SETTINGS']['FILE'][$dirKey] == 'Y') { if(preg_match($arSitemap['SETTINGS']['FILE_MASK_REGEXP'], $dir['FILE'])) { $f = new IO\File($dir['DATA']['PATH'], $arSitemap['SITE_ID']); $sitemapFile->addFileEntry($f); $NS['files_count']++; } } } else { if(!isset($arSitemap['SETTINGS']['DIR'][$dirKey]) || $arSitemap['SETTINGS']['DIR'][$dirKey] == 'Y') { $arDirList[] = $dirKey; } } } } else { $len = mb_strlen($arCurrentDir['ITEM_PATH']); if(!empty($arSitemap['SETTINGS']['DIR'])) { foreach($arSitemap['SETTINGS']['DIR'] as $dirKey => $checked) { if($checked == 'Y') { if(strncmp($arCurrentDir['ITEM_PATH'], $dirKey, $len) === 0) { $arDirList[] = $dirKey; } } } } if(!empty($arSitemap['SETTINGS']['FILE'])) { foreach($arSitemap['SETTINGS']['FILE'] as $dirKey => $checked) { if($checked == 'Y') { if(strncmp($arCurrentDir['ITEM_PATH'], $dirKey, $len) === 0) { $fileName = IO\Path::combine( SiteTable::getDocumentRoot($arSitemap['SITE_ID']), $dirKey ); if(!is_dir($fileName)) { $f = new IO\File($fileName, $arSitemap['SITE_ID']); if($f->isExists() && !$f->isSystem() && preg_match($arSitemap['SETTINGS']['FILE_MASK_REGEXP'], $f->getName()) ) { $sitemapFile->addFileEntry($f); $NS['files_count']++; } } } } } } } if(count($arDirList) > 0) { foreach($arDirList as $dirKey) { $arRuntimeData = array( 'PID' => $PID, 'ITEM_PATH' => $dirKey, 'PROCESSED' => SitemapRuntimeTable::UNPROCESSED, 'ACTIVE' => SitemapRuntimeTable::ACTIVE, 'ITEM_TYPE' => SitemapRuntimeTable::ITEM_TYPE_DIR, ); SitemapRuntimeTable::add($arRuntimeData); } } SitemapRuntimeTable::update($arCurrentDir['ID'], array( 'PROCESSED' => SitemapRuntimeTable::PROCESSED )); } function generate($v) { global $ID; global $NS; global $SESSION; global $arSitemap; global $arSitemapSettings; $arValueSteps = array( 'init' => 0, 'files' => 40, 'iblock_index' => 50, 'iblock' => 60, 'forum_index' => 70, 'forum' => 80, 'index' => 100, ); $PID = $ID; if($v == $arValueSteps['init']) { SitemapRuntimeTable::clearByPid($PID); $NS['time_start'] = microtime(true); $NS['files_count'] = 0; $NS['steps_count'] = 0; $bRootChecked = isset($arSitemap['SETTINGS']['DIR']['/']) && $arSitemap['SETTINGS']['DIR']['/'] == 'Y'; $arRuntimeData = array( 'PID' => $PID, 'ITEM_TYPE' => SitemapRuntimeTable::ITEM_TYPE_DIR, 'ITEM_PATH' => '/', 'PROCESSED' => SitemapRuntimeTable::UNPROCESSED, 'ACTIVE' => $bRootChecked ? SitemapRuntimeTable::ACTIVE : SitemapRuntimeTable::INACTIVE, ); SitemapRuntimeTable::add($arRuntimeData); $msg = 'SITEMAP_RUN_FILES' . ' ' . '/'."\n"; $sitemapFile = new SitemapRuntime($PID, $arSitemap['SETTINGS']['FILENAME_FILES'], $arSitemapSettings); $v++; } elseif($v < $arValueSteps['files']) { $NS['steps_count']++; $sitemapFile = new SitemapRuntime($PID, $arSitemap['SETTINGS']['FILENAME_FILES'], $arSitemapSettings); $stepDuration = 15; $ts_finish = microtime(true) + $stepDuration * 0.95; $bFinished = false; $bCheckFinished = false; $dbRes = null; while(!$bFinished && microtime(true) <= $ts_finish) { if(!$dbRes) { $dbRes = SitemapRuntimeTable::getList(array( 'order' => array('ITEM_PATH' => 'ASC'), 'filter' => array( 'PID' => $PID, 'ITEM_TYPE' => SitemapRuntimeTable::ITEM_TYPE_DIR, 'PROCESSED' => SitemapRuntimeTable::UNPROCESSED, ), 'limit' => 1000 )); } if($arRes = $dbRes->Fetch()) { seoSitemapGetFilesData($PID, $arSitemap, $arRes, $sitemapFile); $bCheckFinished = false; } elseif(!$bCheckFinished) { $dbRes = null; $bCheckFinished = true; } else { $bFinished = true; } } if(!$bFinished) { if($v < $arValueSteps['files']-1) $v++; $msg = 'SITEMAP_RUN_FILES'.' '.'ITEM_PATH'."\n"; } else { if(!is_array($NS['XML_FILES'])) $NS['XML_FILES'] = array(); if($sitemapFile->isNotEmpty()) { if($sitemapFile->isCurrentPartNotEmpty()) { $sitemapFile->finish(); } else { $sitemapFile->delete(); } $xmlFiles = $sitemapFile->getNameList(); $directory = $sitemapFile->getPathDirectory(); foreach($xmlFiles as &$xmlFile) $xmlFile = $directory.$xmlFile; $NS['XML_FILES'] = array_unique(array_merge($NS['XML_FILES'], $xmlFiles)); } else { $sitemapFile->delete(); } $v = $arValueSteps['files']; $msg = 'SITEMAP_RUN_FILE_COMPLETE'.' '.$arSitemap['SETTINGS']['FILENAME_FILES']."\n"; } } elseif($v < $arValueSteps['iblock_index']) { $NS['time_start'] = microtime(true); $arIBlockList = array(); if(Main\Loader::includeModule('iblock')) { $arIBlockList = $arSitemap['SETTINGS']['IBLOCK_ACTIVE']; if(count($arIBlockList) > 0) { $arIBlocks = array(); $dbIBlock = CIBlock::GetList(array(), array('ID' => array_keys($arIBlockList))); while ($arIBlock = $dbIBlock->Fetch()) { $arIBlocks[$arIBlock['ID']] = $arIBlock; } foreach($arIBlockList as $iblockId => $iblockActive) { if($iblockActive !== 'Y' || !array_key_exists($iblockId, $arIBlocks)) { unset($arIBlockList[$iblockId]); } else { SitemapRuntimeTable::add(array( 'PID' => $PID, 'PROCESSED' => SitemapRuntimeTable::UNPROCESSED, 'ITEM_ID' => $iblockId, 'ITEM_TYPE' => SitemapRuntimeTable::ITEM_TYPE_IBLOCK, )); $fileName = str_replace( array('#IBLOCK_ID#', '#IBLOCK_CODE#', '#IBLOCK_XML_ID#'), array($iblockId, $arIBlocks[$iblockId]['CODE'], $arIBlocks[$iblockId]['XML_ID']), $arSitemap['SETTINGS']['FILENAME_IBLOCK'] ); $sitemapFile = new SitemapRuntime($PID, $fileName, $arSitemapSettings); if($sitemapFile->isExists()) { //$sitemapFile->delete(); } } } } } $NS['LEFT_MARGIN'] = 0; $NS['IBLOCK_LASTMOD'] = 0; $NS['IBLOCK'] = array(); $NS['IBLOCK_MAP'] = array(); if(count($arIBlockList) <= 0) { $v = $arValueSteps['iblock']; $msg = 'SITEMAP_RUN_IBLOCK_EMPTY'."\n"; } else { $v = $arValueSteps['iblock_index']; $msg = 'SITEMAP_RUN_IBLOCK'."\n"; } } else if($v < $arValueSteps['iblock']) { $stepDuration = 10; $ts_finish = microtime(true) + $stepDuration * 0.95; $bFinished = false; $bCheckFinished = false; $currentIblock = false; $iblockId = 0; $dbOldIblockResult = null; $dbIblockResult = null; if(isset($SESSION["SEO_SITEMAP_".$PID])) { $NS['IBLOCK_MAP'] = $SESSION["SEO_SITEMAP_".$PID]; unset($SESSION["SEO_SITEMAP_".$PID]); } while(!$bFinished && microtime(true) <= $ts_finish) { if(!$currentIblock) { $arCurrentIBlock = false; $dbRes = SitemapRuntimeTable::getList(array( 'order' => array('ID' => 'ASC'), 'filter' => array( 'PID' => $PID, 'ITEM_TYPE' => SitemapRuntimeTable::ITEM_TYPE_IBLOCK, 'PROCESSED' => SitemapRuntimeTable::UNPROCESSED, ), 'limit' => 1 )); $currentIblock = $dbRes->fetch(); if($currentIblock) { $iblockId = intval($currentIblock['ITEM_ID']); $dbIBlock = CIBlock::GetByID($iblockId); $arCurrentIBlock = $dbIBlock->Fetch(); if(!$arCurrentIBlock) { SitemapRuntimeTable::update($currentIblock['ID'], array( 'PROCESSED' => SitemapRuntimeTable::PROCESSED )); $NS['LEFT_MARGIN'] = 0; $NS['IBLOCK_LASTMOD'] = 0; $NS['LAST_ELEMENT_ID'] = 0; unset($NS['CURRENT_SECTION']); } else { if($arCurrentIBlock['LIST_PAGE_URL'] == '') $arSitemap['SETTINGS']['IBLOCK_LIST'][$iblockId] = 'N'; if($arCurrentIBlock['SECTION_PAGE_URL'] == '') $arSitemap['SETTINGS']['IBLOCK_SECTION'][$iblockId] = 'N'; if($arCurrentIBlock['DETAIL_PAGE_URL'] == '') $arSitemap['SETTINGS']['IBLOCK_ELEMENT'][$iblockId] = 'N'; $NS['IBLOCK_LASTMOD'] = max($NS['IBLOCK_LASTMOD'], MakeTimeStamp($arCurrentIBlock['TIMESTAMP_X'])); if($NS['LEFT_MARGIN'] <= 0 && $arSitemap['SETTINGS']['IBLOCK_ELEMENT'][$iblockId] != 'N') { $NS['CURRENT_SECTION'] = 0; } $fileName = str_replace( array('#IBLOCK_ID#', '#IBLOCK_CODE#', '#IBLOCK_XML_ID#'), array($iblockId, $arCurrentIBlock['CODE'], $arCurrentIBlock['XML_ID']), $arSitemap['SETTINGS']['FILENAME_IBLOCK'] ); $sitemapFile = new SitemapRuntime($PID, $fileName, $arSitemapSettings); } } } if(!$currentIblock) { $bFinished = true; } elseif(is_array($arCurrentIBlock)) { if($dbIblockResult == null) { if(isset($NS['CURRENT_SECTION'])) { $dbIblockResult = CIBlockElement::GetList( array('ID' => 'ASC'), array( 'IBLOCK_ID' => $iblockId, 'ACTIVE' => 'Y', 'SECTION_ID' => intval($NS['CURRENT_SECTION']), '>ID' => intval($NS['LAST_ELEMENT_ID']), 'SITE_ID' => $arSitemap['SITE_ID'], "ACTIVE_DATE" => "Y" ), false, array('nTopCount' => 1000), array('ID','TIMESTAMP_X','DETAIL_PAGE_URL') ); } else { $NS['LAST_ELEMENT_ID'] = 0; $dbIblockResult = CIBlockSection::GetList( array('LEFT_MARGIN' => 'ASC'), array( 'IBLOCK_ID' => $iblockId, 'GLOBAL_ACTIVE' => 'Y', '>LEFT_BORDER' => intval($NS['LEFT_MARGIN']), ), false, array( 'ID', 'TIMESTAMP_X', 'SECTION_PAGE_URL', 'LEFT_MARGIN', 'IBLOCK_SECTION_ID' ), array('nTopCount' => 100) ); } } if(isset($NS['CURRENT_SECTION'])) { $arElement = $dbIblockResult->fetch(); if($arElement) { if(!is_array($NS['IBLOCK_MAP'][$iblockId])) { $NS['IBLOCK_MAP'][$iblockId] = array(); } if(!array_key_exists($arElement['ID'], $NS['IBLOCK_MAP'][$iblockId])) { $arElement['LANG_DIR'] = $arSitemap['SITE']['DIR']; $bCheckFinished = false; $elementLastmod = MakeTimeStamp($arElement['TIMESTAMP_X']); $NS['IBLOCK_LASTMOD'] = max($NS['IBLOCK_LASTMOD'], $elementLastmod); $NS['LAST_ELEMENT_ID'] = $arElement['ID']; $NS['IBLOCK'][$iblockId]['E']++; $NS['IBLOCK_MAP'][$iblockId][$arElement["ID"]] = 1; $url = SitemapIblock::prepareUrlToReplace($arElement['DETAIL_PAGE_URL'], $arSitemap['SITE_ID']); $url = \CIBlock::ReplaceDetailUrl($url, $arElement, false, "E"); $sitemapFile->addIBlockEntry($url, $elementLastmod); } } elseif(!$bCheckFinished) { $bCheckFinished = true; $dbIblockResult = null; } else { $bCheckFinished = false; unset($NS['CURRENT_SECTION']); $NS['LAST_ELEMENT_ID'] = 0; $dbIblockResult = null; if($dbOldIblockResult) { $dbIblockResult = $dbOldIblockResult; $dbOldIblockResult = null; } } } else { $arSection = $dbIblockResult->fetch(); if($arSection) { $bCheckFinished = false; $sectionLastmod = MakeTimeStamp($arSection['TIMESTAMP_X']); $NS['LEFT_MARGIN'] = $arSection['LEFT_MARGIN']; $NS['IBLOCK_LASTMOD'] = max($NS['IBLOCK_LASTMOD'], $sectionLastmod); $bActive = false; $bActiveElement = false; if(isset($arSitemap['SETTINGS']['IBLOCK_SECTION_SECTION'][$iblockId][$arSection['ID']])) { $bActive = $arSitemap['SETTINGS']['IBLOCK_SECTION_SECTION'][$iblockId][$arSection['ID']] == 'Y'; $bActiveElement = $arSitemap['SETTINGS']['IBLOCK_SECTION_ELEMENT'][$iblockId][$arSection['ID']] == 'Y'; } elseif ($arSection['IBLOCK_SECTION_ID'] > 0) { $dbRes = SitemapRuntimeTable::getList(array( 'filter' => array( 'PID' => $PID, 'ITEM_TYPE' => SitemapRuntimeTable::ITEM_TYPE_SECTION, 'ITEM_ID' => $arSection['IBLOCK_SECTION_ID'], 'PROCESSED' => SitemapRuntimeTable::PROCESSED, ), 'select' => array('ACTIVE', 'ACTIVE_ELEMENT'), 'limit' => 1 )); $parentSection = $dbRes->fetch(); if($parentSection) { $bActive = $parentSection['ACTIVE'] == SitemapRuntimeTable::ACTIVE; $bActiveElement = $parentSection['ACTIVE_ELEMENT'] == SitemapRuntimeTable::ACTIVE; } } else { $bActive = $arSitemap['SETTINGS']['IBLOCK_SECTION'][$iblockId] == 'Y'; $bActiveElement = $arSitemap['SETTINGS']['IBLOCK_ELEMENT'][$iblockId] == 'Y'; } $arRuntimeData = array( 'PID' => $PID, 'ITEM_ID' => $arSection['ID'], 'ITEM_TYPE' => SitemapRuntimeTable::ITEM_TYPE_SECTION, 'ACTIVE' => $bActive ? SitemapRuntimeTable::ACTIVE : SitemapRuntimeTable::INACTIVE, 'ACTIVE_ELEMENT' => $bActiveElement ? SitemapRuntimeTable::ACTIVE : SitemapRuntimeTable::INACTIVE, 'PROCESSED' => SitemapRuntimeTable::PROCESSED, ); if($bActive) { $NS['IBLOCK'][$iblockId]['S']++; $arSection['LANG_DIR'] = $arSitemap['SITE']['DIR']; $url = SitemapIblock::prepareUrlToReplace($arSection['SECTION_PAGE_URL'], $arSitemap['SITE_ID']); $url = \CIBlock::ReplaceDetailUrl($url, $arSection, false, "S"); $sitemapFile->addIBlockEntry($url, $sectionLastmod); } SitemapRuntimeTable::add($arRuntimeData); if($bActiveElement) { $NS['CURRENT_SECTION'] = $arSection['ID']; $NS['LAST_ELEMENT_ID'] = 0; $dbOldIblockResult = $dbIblockResult; $dbIblockResult = null; } } elseif(!$bCheckFinished) { unset($NS['CURRENT_SECTION']); $bCheckFinished = true; $dbIblockResult = null; } else { $bCheckFinished = false; SitemapRuntimeTable::update($currentIblock['ID'], array( 'PROCESSED' => SitemapRuntimeTable::PROCESSED, )); if($arSitemap['SETTINGS']['IBLOCK_LIST'][$iblockId] == 'Y' && $arCurrentIBlock['LIST_PAGE_URL'] <> '') { $NS['IBLOCK'][$iblockId]['I']++; $arCurrentIBlock['IBLOCK_ID'] = $arCurrentIBlock['ID']; $arCurrentIBlock['LANG_DIR'] = $arSitemap['SITE']['DIR']; $url = SitemapIblock::prepareUrlToReplace($arCurrentIBlock['LIST_PAGE_URL'], $arSitemap['SITE_ID']); $url = \CIBlock::ReplaceDetailUrl($url, $arCurrentIBlock, false, ""); $sitemapFile->addIBlockEntry($url, $NS['IBLOCK_LASTMOD']); } if($sitemapFile->isNotEmpty()) { if($sitemapFile->isCurrentPartNotEmpty()) { $sitemapFile->finish(); } else { $sitemapFile->delete(); } if(!is_array($NS['XML_FILES'])) $NS['XML_FILES'] = array(); $xmlFiles = $sitemapFile->getNameList(); $directory = $sitemapFile->getPathDirectory(); foreach($xmlFiles as &$xmlFile) $xmlFile = $directory.$xmlFile; $NS['XML_FILES'] = array_unique(array_merge($NS['XML_FILES'], $xmlFiles)); } else { $sitemapFile->delete(); } $currentIblock = false; $NS['LEFT_MARGIN'] = 0; $NS['IBLOCK_LASTMOD'] = 0; unset($NS['CURRENT_SECTION']); $NS['LAST_ELEMENT_ID'] = 0; } } } } if($v < $arValueSteps['iblock']-1) { $msg = 'SITEMAP_RUN_IBLOCK_NAME'.' '.$arCurrentIBlock['NAME']."\n"; $v++; } if($bFinished) { $v = $arValueSteps['iblock']; $msg = 'SITEMAP_RUN_FINALIZE'."\n"; } } elseif($v < $arValueSteps['forum_index']) { $NS['time_start'] = microtime(true); $arForumList = array(); if(!empty($arSitemap['SETTINGS']['FORUM_ACTIVE'])) { foreach ($arSitemap['SETTINGS']['FORUM_ACTIVE'] as $forumId => $active) { if ($active == "Y") { $arForumList[$forumId] = "Y"; } } } if(count($arForumList) > 0 && Main\Loader::includeModule('forum')) { $arForums = array(); $db_res = CForumNew::GetListEx( array(), array( '@ID' => array_keys($arForumList), "ACTIVE" => "Y", "SITE_ID" => $arSitemap['SITE_ID'], "!TOPICS" => 0 ) ); while ($res = $db_res->Fetch()) { $arForums[$res['ID']] = $res; } $arForumList = array_intersect_key($arForums, $arForumList); foreach($arForumList as $id => $forum) { SitemapRuntimeTable::add(array( 'PID' => $PID, 'PROCESSED' => SitemapRuntimeTable::UNPROCESSED, 'ITEM_ID' => $id, 'ITEM_TYPE' => SitemapRuntimeTable::ITEM_TYPE_FORUM) ); $fileName = str_replace('#FORUM_ID#', $forumId, $arSitemap['SETTINGS']['FILENAME_FORUM']); $sitemapFile = new SitemapRuntime($PID, $fileName, $arSitemapSettings); } } $NS['FORUM_CURRENT_TOPIC'] = 0; if(count($arForumList) <= 0) { $v = $arValueSteps['forum']; $msg = 'SITEMAP_RUN_FORUM_EMPTY'."\n"; } else { $v = $arValueSteps['forum_index']; $msg = 'SITEMAP_RUN_FORUM'."\n"; } } else if($v < $arValueSteps['forum']) { $stepDuration = 10; $ts_finish = microtime(true) + $stepDuration * 0.95; $bFinished = false; $bCheckFinished = false; $currentForum = false; $forumId = 0; $dbTopicResult = null; $arTopic = null; while(!$bFinished && microtime(true) <= $ts_finish && CModule::IncludeModule("forum")) { if(!$currentForum) { $arCurrentForum = false; $dbRes = SitemapRuntimeTable::getList(array( 'order' => array('ID' => 'ASC'), 'filter' => array( 'PID' => $PID, 'ITEM_TYPE' => SitemapRuntimeTable::ITEM_TYPE_FORUM, 'PROCESSED' => SitemapRuntimeTable::UNPROCESSED, ), 'limit' => 1 )); $currentForum = $dbRes->fetch(); if($currentForum) { $forumId = intval($currentForum['ITEM_ID']); $db_res = CForumNew::GetListEx( array(), array( 'ID' => $forumId, "ACTIVE" => "Y", "SITE_ID" => $arSitemap['SITE_ID'], "!TOPICS" => 0 ) ); $arCurrentForum = $db_res->Fetch(); if(!$arCurrentForum) { SitemapRuntimeTable::update($currentForum['ID'], array( 'PROCESSED' => SitemapRuntimeTable::PROCESSED )); } else { $fileName = str_replace('#FORUM_ID#', $forumId, $arSitemap['SETTINGS']['FILENAME_FORUM']); $sitemapFile = new SitemapRuntime($PID, $fileName, $arSitemapSettings); } } } if(!$currentForum) { $bFinished = true; } elseif(is_array($arCurrentForum)) { $bActive = (array_key_exists($forumId, $arSitemap['SETTINGS']['FORUM_TOPIC']) && $arSitemap['SETTINGS']['FORUM_TOPIC'][$forumId] == "Y"); if($bActive) { if($dbTopicResult == null) { $dbTopicResult = CForumTopic::GetList( array("LAST_POST_DATE" => "DESC"), array_merge( array( "FORUM_ID" => $forumId, "APPROVED" => "Y"), ($NS['FORUM_CURRENT_TOPIC'] > 0 ? array( ">ID" => $NS["FORUM_CURRENT_TOPIC"] ) : array() ) ), false, 0, array('nTopCount' => 100) ); } if(($arTopic = $dbTopicResult->fetch()) && $arTopic) { $NS["FORUM_CURRENT_TOPIC"] = $arTopic["ID"]; $url = CForumNew::PreparePath2Message( $arCurrentForum["PATH2FORUM_MESSAGE"], array( "FORUM_ID" => $arCurrentForum["ID"], "TOPIC_ID" => $arTopic["ID"], "TITLE_SEO" => $arTopic["TITLE_SEO"], "MESSAGE_ID" => "s", "SOCNET_GROUP_ID" => $arTopic["SOCNET_GROUP_ID"], "OWNER_ID" => $arTopic["OWNER_ID"], "PARAM1" => $arTopic["PARAM1"], "PARAM2" => $arTopic["PARAM2"] ) ); $sitemapFile->addIBlockEntry($url, MakeTimeStamp($arTopic['LAST_POST_DATE'])); } } else { $url = CForumNew::PreparePath2Message( $arCurrentForum["PATH2FORUM_MESSAGE"], array( "FORUM_ID" => $arCurrentForum["ID"], "TOPIC_ID" => $arCurrentForum["TID"], "TITLE_SEO" => $arCurrentForum["TITLE_SEO"], "MESSAGE_ID" => "s", "SOCNET_GROUP_ID" => $arCurrentForum["SOCNET_GROUP_ID"], "OWNER_ID" => $arCurrentForum["OWNER_ID"], "PARAM1" => $arCurrentForum["PARAM1"], "PARAM2" => $arCurrentForum["PARAM2"] ) ); $sitemapFile->addIBlockEntry($url, MakeTimeStamp($arCurrentForum['LAST_POST_DATE'])); } if (empty($arTopic)) { $bCheckFinished = false; SitemapRuntimeTable::update($currentForum['ID'], array( 'PROCESSED' => SitemapRuntimeTable::PROCESSED, )); if($sitemapFile->isNotEmpty()) { if($sitemapFile->isCurrentPartNotEmpty()) { $sitemapFile->finish(); } else { $sitemapFile->delete(); } if(!is_array($NS['XML_FILES'])) $NS['XML_FILES'] = array(); $xmlFiles = $sitemapFile->getNameList(); $directory = $sitemapFile->getPathDirectory(); foreach($xmlFiles as &$xmlFile) $xmlFile = $directory.$xmlFile; $NS['XML_FILES'] = array_unique(array_merge($NS['XML_FILES'], $xmlFiles)); } else { $sitemapFile->delete(); } $currentForum = false; $dbTopicResult = null; $NS['FORUM_CURRENT_TOPIC'] = 0; } } } if($v < $arValueSteps['forum']-1) { $msg = 'SITEMAP_RUN_FORUM_NAME'.' '.$arCurrentForum['NAME']."\n"; $v++; } if($bFinished) { $v = $arValueSteps['forum']; $msg = 'SITEMAP_RUN_FINALIZE'."\n"; } } else { SitemapRuntimeTable::clearByPid($PID); $arFiles = array(); $sitemapFile = new SitemapIndex($arSitemap['SETTINGS']['FILENAME_INDEX'], $arSitemapSettings); if(count($NS['XML_FILES']) > 0) { foreach ($NS['XML_FILES'] as $xmlFile) { $arFiles[] = new IO\File(IO\Path::combine( $sitemapFile->getSiteRoot(), $xmlFile ), $arSitemap['SITE_ID']); } } $sitemapFile->createIndex($arFiles); $arExistedSitemaps = array(); if($arSitemap['SETTINGS']['ROBOTS'] == 'Y') { $sitemapUrl = $sitemapFile->getUrl(); $robotsFile = new RobotsFile($arSitemap['SITE_ID']); $robotsFile->addRule( array(RobotsFile::SITEMAP_RULE, $sitemapUrl) ); $arSitemapLinks = $robotsFile->getRules(RobotsFile::SITEMAP_RULE); if(count($arSitemapLinks) > 1) // 1 - just added rule { foreach($arSitemapLinks as $rule) { if($rule[1] != $sitemapUrl) { $arExistedSitemaps[] = $rule[1]; } } } } $v = $arValueSteps['index']; } if($v == $arValueSteps['index']) { SitemapTable::update($ID, array('DATE_RUN' => new Bitrix\Main\Type\DateTime())); } print $msg.' '.'SEO_SITEMAP_RUN_TITLE'.' '.$v."\n"; if($v < $arValueSteps['index']) { if(isset($NS['IBLOCK_MAP'])) { $SESSION["SEO_SITEMAP_".$PID] = $NS['IBLOCK_MAP']; unset($NS['IBLOCK_MAP']); } } return $v; } $v = 0; while($v < 100) { $v = generate($v); } /* sitemap regen end -------------------------------------------------------------*/ /* sitemap catalog file start -------------------------------------------------------------*/ $sitemap_catalog = []; $sitemap_all_brands_search_res = CIBlockElement::GetList( [], [ "IBLOCK_ID" => IBLOCK_ID_BRANDS, ], false, false, [ "CODE", "PROPERTY_UID" ] ); while($sitemap_all_brands_search_ob = $sitemap_all_brands_search_res->GetNextElement()) { $brand = $sitemap_all_brands_search_ob->GetFields(); $brand['MODELS'] = []; $sitemap_catalog[$brand['PROPERTY_UID_VALUE']] = $brand; } $sitemap_all_models_search_res = CIBlockElement::GetList( [], [ "IBLOCK_ID" => IBLOCK_ID_MODELS, ], false, false, [ "CODE", "PROPERTY_BRAND_UID"] ); while($sitemap_all_models_search_ob = $sitemap_all_models_search_res->GetNextElement()) { $model = $sitemap_all_models_search_ob->GetFields(); $model['PROPERTIES'] = $sitemap_all_models_search_ob->GetProperties(); array_push($sitemap_catalog[$model['PROPERTY_BRAND_UID_VALUE']]['MODELS'], $model); } $url = "https://".SITE_SERVER_NAME."/catalog"; $lastmod = date(DATE_W3C); $sitemap_catalog_string = "\n\n"; foreach($sitemap_catalog AS $brand) { $sitemap_catalog_string .= "".$url."/".$brand['CODE']."/"."".$lastmod.""."\n"; foreach($brand['MODELS'] AS $model) { $sitemap_catalog_string .= "".$url."/".$brand['CODE']."/".$model['CODE']."/"."".$lastmod.""."\n"; } } $sitemap_car_search_res = CIBlockElement::GetList( [ "NAME" => "ASC" ], [ "IBLOCK_ID" => IBLOCK_ID_CATALOG_CARS_NEW, ], false, [], [] ); while($sitemap_car_search_ob = $sitemap_car_search_res->GetNextElement()) { $car_existed = $sitemap_car_search_ob->GetFields(); $sitemap_catalog_string .= "https://".SITE_SERVER_NAME.$car_existed['DETAIL_PAGE_URL']."".$lastmod.""."\n"; } $sitemap_catalog_string .= ""."\n"; file_put_contents("/home/bitrix/www/sitemap-catalog.xml", $sitemap_catalog_string); $chunk = "https://www.evoleasing.ru/sitemap-catalog.xml".date(DATE_W3C).""; $sitemap_index = file_get_contents("/home/bitrix/www/sitemap.xml"); $sitemap_index = str_replace(">", ">\n", $sitemap_index); $sitemap_index = str_replace("", $chunk, $sitemap_index); $sitemap_index = str_replace("\n", "", $sitemap_index); file_put_contents("/home/bitrix/www/sitemap.xml", $sitemap_index); /* sitemap catalog file end -------------------------------------------------------------*/ /* sitemap regions file start -------------------------------------------------------------*/ $sitemap_regions = []; $sitemap_brands = []; //IBLOCK_ID_CITIES $sitemap_all_cities_search_res = CIBlockElement::GetList( [ "NAME" => "ASC" ], [ "IBLOCK_ID" => IBLOCK_ID_CITIES, ], false, false, [ "CODE", ] ); while($sitemap_all_cities_search_ob = $sitemap_all_cities_search_res->GetNextElement()) { $city = $sitemap_all_cities_search_ob->GetFields(); $sitemap_regions[] = $city['CODE']; } $sitemap_all_brands_search_res = CIBlockElement::GetList( [ "NAME" => "ASC" ], [ "IBLOCK_ID" => IBLOCK_ID_BRANDS, ], false, false, [ "CODE", "PROPERTY_UID" ] ); while($sitemap_all_brands_search_ob = $sitemap_all_brands_search_res->GetNextElement()) { $brand = $sitemap_all_brands_search_ob->GetFields(); $brand['MODELS'] = []; $sitemap_brands[$brand['PROPERTY_UID_VALUE']] = $brand; } $sitemap_all_models_search_res = CIBlockElement::GetList( [], [ "IBLOCK_ID" => IBLOCK_ID_MODELS, "PROPERTY_PROMO_VALUE" => "Да" ], false, false, [ "CODE", "PROPERTY_BRAND_UID"] ); while($sitemap_all_models_search_ob = $sitemap_all_models_search_res->GetNextElement()) { $model = $sitemap_all_models_search_ob->GetFields(); $model['PROPERTIES'] = $sitemap_all_models_search_ob->GetProperties(); array_push($sitemap_brands[$model['PROPERTY_BRAND_UID_VALUE']]['MODELS'], $model); } $url = "https://".SITE_SERVER_NAME."/regions"; $lastmod = date(DATE_W3C); $sitemap_regions_string = "\n\n"; $sitemap_regions_string .= "".$url."/"."".$lastmod.""."\n"; foreach($sitemap_regions AS $city) { $sitemap_regions_string .= "".$url."/".$city."/"."".$lastmod.""."\n"; foreach($sitemap_brands AS $brand) { $sitemap_regions_string .= "".$url."/".$city."/".$brand['CODE']."/"."".$lastmod.""."\n"; foreach($brand['MODELS'] AS $model) { $sitemap_regions_string .= "".$url."/".$city."/".$brand['CODE']."/".$model['CODE']."/"."".$lastmod.""."\n"; } } } $sitemap_regions_string .= ""."\n"; file_put_contents("/home/bitrix/www/sitemap-regions.xml", $sitemap_regions_string); $chunk = "https://www.evoleasing.ru/sitemap-regions.xml".date(DATE_W3C).""; $sitemap_index = file_get_contents("/home/bitrix/www/sitemap.xml"); $sitemap_index = str_replace(">", ">\n", $sitemap_index); $sitemap_index = str_replace("", $chunk, $sitemap_index); $sitemap_index = str_replace("\n", "", $sitemap_index); file_put_contents("/home/bitrix/www/sitemap.xml", $sitemap_index); /* sitemap regions file end -------------------------------------------------------------*/ \Bitrix\Main\Mail\Event::send([ "EVENT_NAME" => "ILSA_UPDATE", "LID" => "s1", "C_FIELDS" => Array( "MESSAGE" => $traceback_message, ) ]); die(); ?>