Current Path : /var/www/www-root/data/www/monolith-realty.ru/bitrix/modules/search/classes/general/ |
Current File : /var/www/www-root/data/www/monolith-realty.ru/bitrix/modules/search/classes/general/statistic.php |
<?php class CSearchStatistic { var $phrase_id = 0; var $_phrase = false; var $_tags = false; var $_session_id = ""; var $_stat_sess_id = false; function __construct($phrase = "", $tags = "") { $phrase = ToLower(trim($phrase, " \t\n\r")); if ($l = mb_strlen($phrase)) { if ($l > 250) { $p = mb_strrpos($phrase, ' '); if ($p === false) $this->_phrase = mb_substr($phrase, 0, 250); else $this->_phrase = mb_substr($phrase, 0, $p); } else { $this->_phrase = $phrase; } } else { $this->_phrase = false; } $arTags = tags_prepare($tags); if (count($arTags)) { asort($arTags); $this->_tags = implode(", ", $arTags); } else { $this->_tags = false; } $this->_session_id = bitrix_sessid(); if (isset($_SESSION["SESS_SESSION_ID"])) $this->_stat_sess_id = intval($_SESSION["SESS_SESSION_ID"]); } function PhraseStat($result_count = 0, $page_num = 0) { $DB = CDatabase::GetModuleConnection('search'); $DB->StartUsingMasterOnly(); $result_count = intval($result_count); $page_num = intval($page_num); $strSql = " SELECT * FROM b_search_phrase WHERE SESSION_ID = '".$DB->ForSQL($this->_session_id)."' AND ".($this->_phrase === false? "PHRASE IS NULL": "PHRASE = '".$DB->ForSQL($this->_phrase)."'")." AND ".($this->_tags === false? "TAGS IS NULL": "TAGS = '".$DB->ForSQL($this->_tags)."'")." "; $rs = $DB->Query($strSql); if ($ar = $rs->Fetch()) { $this->phrase_id = $ar["ID"]; if ($page_num > $ar["PAGES"]) $DB->Query("UPDATE b_search_phrase SET PAGES = ".$page_num." WHERE ID = ".$ar["ID"]); } else { $this->phrase_id = $DB->Add("b_search_phrase", array( "~TIMESTAMP_X" => $DB->CurrentTimeFunction(), "SITE_ID" => SITE_ID, "~RESULT_COUNT" => $result_count, "~PAGES" => $page_num, "SESSION_ID" => $this->_session_id, "PHRASE" => $this->_phrase, "TAGS" => $this->_tags, "STAT_SESS_ID" => $this->_stat_sess_id, ) ); } $DB->StopUsingMasterOnly(); } public static function GetList($arOrder = false, $arFilter = false, $arSelect = false, $bGroup = false) { $DB = CDatabase::GetModuleConnection('search'); static $arDefSelect = array( "ID", "TIMESTAMP_X", "SITE_ID", "RESULT_COUNT", "PAGES", "PHRASE", "TAGS", "URL_TO", "URL_TO_404", "URL_TO_SITE_ID", "STAT_SESS_ID", ); if (!is_array($arSelect)) $arSelect = array(); if (count($arSelect) < 1) $arSelect = $arDefSelect; if (!is_array($arOrder)) $arOrder = array(); if (count($arOrder) < 1) $arOrder = array( "ID" => "DESC", ); $arQueryOrder = array(); foreach ($arOrder as $strColumn => $strDirection) { $strColumn = mb_strtoupper($strColumn); $strDirection = mb_strtoupper($strDirection) == "ASC"? "ASC": "DESC"; if (in_array($strColumn, $arDefSelect)) { $arSelect[] = $strColumn; if ($strColumn == "TIMESTAMP_X") $arQueryOrder[$strColumn] = "TMP_TS ".$strDirection; else $arQueryOrder[$strColumn] = $strColumn." ".$strDirection; } elseif ($strColumn == "COUNT" && $bGroup) { $arSelect[] = $strColumn; $arQueryOrder[$strColumn] = $strColumn." ".$strDirection; } } $arQueryGroup = array(); $arQuerySelect = array(); foreach ($arSelect as $strColumn) { $strColumn = mb_strtoupper($strColumn); if (in_array($strColumn, $arDefSelect)) { if ($strColumn == "TIMESTAMP_X") { $arQuerySelect["TMP_TS"] = "sph.".$strColumn." TMP_TS"; $arQuerySelect[$strColumn] = $DB->DateToCharFunction("sph.".$strColumn, "FULL")." ".$strColumn; } else { $arQuerySelect[$strColumn] = "sph.".$strColumn; } if ($bGroup) $arQueryGroup[$strColumn] = "sph.".$strColumn; } elseif ($strColumn == "COUNT" && $bGroup) { $arQuerySelect[$strColumn] = "count(*) ".$strColumn; } } $obQueryWhere = new CSQLWhere; $obQueryWhere->SetFields(array( "ID" => array( "TABLE_ALIAS" => "sph", "FIELD_NAME" => "sph.ID", "FIELD_TYPE" => "int", //int, double, file, enum, int, string, date, datetime "JOIN" => false, ), "PHRASE" => array( "TABLE_ALIAS" => "sph", "FIELD_NAME" => "sph.PHRASE", "FIELD_TYPE" => "string", "JOIN" => false, ), "TAGS" => array( "TABLE_ALIAS" => "sph", "FIELD_NAME" => "sph.TAGS", "FIELD_TYPE" => "string", "JOIN" => false, ), "TIMESTAMP_X" => array( "TABLE_ALIAS" => "sph", "FIELD_NAME" => "sph.TIMESTAMP_X", "FIELD_TYPE" => "datetime", "JOIN" => false, ), "SITE_ID" => array( "TABLE_ALIAS" => "sph", "FIELD_NAME" => "sph.SITE_ID", "FIELD_TYPE" => "string", "JOIN" => false, ), "URL_TO" => array( "TABLE_ALIAS" => "sph", "FIELD_NAME" => "sph.URL_TO", "FIELD_TYPE" => "string", "JOIN" => false, ), "URL_TO_404" => array( "TABLE_ALIAS" => "sph", "FIELD_NAME" => "sph.URL_TO_404", "FIELD_TYPE" => "string", "JOIN" => false, ), "STAT_SESS_ID" => array( "TABLE_ALIAS" => "sph", "FIELD_NAME" => "sph.STAT_SESS_ID", "FIELD_TYPE" => "int", "JOIN" => false, ), "RESULT_COUNT" => array( "TABLE_ALIAS" => "sph", "FIELD_NAME" => "sph.RESULT_COUNT", "FIELD_TYPE" => "int", "JOIN" => false, ), )); if (count($arQuerySelect) < 1) $arQuerySelect = array("ID" => "sph.ID"); $strSql = " SELECT ".implode(", ", $arQuerySelect)." FROM b_search_phrase sph "; if (!is_array($arFilter)) $arFilter = array(); if ($strQueryWhere = $obQueryWhere->GetQuery($arFilter)) { $strSql .= " WHERE ".$strQueryWhere." "; } if ($bGroup && count($arQueryGroup) > 0) { $strSql .= " GROUP BY ".implode(", ", $arQueryGroup)." "; } if (count($arQueryOrder) > 0) { $strSql .= " ORDER BY ".implode(", ", $arQueryOrder)." "; } return $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__); } public static function CleanUpAgent() { $DB = CDatabase::GetModuleConnection('search'); $cleanup_days = COption::GetOptionInt("search", "stat_phrase_save_days"); if ($cleanup_days > 0) { $arDate = localtime(time()); $date = mktime(0, 0, 0, $arDate[4] + 1, $arDate[3] - $cleanup_days, 1900 + $arDate[5]); $DB->Query("DELETE FROM b_search_phrase WHERE TIMESTAMP_X <= ".$DB->CharToDateFunction(ConvertTimeStamp($date, "FULL"))); } return "CSearchStatistic::CleanUpAgent();"; } public static function IsActive() { $bActive = false; foreach (GetModuleEvents("main", "OnEpilog", true) as $arEvent) { if ( $arEvent["TO_MODULE_ID"] == "search" && $arEvent["TO_CLASS"] == "CSearchStatistic" ) { $bActive = true; break; } } return $bActive; } public static function SetActive($bActive = false) { if ($bActive) { if (!CSearchStatistic::IsActive()) RegisterModuleDependences("main", "OnEpilog", "search", "CSearchStatistic", "OnEpilog", "90"); } else { if (CSearchStatistic::IsActive()) UnRegisterModuleDependences("main", "OnEpilog", "search", "CSearchStatistic", "OnEpilog"); } } public static function GetCurrentURL() { $res = (CMain::IsHTTPS()? "https": "http")."://"; $host = $_SERVER["HTTP_HOST"]; $res .= $host; $port = intval($_SERVER["SERVER_PORT"]); if ($port > 0 && $port != 80 && $port != 443 && mb_strpos($host, ":") === false) $res .= ":".$port; $url = preg_replace("/\\?sphrase_id=\\d+&/", "?", $_SERVER["REQUEST_URI"]); $url = preg_replace("/\\?sphrase_id=\\d+/", "", $url); $url = preg_replace("/&sphrase_id=\\d+/", "", $url); $res .= $url; return $res; } public static function OnEpilog() { if (isset($_REQUEST["sphrase_id"])) { $phrase_id = intval($_REQUEST["sphrase_id"]); if ($phrase_id) { $DB = CDatabase::GetModuleConnection('search'); $DB->StartUsingMasterOnly(); $rs = $DB->Query(" SELECT * FROM b_search_phrase WHERE ID = ".$phrase_id." AND SESSION_ID = '".$DB->ForSQL(bitrix_sessid())."' AND URL_TO IS NULL "); if ($ar = $rs->Fetch()) { $URL_TO = $DB->ForSQL(CSearchStatistic::GetCurrentURL(), 2000); $DB->Query(" UPDATE b_search_phrase SET URL_TO = '".$URL_TO."' ,URL_TO_404 = '".(defined("ERROR_404")? "Y": "N")."' ,URL_TO_SITE_ID = ".(defined("SITE_ID")? "'".$DB->ForSQL(SITE_ID, 2)."'": "null")." WHERE ID = ".$phrase_id." "); } $DB->StopUsingMasterOnly(); } } } }