• Модуль: search
  • Путь к файлу: ~/bitrix/modules/search/classes/general/search.php
  • Класс: CAllSearch
  • Вызов: CAllSearch::ReindexFile
static function ReindexFile($path, $SEARCH_SESS_ID = "")
{
	global $APPLICATION;
	$io = CBXVirtualIo::GetInstance();
	$DB = CDatabase::GetModuleConnection('search');

	if (!is_array($path))
		return 0;

	$file_doc_root = CSite::GetSiteDocRoot($path[0]);
	$file_rel_path = $path[1];
	$file_abs_path = preg_replace("#[\\\/]+#", "/", $file_doc_root."/".$file_rel_path);
	$f = $io->GetFile($file_abs_path);

	if (!$f->IsExists() || !$f->IsReadable())
		return 0;

	if (!CSearch::CheckPath($file_rel_path))
		return 0;

	$max_file_size = COption::GetOptionInt("search", "max_file_size", 0);
	if (
		$max_file_size > 0
		&& $f->GetFileSize() > ($max_file_size * 1024)
	)
		return 0;

	$file_site = "";
	$rsSites = CSite::GetList("lendir", "desc");
	while ($arSite = $rsSites->Fetch())
	{
		$site_path = preg_replace("#[\\\/]+#", "/", $arSite["ABS_DOC_ROOT"]."/".$arSite["DIR"]."/");
		if (mb_strpos($file_abs_path, $site_path) === 0)
		{
			$file_site = $arSite["ID"];
			break;
		}
	}

	if ($file_site == "")
		return 0;

	$item_id = $file_site."|".$file_rel_path;
	if (mb_strlen($item_id) > 255)
		return 0;

	if ($SEARCH_SESS_ID <> '')
	{
		$DATE_CHANGE = $DB->CharToDateFunction(
			FormatDate(
				$DB->DateFormatToPHP(CLang::GetDateFormat("FULL")), $f->GetModificationTime() + CTimeZone::GetOffset()
			)
		);
		$strSql = "
			SELECT ID
			FROM b_search_content
			WHERE MODULE_ID = 'main'
				AND ITEM_ID = '".$DB->ForSQL($item_id)."'
				AND DATE_CHANGE = ".$DATE_CHANGE."
		";

		$r = $DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__); if ($arR = $r->Fetch()) { $strSql = "UPDATE b_search_content SET UPD='".$DB->ForSQL($SEARCH_SESS_ID)."' WHERE ID = ".$arR["ID"]; $DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__); return $arR["ID"]; } } $arrFile = false; foreach (GetModuleEvents("search", "OnSearchGetFileContent", true) as $arEvent) { if ($arrFile = ExecuteModuleEventEx($arEvent, array($file_abs_path, $SEARCH_SESS_ID))) break; } if (!is_array($arrFile)) { $sFile = $APPLICATION->GetFileContent($file_abs_path); $sHeadEndPos = mb_strpos($sFile, ""); if ($sHeadEndPos === false) $sHeadEndPos = mb_strpos($sFile, ""); if ($sHeadEndPos !== false) { //html header detected try to get document charset $arMetaMatch = array(); if (preg_match("/<(meta)\s+([^>]*)(content)\s*=\s*(['"]).*?(charset)\s*=\s*(.*?)(\4)/is", mb_substr($sFile, 0, $sHeadEndPos), $arMetaMatch)) { $doc_charset = $arMetaMatch[6]; if (defined("BX_UTF")) { if (mb_strtoupper($doc_charset) != "UTF-8") $sFile = $APPLICATION->ConvertCharset($sFile, $doc_charset, "UTF-8"); } } } $arrFile = ParseFileContent($sFile); } $title = CSearch::KillTags(trim($arrFile["TITLE"])); if ($title == '') return 0; //strip out all the tags $filesrc = CSearch::KillTags($arrFile["CONTENT"]); $arGroups = CSearch::GetGroupCached(); $arGPerm = Array(); foreach ($arGroups as $group_id) { $p = $APPLICATION->GetFileAccessPermission(Array($file_site, $file_rel_path), Array($group_id)); if ($p >= "R") { $arGPerm[] = $group_id; if ($group_id == 2) break; } } $tags = COption::GetOptionString("search", "page_tag_property"); //save to database $ID = CSearch::Index("main", $item_id, Array( "SITE_ID" => $file_site, "DATE_CHANGE" => date("d.m.Y H:i:s", $f->GetModificationTime() + 1), "PARAM1" => "", "PARAM2" => "", "URL" => $file_rel_path, "PERMISSIONS" => $arGPerm, "TITLE" => $title, "BODY" => $filesrc, "TAGS" => array_key_exists($tags, $arrFile["PROPERTIES"])? $arrFile["PROPERTIES"][$tags]: "", ), false, $SEARCH_SESS_ID ); return $ID; }