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