| Current Path : /var/www/element/data/www/greenpr.ru/bitrix3/modules/search/classes/general/ |
| Current File : /var/www/element/data/www/greenpr.ru/bitrix3/modules/search/classes/general/sitemap.php |
<?
IncludeModuleLangFile(__FILE__);
class CAllSiteMap extends CDBResult
{
var $m_href=""; //URL for result
var $m_error=""; //Error message
var $m_events=array(); //Events cache
var $m_errors_count=0; //Number of wrong URLs
var $m_errors_href=""; //URL for errors file
function Create($site_id, $max_execution_time, $NS, $arOptions = array())
{
@set_time_limit(0);
if(!is_array($NS))
{
$NS = Array(
"ID"=>0,
"CNT"=>0,
"FILE_SIZE"=>0,
"FILE_ID"=>1,
"FILE_URL_CNT"=>0,
"ERROR_CNT"=>0,
"PARAM2"=>0,
);
}
else
{
$NS = Array(
"ID"=>intval($NS["ID"]),
"CNT"=>intval($NS["CNT"]),
"FILE_SIZE"=>intval($NS["FILE_SIZE"]),
"FILE_ID"=>intval($NS["FILE_ID"]),
"FILE_URL_CNT"=>intval($NS["FILE_URL_CNT"]),
"ERROR_CNT"=>intval($NS["ERROR_CNT"]),
"PARAM2"=>intval($NS["ID"]),
);
}
if(is_array($max_execution_time))
{
$record_limit = $max_execution_time[1];
$max_execution_time = $max_execution_time[0];
}
else
{
$record_limit = 5000;
}
if($max_execution_time > 0)
{
$end_of_execution = time() + $max_execution_time;
}
else
{
$end_of_execution = 0;
}
if(is_array($arOptions) && ($arOptions["FORUM_TOPICS_ONLY"] == "Y"))
$bForumTopicsOnly = CModule::IncludeModule("forum");
else
$bForumTopicsOnly = false;
if(is_array($arOptions) && ($arOptions["BLOG_NO_COMMENTS"] == "Y"))
$bBlogNoComments = CModule::IncludeModule("blog");
else
$bBlogNoComments = false;
$rsSite=CSite::GetByID($site_id);
if($arSite=$rsSite->Fetch())
{
$SERVER_NAME = trim($arSite["SERVER_NAME"]);
if(strlen($SERVER_NAME) <= 0)
{
$this->m_error=GetMessage("SEARCH_ERROR_EMPTY_SERVER_NAME")."<br>";
return false;
}
//Cache events
$events = GetModuleEvents("search", "OnSearchGetURL");
while ($arEvent = $events->Fetch())
$this->m_events[]=$arEvent;
//Clear error file
if($NS["ID"]==0 && $NS["CNT"]==0)
{
$e=fopen($arSite["ABS_DOC_ROOT"].$arSite["DIR"]."sitemap_errors.xml", "w");
$strBegin="<?xml version='1.0' encoding='UTF-8'?>\n<urlset xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.sitemaps.org/schemas/sitemap/0.9\" xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n";
fwrite($e, $strBegin);
}
//Or open it for append
else
{
$e=fopen($arSite["ABS_DOC_ROOT"].$arSite["DIR"]."sitemap_errors.xml", "a");
}
if(!$e)
{
$this->m_error=GetMessage("SEARCH_ERROR_OPEN_FILE")." ".$arSite["ABS_DOC_ROOT"].$arSite["DIR"]."sitemap_errors.xml"."<br>";
return false;
}
//Open current sitemap file
if($NS["FILE_SIZE"]==0)
{
$f=fopen($arSite["ABS_DOC_ROOT"].$arSite["DIR"]."sitemap_".sprintf("%03d",$NS["FILE_ID"]).".xml", "w");
$strBegin="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.sitemaps.org/schemas/sitemap/0.9\" xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n";
fwrite($f, $strBegin);
$NS["FILE_SIZE"]+=strlen($strBegin);
}
else
{
$f=fopen($arSite["ABS_DOC_ROOT"].$arSite["DIR"]."sitemap_".sprintf("%03d",$NS["FILE_ID"]).".xml", "a");
}
if(!$f)
{
$this->m_error=GetMessage("SEARCH_ERROR_OPEN_FILE")." ".$arSite["ABS_DOC_ROOT"].$arSite["DIR"]."sitemap_".sprintf("%03d",$NS["FILE_ID"]).".xml"."<br>";
return false;
}
$this->GetURLs($site_id, $NS["ID"], $record_limit);
$bFileIsFull=false;
while(!$bFileIsFull && $ar=$this->Fetch())
{
$record_limit--;
$NS["ID"]=$ar["ID"];
if(strlen($ar["URL"]) < 1)
continue;
if($bForumTopicsOnly && ($ar["MODULE_ID"] == "forum"))
{
//Forum topic ID
$PARAM2 = intval($ar["PARAM2"]);
if($NS["PARAM2"] < $PARAM2)
{
$NS["PARAM2"] = $PARAM2;
$arTopic = CForumTopic::GetByIDEx($PARAM2);
if($arTopic)
$ar["FULL_DATE_CHANGE"] = $arTopic["LAST_POST_DATE"];
}
else
{
continue;
}
}
if($bBlogNoComments && ($ar["MODULE_ID"] == "blog"))
{
if(substr($ar["ITEM_ID"], 0, 1) === "C")
continue;
}
$strURL = $this->LocationEncode("http://".$ar["SERVER_NAME"].$ar["URL"]);
$strTime = $this->TimeEncode(MakeTimeStamp(ConvertDateTime($ar["FULL_DATE_CHANGE"], "DD.MM.YYYY HH:MI:SS"), "DD.MM.YYYY HH:MI:SS"));
$strToWrite="\t<url>\n\t\t<loc>".$strURL."</loc>\n\t\t<lastmod>".$strTime."</lastmod>\n\t</url>\n";
if(strlen($strURL)>2048 || preg_match("/[\\x00-\\x20\\x7F-\\xFF]/", $strURL))
{
fwrite($e, $strToWrite);
$NS["ERROR_CNT"]++;
}
else
{
fwrite($f, $strToWrite);
$NS["CNT"]++;
$NS["FILE_SIZE"]+=strlen($strToWrite);
$NS["FILE_URL_CNT"]++;
}
//Next File on file size or url count limit
if($NS["FILE_SIZE"]>9000000 || $NS["FILE_URL_CNT"]>=50000)
{
$bFileIsFull=true;
}
elseif($end_of_execution)
{
if(time() > $end_of_execution)
{
fclose($e);
fclose($f);
return $NS;
}
}
}
if($bFileIsFull)
{
fwrite($e,"</urlset>\n");
fclose($e);
fwrite($f,"</urlset>\n");
fclose($f);
$NS["FILE_SIZE"]=0;
$NS["FILE_URL_CNT"]=0;
$NS["FILE_ID"]++;
return $NS;
}
elseif($record_limit<=0)
{
return $NS;
}
else
{
fwrite($e,"</urlset>\n");
fclose($e);
fwrite($f,"</urlset>\n");
fclose($f);
}
//WRITE INDEX FILE HERE
$f=fopen($arSite["ABS_DOC_ROOT"].$arSite["DIR"]."sitemap_index.xml", "w");
if(!$f)
{
$this->m_error=GetMessage("SEARCH_ERROR_OPEN_FILE")." ".$arSite["ABS_DOC_ROOT"].$arSite["DIR"]."sitemap_index.xml"."<br>";
return false;
}
$strBegin="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<sitemapindex xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.sitemaps.org/schemas/sitemap/0.9\" xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n";
fwrite($f, $strBegin);
for($i = 0; $i <= $NS["FILE_ID"]; $i++)
{
$strFile = $arSite["DIR"]."sitemap_".sprintf("%03d",$i).".xml";
$strTime = $this->TimeEncode(filemtime($arSite["ABS_DOC_ROOT"].$strFile));
fwrite($f,"\t<sitemap>\n\t\t<loc>http://".$arSite["SERVER_NAME"].$strFile."</loc>\n\t\t<lastmod>".$strTime."</lastmod>\n\t</sitemap>\n");
}
fwrite($f,"</sitemapindex>\n");
fclose($f);
$this->m_errors_count=$NS["ERROR_CNT"];
$this->m_errors_href="http://".$arSite["SERVER_NAME"].$arSite["DIR"]."sitemap_errors.xml";
$this->m_href="http://".$arSite["SERVER_NAME"].$arSite["DIR"]."sitemap_index.xml";
return true;
}
else
{
$this->m_error=GetMessage("SEARCH_ERROR_SITE_ID")."<br>";
return false;
}
}
function Fetch()
{
static $index = false;
$r = parent::Fetch();
if($r)
{
if(strlen($r["SITE_URL"])>0)
$r["URL"] = $r["SITE_URL"];
if(substr($r["URL"], 0, 1)=="=")
{
foreach($this->m_events as $arEvent)
$r["URL"] = ExecuteModuleEvent($arEvent, $r);
}
$r["URL"] = str_replace(
array("#LANG#", "#SITE_DIR#", "#SERVER_NAME#"),
array($r["DIR"], $r["DIR"], $r["SERVER_NAME"]),
$r["URL"]
);
$r["URL"] = preg_replace("'/+'s", "/", $r["URL"]);
if(defined("BX_DISABLE_INDEX_PAGE") && BX_DISABLE_INDEX_PAGE)
{
if(!$index)
$index = "#/(".str_replace(" ", "|", preg_quote(implode(" ",GetDirIndexArray()), "#")).")$#";
$r["URL"] = preg_replace($index, "/", $r["URL"]);
}
}
return $r;
}
function LocationEncode($str)
{
static $search = array("&", "'", "\"", ">", "<");
static $replace = array("&", "'", """, ">", "<");
return str_replace($search, $replace, $str);
}
function TimeEncode($iTime)
{
$iTZ = date("Z", $iTime);
$iTZHour = intval(abs($iTZ)/3600);
$iTZMinutes = intval((abs($iTZ)-$iTZHour*3600)/60);
$strTZ = ($iTZ<0? "-": "+").sprintf("%02d:%02d", $iTZHour, $iTZMinutes);
return date("Y-m-d",$iTime)."T".date("H:i:s",$iTime).$strTZ;
}
}
?>