• Модуль: iblock
  • Путь к файлу: ~/bitrix/modules/iblock/classes/general/iblockelement.php
  • Класс: CAllIBlockElement
  • Вызов: CAllIBlockElement::UpdateSearch
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);
	}
}