Your IP : 13.59.26.63


Current Path : /var/www/www-root/data/www/monolith-realty.ru/bitrix/modules/search/classes/general/
Upload File :
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();
			}
		}
	}
}