• Модуль: search
  • Путь к файлу: ~/bitrix/modules/search/classes/general/search.php
  • Класс: CAllSearch
  • Вызов: CAllSearch::__PrepareFilter
static function __PrepareFilter($arFilter, &$bIncSites, $strSearchContentAlias = "sc.")
{
	$DB = CDatabase::GetModuleConnection('search');
	$arSql = array();
	$arNewFilter = array();
	static $arFilterEvents = false;

	if (!is_array($arFilter))
		$arFilter = array();

	foreach ($arFilter as $field => $val)
	{
		$field = mb_strtoupper($field);
		if (
			is_array($val)
			&& count($val) == 1
			&& $field !== "URL"
			&& $field !== "PARAMS"
		)
			$val = $val[0];
		switch ($field)
		{
		case "=MODULE_ID":
			if ($val !== false && $val !== "no")
				$arNewFilter[$field] = $val;
			break;
		case "MODULE_ID":
			if ($val !== false && $val !== "no")
				$arNewFilter["=".$field] = $val;
			break;
		case "ITEM_ID":
		case "PARAM1":
		case "PARAM2":
			if ($val !== false)
				$arNewFilter["=".$field] = $val;
			break;
		case "CHECK_DATES":
			if ($val == "Y")
			{
				$time = ConvertTimeStamp(time() + CTimeZone::GetOffset(), "FULL");
				$arNewFilter[] = array(
					"LOGIC" => "AND",
					array(
						"LOGIC" => "OR",
						"=DATE_FROM" => false,
						"<=DATE_FROM" => $time,
					),
					array(
						"LOGIC" => "OR",
						"=DATE_TO" => false,
						">=DATE_TO" => $time,
					),
				);
			}
			break;
		case "DATE_CHANGE":
			if ($val <> '')
				$arNewFilter[">=".$field] = $val;
			break;
		case "SITE_ID":
			if ($val !== false)
				$arNewFilter["=".$field] = $val;
			break;
		default:
			if (!is_array($arFilterEvents))
			{
				$arFilterEvents = array();
				foreach (GetModuleEvents("search", "OnSearchPrepareFilter", true) as $arEvent)
					$arFilterEvents[] = $arEvent;
			}
			//Try to get someone to make the filter sql
			$sql = "";
			foreach ($arFilterEvents as $arEvent)
			{
				$sql = ExecuteModuleEventEx($arEvent, array($strSearchContentAlias, $field, $val));
				if($sql <> '')
				{
					$arSql[] = "(".$sql.")";
					break;
				}
			}

			if (!$sql)
				$arNewFilter[$field] = $val;
		}
	}

	$strSearchContentAlias = rtrim($strSearchContentAlias, ".");
	$obWhereHelp = new CSearchSQLHelper($strSearchContentAlias);
	$obQueryWhere = new CSQLWhere;
	$obQueryWhere->SetFields(array(
		"MODULE_ID" => array(
			"TABLE_ALIAS" => $strSearchContentAlias,
			"FIELD_NAME" => $strSearchContentAlias.".MODULE_ID",
			"MULTIPLE" => "N",
			"FIELD_TYPE" => "string",
			"JOIN" => false,
		),
		"ITEM_ID" => array(
			"TABLE_ALIAS" => $strSearchContentAlias,
			"FIELD_NAME" => $strSearchContentAlias.".ITEM_ID",
			"MULTIPLE" => "N",
			"FIELD_TYPE" => "string",
			"JOIN" => false,
		),
		"PARAM1" => array(
			"TABLE_ALIAS" => $strSearchContentAlias,
			"FIELD_NAME" => $strSearchContentAlias.".PARAM1",
			"MULTIPLE" => "N",
			"FIELD_TYPE" => "string",
			"JOIN" => false,
		),
		"PARAM2" => array(
			"TABLE_ALIAS" => $strSearchContentAlias,
			"FIELD_NAME" => $strSearchContentAlias.".PARAM2",
			"MULTIPLE" => "N",
			"FIELD_TYPE" => "string",
			"JOIN" => false,
		),
		"DATE_FROM" => array(
			"TABLE_ALIAS" => $strSearchContentAlias,
			"FIELD_NAME" => $strSearchContentAlias.".DATE_FROM",
			"MULTIPLE" => "N",
			"FIELD_TYPE" => "datetime",
			"JOIN" => false,
		),
		"DATE_TO" => array(
			"TABLE_ALIAS" => $strSearchContentAlias,
			"FIELD_NAME" => $strSearchContentAlias.".DATE_TO",
			"MULTIPLE" => "N",
			"FIELD_TYPE" => "datetime",
			"JOIN" => false,
		),
		"DATE_CHANGE" => array(
			"TABLE_ALIAS" => $strSearchContentAlias,
			"FIELD_NAME" => $strSearchContentAlias.".DATE_CHANGE",
			"MULTIPLE" => "N",
			"FIELD_TYPE" => "datetime",
			"JOIN" => false,
		),
		"SITE_ID" => array(
			"TABLE_ALIAS" => "scsite",
			"FIELD_NAME" => "scsite.SITE_ID",
			"MULTIPLE" => "N",
			"FIELD_TYPE" => "string",
			"JOIN" => true,
		),
		"SITE_URL" => array(
			"TABLE_ALIAS" => "scsite",
			"FIELD_NAME" => "scsite.URL",
			"MULTIPLE" => "N",
			"FIELD_TYPE" => "string",
			"JOIN" => true,
		),
		"URL" => array(
			"TABLE_ALIAS" => $strSearchContentAlias,
			"FIELD_NAME" => $strSearchContentAlias.".URL",
			"MULTIPLE" => "N",
			"FIELD_TYPE" => "callback",
			"CALLBACK" => array($obWhereHelp, "_CallbackURL"),
			"JOIN" => true,
		),
		"PARAMS" => array(
			"TABLE_ALIAS" => $strSearchContentAlias,
			"FIELD_NAME" => $strSearchContentAlias.".ID",
			"MULTIPLE" => "N",
			"FIELD_TYPE" => "callback",
			"CALLBACK" => array($obWhereHelp, "_CallbackPARAMS"),
			"JOIN" => false,
		),
	));

	$strWhere = $obQueryWhere->GetQuery($arNewFilter);

	if (count($arSql) > 0)
	{
		if ($strWhere)
			$strWhere .= "nAND (".implode(" AND ", $arSql).")";
		else
			$strWhere = implode("nAND ", $arSql);
	}

	$bIncSites = $bIncSites || $obQueryWhere->GetJoins() <> '';
	return $strWhere;
}