diff --git a/local/catalog_sitemap_generation.php b/local/catalog_sitemap_generation.php index 402f815..99a1fee 100644 --- a/local/catalog_sitemap_generation.php +++ b/local/catalog_sitemap_generation.php @@ -1,5 +1,4 @@ IBLOCK_ID_BRANDS, ], false, false, [ "CODE", "PROPERTY_UID" ] ); -while($all_brands_search_ob = $all_brands_search_res->GetNextElement()) +$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 = $all_brands_search_ob->GetFields(); + $brand = $sitemap_all_brands_search_ob->GetFields(); $brand['MODELS'] = []; - $catalog[$brand['PROPERTY_UID_VALUE']] = $brand; + $sitemap_catalog[$brand['PROPERTY_UID_VALUE']] = $brand; } -$all_models_search_res = CIBlockElement::GetList( [], [ "IBLOCK_ID" => IBLOCK_ID_MODELS, ], false, false, [ "CODE", "PROPERTY_BRAND_UID"] ); -while($all_models_search_ob = $all_models_search_res->GetNextElement()) +$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 = $all_models_search_ob->GetFields(); - $model['PROPERTIES'] = $all_models_search_ob->GetProperties(); + $model = $sitemap_all_models_search_ob->GetFields(); + $model['PROPERTIES'] = $sitemap_all_models_search_ob->GetProperties(); - array_push($catalog[$model['PROPERTY_BRAND_UID_VALUE']]['MODELS'], $model); - - //print_r($model); - //array_push( $bitrix_existed_models, $model_search['PROPERTIES']['UID']['VALUE'] ); + array_push($sitemap_catalog[$model['PROPERTY_BRAND_UID_VALUE']]['MODELS'], $model); } -//print_r($catalog); - -//7f7534ad-5382-469c-8e40-f77267fb5644 - $url = "https://".SITE_SERVER_NAME."/catalog"; $lastmod = date(DATE_W3C); -$strBegin = "\n\n"; +$sitemap_catalog_string = "\n\n"; -foreach($catalog AS $brand) +foreach($sitemap_catalog AS $brand) { - $strBegin .= "".$url."/".$brand['CODE']."/"."".$lastmod.""."\n"; + $sitemap_catalog_string .= "".$url."/".$brand['CODE']."/"."".$lastmod.""."\n"; foreach($brand['MODELS'] AS $model) { - $strBegin .= "".$url."/".$brand['CODE']."/".$model['CODE']."/"."".$lastmod.""."\n"; + $sitemap_catalog_string .= "".$url."/".$brand['CODE']."/".$model['CODE']."/"."".$lastmod.""."\n"; } } -$car_search_res = CIBlockElement::GetList( [ "NAME" => "ASC" ], [ "IBLOCK_ID" => IBLOCK_ID_CATALOG_CARS_NEW, ], false, [], [] ); -while($car_search_ob = $car_search_res->GetNextElement()) +$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 = $car_search_ob->GetFields(); - $strBegin .= "https://".SITE_SERVER_NAME.$car_existed['DETAIL_PAGE_URL']."".$lastmod.""."\n"; + $car_existed = $sitemap_car_search_ob->GetFields(); + $sitemap_catalog_string .= "https://".SITE_SERVER_NAME.$car_existed['DETAIL_PAGE_URL']."".$lastmod.""."\n"; } -$strBegin .= ""."\n"; +$sitemap_catalog_string .= ""."\n"; -file_put_contents("../sitemap-catalog.xml", $strBegin); -//print $strBegin; +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("../sitemap.xml"); +$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("../sitemap.xml", $sitemap_index); - +file_put_contents("/home/bitrix/www/sitemap.xml", $sitemap_index); die(); diff --git a/local/ilsa_update.php b/local/ilsa_update.php index 3e131e1..d6f49dd 100644 --- a/local/ilsa_update.php +++ b/local/ilsa_update.php @@ -10,6 +10,19 @@ define('NOT_CHECK_PERMISSIONS', true); $_SERVER['DOCUMENT_ROOT'] = dirname(__DIR__, 1); require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php'); CModule::IncludeModule('iblock'); +CModule::IncludeModule('search'); +use Bitrix\Main; +use Bitrix\Main\IO; +use Bitrix\Main\SiteTable; +use Bitrix\Main\Localization\Loc; +use Bitrix\Seo\RobotsFile; +use Bitrix\Seo\SitemapIblock; +use Bitrix\Seo\SitemapTable; +use Bitrix\Seo\SitemapIndex; +use Bitrix\Seo\SitemapRuntime; +use Bitrix\Seo\SitemapRuntimeTable; + +Main\Loader::includeModule('seo'); $arrContextOptions = [ "ssl" => [ @@ -18,12 +31,21 @@ $arrContextOptions = [ ], ]; + $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()) @@ -32,6 +54,10 @@ while($all_brands_search_ob = $all_brands_search_res->GetNextElement()) $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, [] ); @@ -41,6 +67,10 @@ while($all_models_search_ob = $all_models_search_res->GetNextElement()) $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, [] ); @@ -49,6 +79,10 @@ while($all_modifications_search_ob = $all_modifications_search_res->GetNextEleme $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, [] ); @@ -58,6 +92,10 @@ while($all_cars_search_ob = $all_cars_search_res->GetNextElement()) $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"; @@ -527,7 +565,7 @@ foreach($json AS $car) { $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); @@ -602,16 +640,17 @@ foreach($json AS $car) { $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($car_with_problem); + 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, []); } @@ -632,24 +671,30 @@ foreach($car_codes AS $cc => $count) } */ -print "\n\nновых ТС: ".$c."\n\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_existed_cars AS $existed_car_uid) +foreach($bitrix_enabled_cars AS $enabled_car_uid) { - if(!in_array($existed_car_uid, $json_new_cars)) + if(!in_array($enabled_car_uid, $json_new_cars)) { $h++; - set_car_activity($existed_car_uid, "N"); + set_car_activity($enabled_car_uid, "N"); } } -print "\n\nснято с публикации ТС: ".$h."\n\n"; +$trace = "Снято с публикации ТС: ".$h; +$traceback_message .= $trace."\n"; +print "\n\n".$trace."\n\n"; -print "bitrix_existed_brands\n"; +//print "bitrix_existed_brands\n"; $c = 0; foreach($bitrix_existed_brands AS $k => $b) { @@ -660,7 +705,7 @@ foreach($bitrix_existed_brands AS $k => $b) } } -print "bitrix_brands\n"; +//print "bitrix_brands\n"; $c = 0; foreach($bitrix_brands AS $k => $b) { @@ -672,56 +717,1099 @@ foreach($bitrix_brands AS $k => $b) } $md = 0; -foreach($bitrix_existed_modifications AS $existed_modifications_code) +foreach($bitrix_enabled_modifications AS $enabled_modifications_code) { - if(!in_array($existed_modifications_code, $bitrix_modifications_codes)) + if(!in_array($enabled_modifications_code, $bitrix_modifications_codes)) { - set_modification_activity($existed_modifications_code, "N"); + set_modification_activity($enabled_modifications_code, "N"); $md++; } } -//print "API_MODELS:\n"; -//print_r($api_models); - -print "\n\nснято с публикации модификаций: ".$md."\n"; +$trace = "Снято с публикации модификаций: ".$md; +$traceback_message .= $trace."\n"; +print "\n\n".$trace."\n\n"; $m = 0; -foreach($bitrix_existed_models AS $existed_model_uid) +foreach($bitrix_enabled_models AS $enabled_model_uid) { - if($bitrix_models[$existed_model_uid] !== null) + if($bitrix_models[$enabled_model_uid] !== null) {} else { - if(!in_array($existed_model_uid, $api_models)) + if(!in_array($enabled_model_uid, $api_models)) { - set_model_activity($existed_model_uid, "N"); + set_model_activity($enabled_model_uid, "N"); $m++; } } } -//print "API_BRANDS:\n"; -//print_r($api_brands); - -print "\n\nснято с публикации моделей: ".$m."\n"; +$trace = "Снято с публикации моделей: ".$m; +$traceback_message .= $trace."\n"; +print "\n\n".$trace."\n\n"; $b = 0; -foreach($bitrix_existed_brands AS $existed_brand_uid) +foreach($bitrix_enabled_brands AS $enabled_brand_uid) { - if($bitrix_brands[$existed_brand_uid] !== null) + if($bitrix_brands[$enabled_brand_uid] !== null) {} else { - if(!in_array($existed_brand_uid, $api_brands)) + if(!in_array($enabled_brand_uid, $api_brands)) { - set_brand_activity($existed_brand_uid, "N"); + set_brand_activity($enabled_brand_uid, "N"); $b++; } } } -print "\n\nснято с публикации марок: ".$b."\n"; +$trace = "Снято с публикации марок: ".$b; +$traceback_message .= $trace."\n"; +print "\n\n".$trace."\n\n"; + + +/* search reindex start -------------------------------------------------------------*/ + +CSearch::ReIndexAll(false); + +/* 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 -------------------------------------------------------------*/ + +\Bitrix\Main\Mail\Event::send([ + "EVENT_NAME" => "ILSA_UPDATE", + "LID" => "s1", + "C_FIELDS" => Array( + "MESSAGE" => $traceback_message, + ) +]); die();