5 public static function GetList($arSelect = [],
$arFilter = [], $arOrder = [], $limit = 100)
7 $DB = CDatabase::GetModuleConnection(
'search');
8 static $arFilterEvents =
false;
11 if (!is_array($arSelect))
15 if (
count($arSelect) < 1)
22 $bJoinSearchContent =
false;
23 foreach ($arSelect as
$key => $value)
25 $value = mb_strtoupper($value);
29 $arQuerySelect[
'NAME'] =
'stags.NAME';
32 $arQuerySelect[
'CNT'] =
'COUNT(DISTINCT stags.SEARCH_CONTENT_ID) as CNT';
35 $arQuerySelect[
'DC_TMP'] =
'MAX(sc.DATE_CHANGE) as DC_TMP';
36 $arQuerySelect[
'FULL_DATE_CHANGE'] =
$DB->DateToCharFunction(
'MAX(sc.DATE_CHANGE)',
'FULL') .
' as FULL_DATE_CHANGE';
37 $arQuerySelect[
'DATE_CHANGE'] =
$DB->DateToCharFunction(
'MAX(sc.DATE_CHANGE)',
'SHORT') .
' as DATE_CHANGE';
38 $bJoinSearchContent =
true;
75 $arQueryWhere[] =
"stags.SITE_ID = '" .
$arSites[0] .
"'";
79 $arQueryWhere[] =
"stags.SITE_ID in ('" . implode(
"', '",
$arSites) .
"')";
84 if (
count($arTags) > 0)
86 $strTag = array_pop($arTags);
87 $arQueryWhere[] =
"UPPER(stags.NAME) LIKE '" .
$DB->ForSql(mb_strtoupper($strTag)) .
"%'";
93 $arQueryWhere[] =
'sc.' .
$key .
" ='" .
$DB->ForSql($value) .
"'";
94 $bJoinSearchContent =
true;
99 foreach ($value as $p_key => $p_val)
101 if (is_array($p_val))
103 foreach ($p_val as
$i => $val2)
105 $p_val[
$i] =
$DB->ForSQL($val2);
107 $p_where =
" in ('" . implode(
"', '", $p_val) .
"')";
111 $p_where =
" = '" .
$DB->ForSQL($p_val) .
"'";
113 $arQueryWhere[] =
"EXISTS (SELECT * FROM b_search_content_param WHERE SEARCH_CONTENT_ID = stags.SEARCH_CONTENT_ID AND PARAM_NAME = '" .
$DB->ForSQL($p_key) .
"' AND PARAM_VALUE " . $p_where .
')';
118 if (!is_array($arFilterEvents))
120 $arFilterEvents =
GetModuleEvents(
'search',
'OnSearchPrepareFilter',
true);
123 foreach ($arFilterEvents as $arEvent)
128 $arQueryWhere[] =
'(' . $sql .
')';
129 $bJoinSearchContent =
true;
137 if (!is_array($arOrder))
141 if (
count($arOrder) < 1)
147 foreach ($arOrder as
$key => $value)
150 $value = mb_strtoupper($value) ==
'DESC' ?
'DESC' :
'ASC';
155 $arQueryOrder[
$key] =
$key .
' ' . $value;
158 $arQueryOrder[
$key] =
'DC_TMP ' . $value;
159 $arQuerySelect[
'DC_TMP'] =
'MAX(sc.DATE_CHANGE) as DC_TMP';
160 $arQuerySelect[
'FULL_DATE_CHANGE'] =
$DB->DateToCharFunction(
'MAX(sc.DATE_CHANGE)',
'FULL') .
' as FULL_DATE_CHANGE';
161 $arQuerySelect[
'DATE_CHANGE'] =
$DB->DateToCharFunction(
'MAX(sc.DATE_CHANGE)',
'SHORT') .
' as DATE_CHANGE';
162 $bJoinSearchContent =
true;
166 if (
count($arQueryOrder) < 1)
169 'NAME' =>
'NAME ASC',
175 ' . implode(
"\n,", $arQuerySelect) .
'
176 FROM b_search_tags stags
177 ' . ($bJoinSearchContent ?
'INNER JOIN b_search_content sc ON sc.ID = stags.SEARCH_CONTENT_ID' :
'') .
'
180 ' . (
count($arQueryWhere) > 0 ?
'AND ' . implode(
"\nAND ", $arQueryWhere) :
'') .
'
182 ORDER BY ' . implode(
', ', $arQueryOrder) .
'
185 if ($limit !==
false)
187 $limit = intval($limit);
188 if ($limit <= 0 || ($limit > COption::GetOptionInt(
'search',
'max_result_size')))
190 $limit = COption::GetOptionInt(
'search',
'max_result_size');
197 $strSql =
$DB->TopSql($strSql, $limit);
200 if ((CACHED_b_search_tags !==
false) && ($limit !==
false) && (mb_strlen($strTag) <= CACHED_b_search_tags_len))
203 $path =
'b_search_tags';
204 while ($strTag <>
'')
206 $path .=
'/_' . ord(mb_substr($strTag, 0, 1));
207 $strTag = mb_substr($strTag, 1);
209 $cache_id =
'search_tags:' . md5($strSql);
224 $res =
new CDBResult;
225 $res->InitFromArray($arTags);
230 return $DB->Query($strSql);