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;
}