static function UpdateSearch($ID, $bOverWrite=false)
{
if(!Loader::includeModule("search"))
return;
global $DB;
$ID = (int)$ID;
static $strElementSql = false;
if(!$strElementSql)
{
$strElementSql = "
SELECT BE.ID, BE.NAME, BE.XML_ID as EXTERNAL_ID,
BE.PREVIEW_TEXT_TYPE, BE.PREVIEW_TEXT, BE.CODE,
BE.TAGS,
BE.DETAIL_TEXT_TYPE, BE.DETAIL_TEXT, BE.IBLOCK_ID, B.IBLOCK_TYPE_ID,
".$DB->DateToCharFunction("BE.TIMESTAMP_X")." as LAST_MODIFIED,
".$DB->DateToCharFunction("BE.ACTIVE_FROM")." as DATE_FROM,
".$DB->DateToCharFunction("BE.ACTIVE_TO")." as DATE_TO,
BE.IBLOCK_SECTION_ID,
B.CODE as IBLOCK_CODE, B.XML_ID as IBLOCK_EXTERNAL_ID, B.DETAIL_PAGE_URL,
B.VERSION, B.RIGHTS_MODE, B.SOCNET_GROUP_ID
FROM b_iblock_element BE, b_iblock B
WHERE BE.IBLOCK_ID=B.ID
AND B.ACTIVE='Y'
AND BE.ACTIVE='Y'
AND B.INDEX_ELEMENT='Y'
".CIBlockElement::WF_GetSqlLimit("BE.", "N")."
AND BE.ID=";
}
$dbrIBlockElement = $DB->Query($strElementSql.$ID);
if($arIBlockElement = $dbrIBlockElement->Fetch())
{
$IBLOCK_ID = $arIBlockElement["IBLOCK_ID"];
$DETAIL_URL =
'=ID=' . urlencode($arIBlockElement['ID'])
. '&EXTERNAL_ID=' . urlencode((string)$arIBlockElement['EXTERNAL_ID'])
. '&IBLOCK_SECTION_ID=' . urlencode((string)$arIBlockElement['IBLOCK_SECTION_ID'])
. '&IBLOCK_TYPE_ID=' . urlencode($arIBlockElement['IBLOCK_TYPE_ID'])
. '&IBLOCK_ID=' . urlencode($arIBlockElement['IBLOCK_ID'])
. '&IBLOCK_CODE=' . urlencode((string)$arIBlockElement['IBLOCK_CODE'])
. '&IBLOCK_EXTERNAL_ID=' . urlencode((string)$arIBlockElement['IBLOCK_EXTERNAL_ID'])
. '&CODE=' . urlencode((string)$arIBlockElement['CODE'])
;
static $arGroups = array();
if(!isset($arGroups[$IBLOCK_ID]))
{
$arGroups[$IBLOCK_ID] = array();
$strSql =
"SELECT GROUP_ID ".
"FROM b_iblock_group ".
"WHERE IBLOCK_ID= ".$IBLOCK_ID." ".
" AND PERMISSION>='R' ".
"ORDER BY GROUP_ID";
$dbrIBlockGroup = $DB->Query($strSql);
while($arIBlockGroup = $dbrIBlockGroup->Fetch())
{
$arGroups[$IBLOCK_ID][] = $arIBlockGroup["GROUP_ID"];
if($arIBlockGroup["GROUP_ID"]==2) break;
}
unset($arIBlockGroup);
unset($dbrIBlockGroup);
}
static $arSITE = array();
if(!isset($arSITE[$IBLOCK_ID]))
{
$arSITE[$IBLOCK_ID] = array();
$strSql =
"SELECT SITE_ID ".
"FROM b_iblock_site ".
"WHERE IBLOCK_ID= ".$IBLOCK_ID;
$dbrIBlockSite = $DB->Query($strSql);
while($arIBlockSite = $dbrIBlockSite->Fetch())
$arSITE[$IBLOCK_ID][] = $arIBlockSite["SITE_ID"];
unset($arIBlockSite);
unset($dbrIBlockSite);
}
$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"]
);
static $arProperties = array();
if(!isset($arProperties[$IBLOCK_ID]))
{
$arProperties[$IBLOCK_ID] = array();
$rsProperties = CIBlockProperty::GetList(
array("sort"=>"asc","id"=>"asc"),
array(
"IBLOCK_ID"=>$IBLOCK_ID,
"ACTIVE"=>"Y",
"SEARCHABLE"=>"Y",
"CHECK_PERMISSIONS"=>"N",
)
);
while($ar = $rsProperties->Fetch())
{
if($ar["USER_TYPE"] <> '')
{
$arUT = CIBlockProperty::GetUserType($ar["USER_TYPE"]);
if(isset($arUT["GetSearchContent"]))
$ar["GetSearchContent"] = $arUT["GetSearchContent"];
elseif(isset($arUT["GetPublicViewHTML"]))
$ar["GetSearchContent"] = $arUT["GetPublicViewHTML"];
}
$arProperties[$IBLOCK_ID][$ar["ID"]] = $ar;
}
unset($ar);
unset($rsProperties);
}
//Read current property values from database
$strProperties = "";
if(!empty($arProperties[$IBLOCK_ID]))
{
if($arIBlockElement["VERSION"]==1)
{
$rs = $DB->Query("
select *
from b_iblock_element_property
where IBLOCK_ELEMENT_ID=".$arIBlockElement["ID"]."
AND IBLOCK_PROPERTY_ID in (".implode(", ", array_keys($arProperties[$IBLOCK_ID])).")
");
while($ar=$rs->Fetch())
{
$strProperties .= "rn";
$arProperty = $arProperties[$IBLOCK_ID][$ar["IBLOCK_PROPERTY_ID"]];
if (isset($arProperty["GetSearchContent"]) && $arProperty["GetSearchContent"])
{
$strProperties .= CSearch::KillTags(
call_user_func_array($arProperty["GetSearchContent"],
array(
$arProperty,
array("VALUE" => $ar["VALUE"]),
array(),
)
)
);
}
elseif ($arProperty["PROPERTY_TYPE"] == IblockPropertyTable::TYPE_LIST)
{
$arEnum = CIBlockPropertyEnum::GetByID($ar["VALUE"]);
if($arEnum!==false)
$strProperties .= $arEnum["VALUE"];
}
elseif ($arProperty["PROPERTY_TYPE"] === IblockPropertyTable::TYPE_FILE)
{
$arFile = CIBlockElement::__GetFileContent($ar["VALUE"]);
if(is_array($arFile))
{
$strProperties .= $arFile["CONTENT"];
$arIBlockElement["TAGS"] .= ",".$arFile["PROPERTIES"][COption::GetOptionString("search", "page_tag_property")];
}
}
else
{
$strProperties .= $ar["VALUE"];
}
}
}
else
{
$rs = $DB->Query("
select *
from b_iblock_element_prop_m".$IBLOCK_ID."
where IBLOCK_ELEMENT_ID=".$arIBlockElement["ID"]."
AND IBLOCK_PROPERTY_ID in (".implode(", ", array_keys($arProperties[$IBLOCK_ID])).")
");
while($ar=$rs->Fetch())
{
$strProperties .= "rn";
$arProperty = $arProperties[$IBLOCK_ID][$ar["IBLOCK_PROPERTY_ID"]];
if($arProperty["GetSearchContent"])
{
$strProperties .= CSearch::KillTags(
call_user_func_array($arProperty["GetSearchContent"],
array(
$arProperty,
array("VALUE" => $ar["VALUE"]),
array(),
)
)
);
}
elseif($arProperty["PROPERTY_TYPE"]=='L')
{
$arEnum = CIBlockPropertyEnum::GetByID($ar["VALUE"]);
if($arEnum!==false)
$strProperties .= $arEnum["VALUE"];
}
elseif($arProperty["PROPERTY_TYPE"]=='F')
{
$arFile = CIBlockElement::__GetFileContent($ar["VALUE"]);
if(is_array($arFile))
{
$strProperties .= $arFile["CONTENT"];
$arIBlockElement["TAGS"] .= ",".$arFile["PROPERTIES"][COption::GetOptionString("search", "page_tag_property")];
}
}
else
{
$strProperties .= $ar["VALUE"];
}
}
$rs = $DB->Query("
select *
from b_iblock_element_prop_s".$IBLOCK_ID."
where IBLOCK_ELEMENT_ID=".$arIBlockElement["ID"]."
");
if($ar=$rs->Fetch())
{
foreach($arProperties[$IBLOCK_ID] as $property_id=>$property)
{
if( array_key_exists("PROPERTY_".$property_id, $ar)
&& $property["MULTIPLE"]=="N"
&& $ar["PROPERTY_".$property_id] <> '')
{
$strProperties .= "rn";
if($property["GetSearchContent"])
{
$strProperties .= CSearch::KillTags(
call_user_func_array($property["GetSearchContent"],
array(
$property,
array("VALUE" => $ar["PROPERTY_".$property_id]),
array(),
)
)
);
}
elseif($property["PROPERTY_TYPE"]=='L')
{
$arEnum = CIBlockPropertyEnum::GetByID($ar["PROPERTY_".$property_id]);
if($arEnum!==false)
$strProperties .= $arEnum["VALUE"];
}
elseif($property["PROPERTY_TYPE"]=='F')
{
$arFile = CIBlockElement::__GetFileContent($ar["PROPERTY_".$property_id]);
if(is_array($arFile))
{
$strProperties .= $arFile["CONTENT"];
$arIBlockElement["TAGS"] .= ",".$arFile["PROPERTIES"][COption::GetOptionString("search", "page_tag_property")];
}
}
else
{
$strProperties .= $ar["PROPERTY_".$property_id];
}
}
}
}
}
}
$BODY .= $strProperties;
if($arIBlockElement["RIGHTS_MODE"] !== "E")
{
$arPermissions = $arGroups[$IBLOCK_ID];
}
else
{
$obElementRights = new CIBlockElementRights($IBLOCK_ID, $arIBlockElement["ID"]);
$arPermissions = $obElementRights->GetGroups(array("element_read"));
}
$arFields = array(
"LAST_MODIFIED" => ($arIBlockElement["DATE_FROM"] <> ''?$arIBlockElement["DATE_FROM"]:$arIBlockElement["LAST_MODIFIED"]),
"DATE_FROM" => ($arIBlockElement["DATE_FROM"] <> ''? $arIBlockElement["DATE_FROM"] : false),
"DATE_TO" => ($arIBlockElement["DATE_TO"] <> ''? $arIBlockElement["DATE_TO"] : false),
"TITLE" => $arIBlockElement["NAME"],
"PARAM1" => $arIBlockElement["IBLOCK_TYPE_ID"],
"PARAM2" => $IBLOCK_ID,
"SITE_ID" => $arSITE[$IBLOCK_ID],
"PERMISSIONS" => $arPermissions,
"URL" => $DETAIL_URL,
"BODY" => $BODY,
"TAGS" => $arIBlockElement["TAGS"],
);
if ($arIBlockElement["SOCNET_GROUP_ID"] > 0)
$arFields["PARAMS"] = array(
"socnet_group" => $arIBlockElement["SOCNET_GROUP_ID"],
);
CSearch::Index("iblock", $ID, $arFields, $bOverWrite);
}
else
{
CSearch::DeleteIndex("iblock", $ID);
}
}