• Модуль: vote
  • Путь к файлу: ~/bitrix/modules/vote/classes/mysql/vote.php
  • Класс: CVote
  • Вызов: CVote::GetListEx
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__)); }