- Модуль: 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;
}