- Модуль: vote
- Путь к файлу: ~/bitrix/modules/vote/classes/mysql/vote.php
- Класс: CVote
- Вызов: CVote::GetList
static function GetList($by = 's_id', $order = 'desc', $arFilter = [])
{
global $DB;
$err_mess = (CVote::err_mess())."
Function: GetList
Line: ";
$arSqlSearch = array();
$arFilter = (is_array($arFilter) ? $arFilter : array());
foreach ($arFilter as $key => $val)
{
if (is_string($val) && $val === "NOT_REF"):
continue;
endif;
$key = strtoupper($key);
switch($key)
{
case "ID":
$match = ($arFilter[$key."_EXACT_MATCH"] == "N" ? "Y" : "N");
$arSqlSearch[] = GetFilterQuery("V.ID", $val, $match);
break;
case "ACTIVE":
$arSqlSearch[] = "V.ACTIVE = '".($val == "Y" ? "Y" : "N")."'";
break;
case "DATE_START_1":
$arSqlSearch[] = "V.DATE_START >= ".$DB->CharToDateFunction($val, "SHORT");
break;
case "DATE_START_2":
$arSqlSearch[] = "V.DATE_START < ".$DB->CharToDateFunction($val, "SHORT")." + INTERVAL 1 DAY";
break;
case "DATE_END_1":
$arSqlSearch[] = "V.DATE_END >= ".$DB->CharToDateFunction($val, "SHORT");
break;
case "DATE_END_2":
$arSqlSearch[] = "V.DATE_END < ".$DB->CharToDateFunction($val, "SHORT")." + INTERVAL 1 DAY";
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 "CHANNEL":
$match = ($arFilter[$key."_EXACT_MATCH"] == "Y" ? "N" : "Y");
$arSqlSearch[] = GetFilterQuery("C.ID, C.TITLE, C.SYMBOLIC_NAME", $val, $match);
break;
case "CHANNEL_ID":
$match = ($arFilter[$key."_EXACT_MATCH"] == "N" ? "Y" : "N");
$arSqlSearch[] = GetFilterQuery("V.CHANNEL_ID", $val, $match);
break;
case "CHANNEL_ACTIVE":
case "CHANNEL_HIDDEN":
$arSqlSearch[] = "C.".str_replace("CHANNEL_", "", $key)." = '".($val == "Y" ? "Y" : "N")."'";
break;
case "TITLE":
case "DESCRIPTION":
$match = ($arFilter[$key."_EXACT_MATCH"] == "Y" ? "N" : "Y");
$arSqlSearch[] = GetFilterQuery("V.".$key, $val, $match);
break;
case "COUNTER_1":
$arSqlSearch[] = "V.COUNTER>='".intval($val)."'";
break;
case "COUNTER_2":
$arSqlSearch[] = "V.COUNTER<='".intval($val)."'";
break;
}
}
if ($by == "s_id") $strSqlOrder = "ORDER BY V.ID";
elseif ($by == "s_title") $strSqlOrder = "ORDER BY V.TITLE";
elseif ($by == "s_date_start") $strSqlOrder = "ORDER BY V.DATE_START";
elseif ($by == "s_date_end") $strSqlOrder = "ORDER BY V.DATE_END";
elseif ($by == "s_lamp") $strSqlOrder = "ORDER BY LAMP";
elseif ($by == "s_counter") $strSqlOrder = "ORDER BY V.COUNTER";
elseif ($by == "s_active") $strSqlOrder = "ORDER BY V.ACTIVE";
elseif ($by == "s_c_sort") $strSqlOrder = "ORDER BY V.C_SORT";
elseif ($by == "s_channel") $strSqlOrder = "ORDER BY V.CHANNEL_ID";
else
{
$strSqlOrder = "ORDER BY V.ID";
}
if ($order != "asc")
{
$strSqlOrder .= " desc ";
}
$strSqlSearch = GetFilterSqlSearch($arSqlSearch);
$strSql = "
SELECT VV.*, C.TITLE as CHANNEL_TITLE, C.ACTIVE as CHANNEL_ACTIVE,
C.HIDDEN as CHANNEL_HIDDEN, V.*, V.KEEP_IP_SEC as DELAY, 'S' as DELAY_TYPE,
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,
".$DB->DateToCharFunction("V.TIMESTAMP_X")." TIMESTAMP_X,
".$DB->DateToCharFunction("V.DATE_START")." DATE_START,
".$DB->DateToCharFunction("V.DATE_END")." DATE_END,
UNIX_TIMESTAMP(V.DATE_END) - UNIX_TIMESTAMP(V.DATE_START) PERIOD
FROM (
SELECT V.ID, COUNT(Q.ID) QUESTIONS
FROM b_vote V
INNER JOIN b_vote_channel C ON (C.ID=V.CHANNEL_ID)
LEFT JOIN b_vote_question Q ON (Q.VOTE_ID=V.ID)
WHERE ".$strSqlSearch."
GROUP BY V.ID
) VV
INNER JOIN b_vote V ON (V.ID = VV.ID)
INNER JOIN b_vote_channel C ON (C.ID = V.CHANNEL_ID) ".
$strSqlOrder;
$res = $DB->Query($strSql, false, $err_mess.__LINE__);
$res = new _CVoteDBResult($res);
return $res;
}