static function OnSearchReindex($NS=Array(), $oCallback=NULL, $callback_method="")
{
/** @global CUserTypeManager $USER_FIELD_MANAGER */
global $USER_FIELD_MANAGER;
/** $global CDatabase $DB */
global $DB;
$strNSJoin1 = "";
$strNSFilter1 = "";
$strNSFilter2 = "";
$strNSFilter3 = "";
$arResult = Array();
if($NS["MODULE"]=="iblock" && $NS["ID"] <> '')
{
$arrTmp = explode(".", $NS["ID"]);
$strNSFilter1 = " AND B.ID>=".intval($arrTmp[0])." ";
if(mb_substr($arrTmp[1], 0, 1) != 'S')
{
$strNSFilter2 = " AND BE.ID>".intval($arrTmp[1])." ";
}
else
{
$strNSFilter2 = false;
$strNSFilter3 = " AND BS.ID>".intval(mb_substr($arrTmp[1], 1))." ";
}
}
if($NS["SITE_ID"]!="")
{
$strNSJoin1 .= " INNER JOIN b_iblock_site BS ON BS.IBLOCK_ID=B.ID ";
$strNSFilter1 .= " AND BS.SITE_ID='".$DB->ForSQL($NS["SITE_ID"])."' ";
}
$strSql = "
SELECT B.ID, B.IBLOCK_TYPE_ID, B.INDEX_ELEMENT, B.INDEX_SECTION, B.RIGHTS_MODE,
B.IBLOCK_TYPE_ID, B.CODE as IBLOCK_CODE, B.XML_ID as IBLOCK_EXTERNAL_ID,
B.SOCNET_GROUP_ID
FROM b_iblock B
".$strNSJoin1."
WHERE B.ACTIVE = 'Y'
AND (B.INDEX_ELEMENT='Y' OR B.INDEX_SECTION='Y')
".$strNSFilter1."
ORDER BY B.ID
";
$dbrIBlock = $DB->Query($strSql);
while($arIBlock = $dbrIBlock->Fetch())
{
$IBLOCK_ID = $arIBlock["ID"];
$arGroups = Array();
$strSql =
"SELECT GROUP_ID ".
"FROM b_iblock_group ".
"WHERE IBLOCK_ID= ".$IBLOCK_ID." ".
" AND PERMISSION>='R' ".
" AND GROUP_ID>1 ".
"ORDER BY GROUP_ID";
$dbrIBlockGroup = $DB->Query($strSql);
while($arIBlockGroup = $dbrIBlockGroup->Fetch())
{
$arGroups[] = $arIBlockGroup["GROUP_ID"];
if($arIBlockGroup["GROUP_ID"]==2) break;
}
$arSITE = Array();
$strSql =
"SELECT SITE_ID ".
"FROM b_iblock_site ".
"WHERE IBLOCK_ID= ".$IBLOCK_ID;
$dbrIBlockSite = $DB->Query($strSql);
while($arIBlockSite = $dbrIBlockSite->Fetch())
$arSITE[] = $arIBlockSite["SITE_ID"];
if($arIBlock["INDEX_ELEMENT"]=='Y' && ($strNSFilter2 !== false))
{
$strSql =
"SELECT BE.ID, BE.NAME, BE.TAGS, ".
" ".$DB->DateToCharFunction("BE.ACTIVE_FROM")." as DATE_FROM, ".
" ".$DB->DateToCharFunction("BE.ACTIVE_TO")." as DATE_TO, ".
" ".$DB->DateToCharFunction("BE.TIMESTAMP_X")." as LAST_MODIFIED, ".
" BE.PREVIEW_TEXT_TYPE, BE.PREVIEW_TEXT, ".
" BE.DETAIL_TEXT_TYPE, BE.DETAIL_TEXT, ".
" BE.XML_ID as EXTERNAL_ID, BE.CODE, ".
" BE.IBLOCK_SECTION_ID ".
"FROM b_iblock_element BE ".
"WHERE BE.IBLOCK_ID=".$IBLOCK_ID." ".
" AND BE.ACTIVE='Y' ".
CIBlockElement::WF_GetSqlLimit("BE.", "N").
$strNSFilter2.
"ORDER BY BE.ID ";
//For MySQL, we have to solve client out of memory
//problem by limiting the query
if($DB->type=="MYSQL")
{
$limit = 1000;
$strSql .= " LIMIT ".$limit;
}
else
{
$limit = false;
}
$dbrIBlockElement = $DB->Query($strSql);
while($arIBlockElement = $dbrIBlockElement->Fetch())
{
$DETAIL_URL =
"=ID=".urlencode($arIBlockElement["ID"]).
"&EXTERNAL_ID=".urlencode($arIBlockElement["EXTERNAL_ID"]).
"&CODE=".urlencode($arIBlockElement["CODE"]).
"&IBLOCK_SECTION_ID=".urlencode($arIBlockElement["IBLOCK_SECTION_ID"]).
"&IBLOCK_TYPE_ID=".urlencode($arIBlock["IBLOCK_TYPE_ID"]).
"&IBLOCK_ID=".urlencode($IBLOCK_ID).
"&IBLOCK_CODE=".urlencode($arIBlock["IBLOCK_CODE"]).
"&IBLOCK_EXTERNAL_ID=".urlencode($arIBlock["IBLOCK_EXTERNAL_ID"]);
$BODY =
($arIBlockElement["PREVIEW_TEXT_TYPE"]=="html" ?
CSearch::KillTags($arIBlockElement["PREVIEW_TEXT"]) :
$arIBlockElement["PREVIEW_TEXT"]
)."rn".
($arIBlockElement["DETAIL_TEXT_TYPE"]=="html" ?
CSearch::KillTags($arIBlockElement["DETAIL_TEXT"]) :
$arIBlockElement["DETAIL_TEXT"]
);
$dbrProperties = CIBlockElement::GetProperty($IBLOCK_ID, $arIBlockElement["ID"], "sort", "asc", array("ACTIVE"=>"Y", "SEARCHABLE"=>"Y"));
while($arProperties = $dbrProperties->Fetch())
{
$BODY .= "rn";
if($arProperties["USER_TYPE"] <> '')
$UserType = CIBlockProperty::GetUserType($arProperties["USER_TYPE"]);
else
$UserType = array();
if(array_key_exists("GetSearchContent", $UserType))
{
$BODY .= CSearch::KillTags(
call_user_func_array($UserType["GetSearchContent"],
array(
$arProperties,
array("VALUE" => $arProperties["VALUE"]),
array(),
)
)
);
}
elseif(array_key_exists("GetPublicViewHTML", $UserType))
{
$BODY .= CSearch::KillTags(
call_user_func_array($UserType["GetPublicViewHTML"],
array(
$arProperties,
array("VALUE" => $arProperties["VALUE"]),
array(),
)
)
);
}
elseif($arProperties["PROPERTY_TYPE"]=='L')
{
$BODY .= $arProperties["VALUE_ENUM"];
}
elseif($arProperties["PROPERTY_TYPE"]=='F')
{
$arFile = CIBlockElement::__GetFileContent($arProperties["VALUE"]);
if(is_array($arFile))
{
$BODY .= $arFile["CONTENT"];
$arIBlockElement["TAGS"] .= ",".$arFile["PROPERTIES"][COption::GetOptionString("search", "page_tag_property")];
}
}
else
{
$BODY .= $arProperties["VALUE"];
}
}
if($arIBlock["RIGHTS_MODE"] !== "E")
$arPermissions = $arGroups;
else
{
$obElementRights = new CIBlockElementRights($IBLOCK_ID, $arIBlockElement["ID"]);
$arPermissions = $obElementRights->GetGroups(array("element_read"));
}
$Result = array(
"ID" => $arIBlockElement["ID"],
"LAST_MODIFIED" => ($arIBlockElement["DATE_FROM"] <> ''? $arIBlockElement["DATE_FROM"]: $arIBlockElement["LAST_MODIFIED"]),
"TITLE" => $arIBlockElement["NAME"],
"BODY" => $BODY,
"TAGS" => $arIBlockElement["TAGS"],
"SITE_ID" => $arSITE,
"PARAM1" => $arIBlock["IBLOCK_TYPE_ID"],
"PARAM2" => $IBLOCK_ID,
"DATE_FROM" => ($arIBlockElement["DATE_FROM"] <> ''? $arIBlockElement["DATE_FROM"] : false),
"DATE_TO" => ($arIBlockElement["DATE_TO"] <> ''? $arIBlockElement["DATE_TO"] : false),
"PERMISSIONS" => $arPermissions,
"URL" => $DETAIL_URL
);
if ($arIBlock["SOCNET_GROUP_ID"] > 0)
$Result["PARAMS"] = array(
"socnet_group" => $arIBlock["SOCNET_GROUP_ID"],
);
if($oCallback)
{
$res = call_user_func(array($oCallback, $callback_method), $Result);
if(!$res)
return $IBLOCK_ID.".".$arIBlockElement["ID"];
}
else
{
$arResult[] = $Result;
}
if($limit !== false)
{
$limit--;
if($limit <= 0)
return $IBLOCK_ID.".".$arIBlockElement["ID"];
}
}
}
if($arIBlock["INDEX_SECTION"]=='Y')
{
$strSql =
"SELECT BS.ID, BS.NAME, ".
" ".$DB->DateToCharFunction("BS.TIMESTAMP_X")." as LAST_MODIFIED, ".
" BS.DESCRIPTION_TYPE, BS.DESCRIPTION, BS.XML_ID as EXTERNAL_ID, BS.CODE, ".
" BS.IBLOCK_ID ".
"FROM b_iblock_section BS ".
"WHERE BS.IBLOCK_ID=".$IBLOCK_ID." ".
" AND BS.GLOBAL_ACTIVE='Y' ".
$strNSFilter3.
"ORDER BY BS.ID ";
$dbrIBlockSection = $DB->Query($strSql);
while($arIBlockSection = $dbrIBlockSection->Fetch())
{
$DETAIL_URL =
"=ID=".$arIBlockSection["ID"].
"&EXTERNAL_ID=".$arIBlockSection["EXTERNAL_ID"].
"&CODE=".$arIBlockSection["CODE"].
"&IBLOCK_TYPE_ID=".$arIBlock["IBLOCK_TYPE_ID"].
"&IBLOCK_ID=".$arIBlockSection["IBLOCK_ID"].
"&IBLOCK_CODE=".$arIBlock["IBLOCK_CODE"].
"&IBLOCK_EXTERNAL_ID=".$arIBlock["IBLOCK_EXTERNAL_ID"];
$BODY =
($arIBlockSection["DESCRIPTION_TYPE"]=="html" ?
CSearch::KillTags($arIBlockSection["DESCRIPTION"])
:
$arIBlockSection["DESCRIPTION"]
);
$BODY .= $USER_FIELD_MANAGER->OnSearchIndex("IBLOCK_".$arIBlockSection["IBLOCK_ID"]."_SECTION", $arIBlockSection["ID"]);
if($arIBlock["RIGHTS_MODE"] !== "E")
$arPermissions = $arGroups;
else
{
$obSectionRights = new CIBlockSectionRights($IBLOCK_ID, $arIBlockSection["ID"]);
$arPermissions = $obSectionRights->GetGroups(array("section_read"));
}
$Result = Array(
"ID" => "S".$arIBlockSection["ID"],
"LAST_MODIFIED" => $arIBlockSection["LAST_MODIFIED"],
"TITLE" => $arIBlockSection["NAME"],
"BODY" => $BODY,
"SITE_ID" => $arSITE,
"PARAM1" => $arIBlock["IBLOCK_TYPE_ID"],
"PARAM2" => $IBLOCK_ID,
"PERMISSIONS" => $arPermissions,
"URL" => $DETAIL_URL,
);
if ($arIBlock["SOCNET_GROUP_ID"] > 0)
$Result["PARAMS"] = array(
"socnet_group" => $arIBlock["SOCNET_GROUP_ID"],
);
if($oCallback)
{
$res = call_user_func(array($oCallback, $callback_method), $Result);
if(!$res)
return $IBLOCK_ID.".S".$arIBlockSection["ID"];
}
else
{
$arResult[] = $Result;
}
}
}
$strNSFilter2="";
$strNSFilter3="";
}
if($oCallback)
return false;
return $arResult;
}