static function GetListEx($arOrder = array(), $arFilter = array())
{
global $DB;
$arSqlSearch = array();
$arOrder = (is_array($arOrder) ? $arOrder : array());
$arOrder = array_change_key_case($arOrder, CASE_UPPER);
$arFilter = (is_array($arFilter) ? $arFilter : array());
foreach ($arFilter as $key => $val)
{
$key_res = CVote::GetFilterOperation($key);
$key = mb_strtoupper($key_res["FIELD"]);
$strNegative = $key_res["NEGATIVE"];
$strOperation = $key_res["OPERATION"];
switch($key)
{
case "CHANNEL_ID":
case "COUNTER":
case "ID":
$str = ($strNegative=="Y"?"NOT":"")."(V.".$key." IS NULL OR V.".$key."<=0)";
if (!empty($val))
{
$str = ($strNegative=="Y"?" V.".$key." IS NULL OR NOT ":"")."(V.".$key." ".$strOperation." ".($strOperation == "LIKE" ? "'".$DB->ForSql($val)."'" : intval($val)).")";
if ($strOperation == "IN")
{
$val = array_unique(array_map("intval", (is_array($val) ? $val : explode(",", $val))), SORT_NUMERIC);
if (!empty($val))
$str = ($strNegative=="Y"?" NOT ":"")."(V.".$key." IN (".implode(",", $val)."))";
}
}
$arSqlSearch[] = $str;
break;
case "ACTIVE":
if (empty($val))
$arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(V.".$key." IS NULL OR LENGTH(V.".$key.")<=0)";
else
$arSqlSearch[] = ($strNegative=="Y"?" V.".$key." IS NULL OR NOT ":"")."(V.".$key." ".$strOperation." '".$DB->ForSql($val)."' )";
break;
case "DATE_START":
case "DATE_END":
if (empty($val))
$arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(V.".$key." IS NULL OR LENGTH(V.".$key.")<=0)";
else
$arSqlSearch[] = ($strNegative=="Y"?" V.".$key." IS NULL OR NOT ":"")."(V.".$key." ".$strOperation." ".$DB->CharToDateFunction($DB->ForSql($val), "FULL")." )";
break;
case "CHANNEL":
$match = ($arFilter[$key."_EXACT_MATCH"] == "Y" ? "N" : "Y");
$arSqlSearch[] = GetFilterQuery("C.ID, C.TITLE, C.SYMBOLIC_NAME", $val, $match);
break;
case "LAMP":
if ($val == "red")
$arSqlSearch[] = "(V.ACTIVE<>'Y' or now()V.DATE_END)";
elseif ($val == "green")
$arSqlSearch[] = "(V.ACTIVE='Y' and now()>=V.DATE_START and now()<=V.DATE_END)";
break;
case "TITLE":
case "DESCRIPTION":
$match = ($arFilter[$key."_EXACT_MATCH"] == "Y" ? "N" : "Y");
$arSqlSearch[] = GetFilterQuery("V.".$key, $val, $match);
break;
}
}
$strSqlSearch = (!empty($arSqlSearch) ? " AND (".implode(") AND (", $arSqlSearch).") " : "");
$arSqlOrder = array();
foreach($arOrder as $by => $order)
{
$by = mb_strtoupper($by);
$by = (in_array($by, array("ID", "TITLE", "DATE_START", "DATE_END", "COUNTER", "ACTIVE", "C_SORT", "CHANNEL_ID")) ? $by : "ID");
$arSqlOrder[] = "V.".$by." ".(mb_strtoupper($order) == "ASC" ? "ASC" : "DESC");
}
DelDuplicateSort($arSqlOrder);
$strSqlOrder = (!empty($arSqlOrder) ? "ORDER BY ".implode(",", $arSqlOrder) : "");
$strSql = "
SELECT V.*, V.KEEP_IP_SEC as DELAY, 'S' as DELAY_TYPE,
C.TITLE as CHANNEL_TITLE,
C.SYMBOLIC_NAME as CHANNEL_SYMBOLIC_NAME,
C.C_SORT as CHANNEL_C_SORT,
C.FIRST_SITE_ID as CHANNEL_FIRST_SITE_ID,
C.ACTIVE as CHANNEL_ACTIVE,
C.HIDDEN as CHANNEL_HIDDEN,
C.TITLE as CHANNEL_TITLE,
C.VOTE_SINGLE as CHANNEL_VOTE_SINGLE,
C.USE_CAPTCHA as CHANNEL_USE_CAPTCHA,
".$DB->DateToCharFunction("V.TIMESTAMP_X")." TIMESTAMP_X,
".$DB->DateToCharFunction("V.DATE_START")." DATE_START,
".$DB->DateToCharFunction("V.DATE_END")." DATE_END,
CASE WHEN (C.ACTIVE = 'Y' AND V.ACTIVE = 'Y' AND V.DATE_START <= NOW() AND NOW() <= V.DATE_END)
THEN IF (C.VOTE_SINGLE != 'Y', 'green', 'yellow')
ELSE 'red'
END AS LAMP,
U.NAME, U.LAST_NAME, U.SECOND_NAME, U.PERSONAL_PHOTO, U.LOGIN,
".$DB->Concat("U.LAST_NAME", "' '", "U.NAME")." AUTH_USER_NAME
FROM b_vote V
INNER JOIN b_vote_channel C ON (V.CHANNEL_ID = C.ID)
LEFT JOIN b_user U ON (V.AUTHOR_ID = U.ID)
WHERE 1=1 ".$strSqlSearch." ".$strSqlOrder;
return new _CVoteDBResult($DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__));
}