• Модуль: search
  • Путь к файлу: ~/bitrix/modules/search/classes/general/search.php
  • Класс: CAllSearch
  • Вызов: CAllSearch::Index
static function Index($MODULE_ID, $ITEM_ID, $arFields, $bOverWrite = false, $SEARCH_SESS_ID = "")
{
	$DB = CDatabase::GetModuleConnection('search');

	$arFields["MODULE_ID"] = $MODULE_ID;
	$arFields["ITEM_ID"] = $ITEM_ID;
	foreach (GetModuleEvents("search", "BeforeIndex", true) as $arEvent)
	{
		$arEventResult = ExecuteModuleEventEx($arEvent, array($arFields));
		if (is_array($arEventResult))
			$arFields = $arEventResult;
	}
	unset($arFields["MODULE_ID"]);
	unset($arFields["ITEM_ID"]);

	$bTitle = array_key_exists("TITLE", $arFields);
	if ($bTitle)
		$arFields["TITLE"] = trim($arFields["TITLE"]);
	$bBody = array_key_exists("BODY", $arFields);
	if ($bBody)
		$arFields["BODY"] = trim($arFields["BODY"]);
	$bTags = array_key_exists("TAGS", $arFields);
	if ($bTags)
		$arFields["TAGS"] = trim($arFields["TAGS"]);

	if (!array_key_exists("SITE_ID", $arFields) && array_key_exists("LID", $arFields))
		$arFields["SITE_ID"] = $arFields["LID"];

	if (array_key_exists("SITE_ID", $arFields))
	{
		if (!is_array($arFields["SITE_ID"]))
		{
			$arFields["SITE_ID"] = Array($arFields["SITE_ID"] => "");
		}
		else
		{
			$bNotAssoc = true;
			$i = 0;
			foreach ($arFields["SITE_ID"] as $k => $val)
			{
				if ("".$k != "".$i)
				{
					$bNotAssoc = false;
					break;
				}
				$i++;
			}
			if ($bNotAssoc)
			{
				$x = $arFields["SITE_ID"];
				$arFields["SITE_ID"] = Array();
				foreach ($x as $val)
					$arFields["SITE_ID"][$val] = "";
			}
		}

		if (count($arFields["SITE_ID"]) <= 0)
			return 0;

		reset($arFields["SITE_ID"]);
		$arFields["LID"] = current($arFields["SITE_ID"]);

		$arSites = array();
		foreach ($arFields["SITE_ID"] as $site => $url)
		{
			$arSites[] = $DB->ForSQL($site, 2);
		}

		$strSql = "
			SELECT CR.RANK
			FROM b_search_custom_rank CR
			WHERE CR.SITE_ID in ('".implode("', '", $arSites)."')
			AND CR.MODULE_ID='".$DB->ForSQL($MODULE_ID)."'
			".(is_set($arFields, "PARAM1")? "AND (CR.PARAM1 IS NULL OR CR.PARAM1='' OR CR.PARAM1='".$DB->ForSQL($arFields["PARAM1"])."')": "")."
			".(is_set($arFields, "PARAM2")? "AND (CR.PARAM2 IS NULL OR CR.PARAM2='' OR CR.PARAM2='".$DB->ForSQL($arFields["PARAM2"])."')": "")."
			".($ITEM_ID <> ""? "AND (CR.ITEM_ID IS NULL OR CR.ITEM_ID='' OR CR.ITEM_ID='".$DB->ForSQL($ITEM_ID)."')": "")."
			ORDER BY
				PARAM1 DESC, PARAM2 DESC, ITEM_ID DESC
		";
		$r = $DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__); $arFields["CUSTOM_RANK_SQL"] = $strSql; if ($arResult = $r->Fetch()) $arFields["CUSTOM_RANK"] = $arResult["RANK"]; } $arGroups = array(); if (is_set($arFields, "PERMISSIONS")) { foreach ($arFields["PERMISSIONS"] as $group_id) { if (is_numeric($group_id)) $arGroups[$group_id] = "G".intval($group_id); else $arGroups[$group_id] = $group_id; } } $strSqlSelect = ""; if ($bBody) $strSqlSelect .= ",BODY"; if ($bTitle) $strSqlSelect .= ",TITLE"; if ($bTags) $strSqlSelect .= ",TAGS"; $strSql = "SELECT ID, MODULE_ID, ITEM_ID, ".$DB->DateToCharFunction("DATE_CHANGE")." as DATE_CHANGE ".$strSqlSelect." FROM b_search_content WHERE MODULE_ID = '".$DB->ForSQL($MODULE_ID)."' AND ITEM_ID = '".$DB->ForSQL($ITEM_ID)."' "; $r = $DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__); if ($arResult = $r->Fetch()) { $ID = $arResult["ID"]; if ($bTitle && $bBody && $arFields["BODY"] == '' && $arFields["TITLE"] == '') { foreach (GetModuleEvents("search", "OnBeforeIndexDelete", true) as $arEvent) ExecuteModuleEventEx($arEvent, array("SEARCH_CONTENT_ID = ".$ID)); CSearchTags::CleanCache("", $ID); CSearch::CleanFreqCache($ID); $DB->Query("DELETE FROM b_search_content_param WHERE SEARCH_CONTENT_ID = ".$ID, false, "File: ".__FILE__."
Line: ".__LINE__); $DB->Query("DELETE FROM b_search_content_right WHERE SEARCH_CONTENT_ID = ".$ID, false, "File: ".__FILE__."
Line: ".__LINE__); $DB->Query("DELETE FROM b_search_content_site WHERE SEARCH_CONTENT_ID = ".$ID, false, "File: ".__FILE__."
Line: ".__LINE__); $DB->Query("DELETE FROM b_search_content_title WHERE SEARCH_CONTENT_ID = ".$ID, false, "File: ".__FILE__."
Line: ".__LINE__); $DB->Query("DELETE FROM b_search_tags WHERE SEARCH_CONTENT_ID = ".$ID, false, "File: ".__FILE__."
Line: ".__LINE__); CSearchFullText::getInstance()->deleteById($ID); $DB->Query("DELETE FROM b_search_content WHERE ID = ".$ID, false, "File: ".__FILE__."
Line: ".__LINE__); return 0; } if (is_set($arFields, "PARAMS")) CAllSearch::SetContentItemParams($ID, $arFields["PARAMS"]); if (count($arGroups) > 0) CAllSearch::SetContentItemGroups($ID, $arGroups); if (is_set($arFields, "SITE_ID")) { CSearch::UpdateSite($ID, $arFields["SITE_ID"]); } if (array_key_exists("LAST_MODIFIED", $arFields)) $arFields["~DATE_CHANGE"] = $arFields["DATE_CHANGE"] = $DATE_CHANGE = $arFields["LAST_MODIFIED"]; elseif (array_key_exists("DATE_CHANGE", $arFields)) $arFields["~DATE_CHANGE"] = $arFields["DATE_CHANGE"] = $DATE_CHANGE = $DB->FormatDate($arFields["DATE_CHANGE"], "DD.MM.YYYY HH:MI:SS", CLang::GetDateFormat()); else $DATE_CHANGE = ''; if (!$bOverWrite && $DATE_CHANGE == $arResult["DATE_CHANGE"]) { if ($SEARCH_SESS_ID <> '') $DB->Query("UPDATE b_search_content SET UPD='".$DB->ForSql($SEARCH_SESS_ID)."' WHERE ID = ".$ID, false, "File: ".__FILE__."
Line: ".__LINE__); //$DB->Commit(); return $ID; } unset($arFields["MODULE_ID"]); unset($arFields["ITEM_ID"]); if ($bBody || $bTitle || $bTags) { if (array_key_exists("INDEX_TITLE", $arFields) && $arFields["INDEX_TITLE"] === false) { $content = ""; } else { if ($bTitle) $content = $arFields["TITLE"]."rn"; else $content = $arResult["TITLE"]."rn"; } if ($bBody) $content .= $arFields["BODY"]."rn"; else $content .= $arResult["BODY"]."rn"; if ($bTags) $content .= $arFields["TAGS"]; else $content .= $arResult["TAGS"]; $content = preg_replace_callback("/&#(\d+);/", array("CSearch", "chr"), $content); $arFields["SEARCHABLE_CONTENT"] = CSearch::KillEntities(ToUpper($content)); } if ($SEARCH_SESS_ID <> '') $arFields["UPD"] = $SEARCH_SESS_ID; if (array_key_exists("TITLE", $arFields)) { if ( !array_key_exists("INDEX_TITLE", $arFields) || $arFields["INDEX_TITLE"] !== false ) CSearch::IndexTitle($arFields["SITE_ID"], $ID, $arFields["TITLE"]); } if ($bTags && ($arResult["TAGS"] != $arFields["TAGS"])) { CSearchTags::CleanCache("", $ID); $DB->Query("DELETE FROM b_search_tags WHERE SEARCH_CONTENT_ID = ".$ID, false, "File: ".__FILE__."
Line: ".__LINE__); CSearch::TagsIndex($arFields["SITE_ID"], $ID, $arFields["TAGS"]); } foreach (GetModuleEvents("search", "OnBeforeIndexUpdate", true) as $arEvent) ExecuteModuleEventEx($arEvent, array($ID, $arFields)); CSearch::Update($ID, $arFields); $arFields["MODULE_ID"] = $arResult['MODULE_ID']; $arFields["ITEM_ID"] = $arResult['ITEM_ID']; CSearchFullText::getInstance()->replace($ID, $arFields); } else { if ($bTitle && $bBody && $arFields["BODY"] == '' && $arFields["TITLE"] == '') { //$DB->Commit(); return 0; } $arFields["MODULE_ID"] = $MODULE_ID; $arFields["ITEM_ID"] = $ITEM_ID; if (array_key_exists("INDEX_TITLE", $arFields) && $arFields["INDEX_TITLE"] === false) $content = $arFields["BODY"]."rn".$arFields["TAGS"]; else $content = $arFields["TITLE"]."rn".$arFields["BODY"]."rn".$arFields["TAGS"]; $content = preg_replace_callback("/&#(\d+);/", array("CSearch", "chr"), $content); $arFields["SEARCHABLE_CONTENT"] = CSearch::KillEntities(ToUpper($content)); if ($SEARCH_SESS_ID != "") $arFields["UPD"] = $SEARCH_SESS_ID; $ID = CSearch::Add($arFields); //We failed to add this record to the search index if ($ID === false) { //Check if item was added $strSql = "SELECT ID FROM b_search_content WHERE MODULE_ID = '".$DB->ForSQL($MODULE_ID)."' AND ITEM_ID = '".$DB->ForSQL($ITEM_ID)."' "; $rs = $DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__); $ar = $rs->Fetch(); if ($ar) return $ar["ID"]; else return $ID; } CSearchFullText::getInstance()->replace($ID, $arFields); foreach (GetModuleEvents("search", "OnAfterIndexAdd", true) as $arEvent) ExecuteModuleEventEx($arEvent, array($ID, $arFields)); if (is_set($arFields, "PARAMS")) CAllSearch::SetContentItemParams($ID, $arFields["PARAMS"]); CAllSearch::SetContentItemGroups($ID, $arGroups); CSearch::UpdateSite($ID, $arFields["SITE_ID"]); if ( !array_key_exists("INDEX_TITLE", $arFields) || $arFields["INDEX_TITLE"] !== false ) CSearch::IndexTitle($arFields["SITE_ID"], $ID, $arFields["TITLE"]); CSearch::TagsIndex($arFields["SITE_ID"], $ID, $arFields["TAGS"]); } //$DB->Commit(); return $ID; }