• Модуль: forum
  • Путь к файлу: ~/bitrix/modules/forum/classes/mysql/message.php
  • Класс: CForumFiles
  • Вызов: CForumFiles::GetList
static function GetList($arOrder = Array("ID"=>"ASC"), $arFilter = Array(), $iNum = 0, $arAddParams = array())
{
	global $DB;
	$arSqlSearch = array();
	$arSqlOrder = array();
	$strSqlSearch = "";
	$strSqlOrder = "";
	$iCnt = 0;
	$iNum = intval($iNum);
	$arFilter = (is_array($arFilter) ? $arFilter : array());
	$arAddParams = (is_array($arAddParams) ? $arAddParams : array());
	if (isset($arAddParams["nTopCount"]) && intval($arAddParams["nTopCount"]) > 0)
		unset($arAddParams["bDescPageNumbering"]);

	foreach ($arFilter as $key => $val)
	{
		$key_res = CForumNew::GetFilterOperation($key);
		$key = mb_strtoupper($key_res["FIELD"]);
		$strNegative = $key_res["NEGATIVE"];
		$strOperation = $key_res["OPERATION"];

		switch ($key)
		{
			case "PARAM1":
			case "AUTHOR_NAME":
			case "POST_MESSAGE_CHECK":
			case "APPROVED":
				if ($val == '')
					$arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FM.".$key." IS NULL OR LENGTH(FM.".$key.")<=0)";
				else
					$arSqlSearch[] = ($strNegative=="Y"?" FM.".$key." IS NULL OR NOT ":"")."(FM.".$key." ".$strOperation." '".$DB->ForSql($val)."' )";
				break;
			// to table b_forum_message
			case "APPROVED_AND_MINE":
				if ($val >= 0)
					$arSqlSearch[] = "(FM.APPROVED='Y' OR FM.AUTHOR_ID=".intval($val).")";
				else
					$arSqlSearch[] = "(FM.APPROVED='Y')";
				break;
			case "PARAM2":
			case "FORUM_ID":
			case "TOPIC_ID":
			case "AUTHOR_ID":
				if (($strOperation!="IN") && (intval($val) > 0))
					$arSqlSearch[] = ($strNegative=="Y"?" FM.".$key." IS NULL OR NOT ":"")."(FM.".$key." ".$strOperation." ".intval($val)." )";
				elseif ($strOperation == "IN" && (is_array($val) && array_sum($val) > 0 || is_string($val) && $val <> ''))
				{
					if (is_array($val))
					{
						$val_int = array();
						foreach ($val as $v)
							$val_int[] = intval($v);
						$val = implode(", ", $val_int);
					}
					$arSqlSearch[] = ($strNegative=="Y"?" NOT ":"")."(FM.".$key." IN (".$DB->ForSql($val).") )";
				}
				else
					$arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FM.".$key." IS NULL OR FM.".$key."<=0)";
				break;
			// to table b_forum_file
			case "FILE_FORUM_ID":
			case "FILE_TOPIC_ID":
			case "FILE_MESSAGE_ID":
			$key = mb_substr($key, 5);
				if ($strOperation != "IN" && intval($val) > 0)
				{
					$res = ($strNegative=="Y"?" FF.".$key." IS NULL OR NOT ":"")."(FF.".$key." ".$strOperation." ".intval($val)." ) OR ".
						"".($strNegative=="Y"?"NOT":"")."(FF.".$key." IS NULL OR FF.".$key."<=0)";
					$arSqlSearch[] = $res;
					break;
				}
				elseif ($strOperation == "IN" && (is_array($val) && array_sum($val) > 0 || is_string($val) && $val <> ''))
				{
					$val = (!is_array($val) ? explode(",", $val) : $val);
					$val_int = array();
					foreach ($val as $k => $v):
						$val_int[] = intval($v);
					endforeach;
					$val = implode(",", $val_int);
					if ($val <> '')
					{
						$arSqlSearch[] = ($strNegative=="Y"?" NOT ":"")."(FF.".$key." IN (".$DB->ForSql($val).") )";
						break;
					}
				}
				$arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FF.".$key." IS NULL OR FF.".$key."<=0)";
				break;
			case "FILE_ID":
			case "MESSAGE_ID":
			case "USER_ID":
				if (($strOperation!="IN") && (intval($val) > 0 || $val === 0))
				{
					$arSqlSearch[] = ($strNegative=="Y"?" FF.".$key." IS NULL OR NOT ":"")."(FF.".$key." ".$strOperation." ".intval($val)." )";
					break;
				}
				elseif ($strOperation =="IN" && (is_array($val) && array_sum($val) > 0 || $val <> ''))
				{
					$val = (!is_array($val) ? explode(",", $val) : $val);
					$val_int = array();
					foreach ($val as $k => $v):
						$val_int[] = intval($v);
					endforeach;
					$val = implode(",", $val_int);
					if ($val <> '')
					{
						$arSqlSearch[] = ($strNegative=="Y"?" NOT ":"")."(FF.".$key." IN (".$DB->ForSql($val).") )";
						break;
					}
				}
				$arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FF.".$key." IS NULL OR FF.".$key."<=0)";
				break;
			case "EDIT_DATE":
			case "POST_DATE":
				if ($val == '')
					$arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FM.".$key." IS NULL OR LENGTH(FM.".$key.")<=0)";
				else
					$arSqlSearch[] = ($strNegative=="Y"?" FM.".$key." IS NULL OR NOT ":"")."(FM.".$key." ".$strOperation." ".$DB->CharToDateFunction($DB->ForSql($val), "FULL")." )";
				break;
			case "PERMISSION":
				if ((is_array($val)) && (count($val)>0))
				{
					$return = array();
					foreach ($val as $value)
					{
						$str = array();
						foreach ($value as $k => $v)
						{
							$k_res = CForumNew::GetFilterOperation($k);
							$k = mb_strtoupper($k_res["FIELD"]);
							$strNegative = $k_res["NEGATIVE"];
							$strOperation = $k_res["OPERATION"];
							switch ($k)
							{
								case "TOPIC_ID":
								case "FORUM_ID":
									if (intval($v)<=0)
										$str[] = ($strNegative=="Y"?"NOT":"")."(FM.".$k." IS NULL OR FM.".$k."<=0)";
									else
										$str[] = ($strNegative=="Y"?" FM.".$k." IS NULL OR NOT ":"")."(FM.".$k." ".$strOperation." ".intval($v)." )";
									break;
								case "APPROVED":
									if ($v == '')
										$str[] = ($strNegative=="Y"?"NOT":"")."(FM.APPROVED IS NULL OR LENGTH(FM.APPROVED)<=0)";
									else
										$str[] = ($strNegative=="Y"?" FM.APPROVED IS NULL OR NOT ":"")."FM.APPROVED ".$strOperation." '".$DB->ForSql($v)."' ";
									break;
							}
						}
						$return[] = implode(" AND ", $str);
					}
					if (count($return)>0)
						$arSqlSearch[] = "(".implode(") OR (", $return).")";
				}
				break;
		}
	}
	if (count($arSqlSearch) > 0)
		$strSqlSearch = " AND (".implode(") AND (", $arSqlSearch).") ";

	foreach ($arOrder as $by=>$order)
	{
		$by = mb_strtoupper($by);
		$order = mb_strtoupper($order);
		if ($order!="ASC") $order = "DESC";
		if ($by == "FILE_ID") $arSqlOrder[] = " FF.FILE_ID ".$order." ";
		elseif ($by == "FORUM_ID") $arSqlOrder[] = " FF.FORUM_ID ".$order." ";
		elseif ($by == "TOPIC_ID") $arSqlOrder[] = " FF.TOPIC_ID ".$order." ";
		elseif ($by == "MESSAGE_ID") $arSqlOrder[] = " FF.MESSAGE_ID ".$order." ";
		else
		{
			$arSqlOrder[] = " FF.FILE_ID ".$order." ";
			$by = "FILE_ID";
		}
	}
	DelDuplicateSort($arSqlOrder);
	if(count($arSqlOrder) > 0)
		$strSqlOrder = " ORDER BY ".implode(", ", $arSqlOrder);

	$strSql =
		"SELECT BF.ID, BF.HEIGHT, BF.WIDTH, BF.FILE_SIZE, BF.CONTENT_TYPE, BF.SUBDIR, BF.FILE_NAME,
			BF.ORIGINAL_NAME, FF.FILE_ID, FF.FORUM_ID,  FF.TOPIC_ID,  FF.MESSAGE_ID,  FF.USER_ID, FF.HITS,
			".$DB->DateToCharFunction("FF.TIMESTAMP_X", "FULL")." as TIMESTAMP_X, BF.HANDLER_ID
		FROM b_forum_file FF
			INNER JOIN b_file BF ON (BF.ID = FF.FILE_ID)
			LEFT JOIN b_forum_message FM ON (FM.ID=FF.MESSAGE_ID)
		WHERE 1 = 1
		".$strSqlSearch."
		".$strSqlOrder;
	if ($iNum > 0 || (isset($arAddParams["nTopCount"]) && intval($arAddParams["nTopCount"]) > 0))
	{
		$iNum = ($iNum > 0) ? $iNum : intval($arAddParams["nTopCount"]);
		$strSql = "SELECT * FROM(".$strSql.") WHERE ROWNUM<=".$iNum;
	}
	elseif (is_set($arAddParams, "bDescPageNumbering"))
	{
		$iCnt = 0;
		$strSql1 = "SELECT COUNT(FM.ID) as CNT FROM b_forum_message FM WHERE 1 = 1 ".$strSqlSearch;
		$db_res = $DB->Query($strSql1, false, "File: ".__FILE__."
Line: ".__LINE__); if ($ar_res = $db_res->Fetch()) $iCnt = intval($ar_res["CNT"]); $db_res = new CDBResult(); $db_res->NavQuery($strSql, $iCnt, $arAddParams); } else { $db_res = $DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__); } return $db_res; }