• Модуль: forum
  • Путь к файлу: ~/bitrix/modules/forum/classes/mysql/topic.php
  • Класс: CForumTopic
  • Вызов: CForumTopic::GetList
static function GetList($arOrder = Array("SORT"=>"ASC"), $arFilter = Array(), $bCount = false, $iNum = 0, $arAddParams = array())
{
	global $DB;
	$arOrder = (is_array($arOrder) ? $arOrder : array());
	$arFilter = (is_array($arFilter) ? $arFilter : array());
	$arAddParams = (is_array($arAddParams) ? $arAddParams : array($arAddParams));
	$selectTopCount = isset($arAddParams['nTopCount']) ? (int) $arAddParams['nTopCount'] : 0;
	$descPageNumbering = isset($arAddParams['bDescPageNumbering']) && $selectTopCount <= 0;
	$arSqlSearch = array();
	$arSqlSelect = array();
	$arSqlGroup = array();
	$arSqlOrder = array();
	$strSqlSearch = "";
	$strSqlSelect = "";
	$strSqlGroup = "";
	$strSqlOrder = "";
	$UseGroup = false;

	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 "STATE":
			case "APPROVED":
			case "XML_ID":
				$val = CForumNew::prepareField($strOperation, "string", $val);
				if ($val == '')
					$arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FT.".$key." IS NULL OR ".($DB->type == "MSSQL" ? "LEN" : "LENGTH")."(FT.".$key.")<=0)";
				else if ($strOperation == "IN")
					$arSqlSearch[] = ($strNegative=="Y"?" NOT ":"")."(FT.".$key." IN (".$val.") )";
				else
					$arSqlSearch[] = ($strNegative=="Y"?" FT.".$key." IS NULL OR NOT ":"")."(FT.".$key." ".$strOperation." '".$val."' )";
				break;
			case "ID":
			case "USER_START_ID":
			case "SOCNET_GROUP_ID":
			case "OWNER_ID":
			case "FORUM_ID":
			case "SORT":
			case "POSTS":
			case "TOPICS":
				if (($strOperation!="IN") && (intval($val) > 0))
					$arSqlSearch[] = ($strNegative=="Y"?" FT.".$key." IS NULL OR NOT ":"")."(FT.".$key." ".$strOperation." ".intval($val)." )";
				elseif (($strOperation =="IN") && ((is_array($val) && (array_sum($val) > 0)) || ($val <> '') ))
				{
					if (!is_array($val)) 
						$val = explode(',', $val);
					$val_int = array();
					foreach ($val as $v)
						$val_int[] = intval($v);
					$val = implode(", ", $val_int);

					$arSqlSearch[] = ($strNegative=="Y"?" NOT ":"")."(FT.".$key." IN (".$DB->ForSql($val).") )";
				}
				else 
					$arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FT.".$key." IS NULL OR FT.".$key."<=0)";
				break;
			case "RENEW_TOPIC":
//					vhodnye parametry tipa array("TID"=>time); 
//					pri TID = 0 peredaetsya FORUM_LAST_VISIT
				$arSqlTemp = array();
				$strSqlTemp = $val[0];
				unset($val[0]);
				if (is_array($val) && !empty($val))
				{
					foreach ($val as $k => $v)
						$arSqlTemp[] = "(FT.ID=".intval($k).") AND (FT.LAST_POST_DATE > ".$DB->CharToDateFunction($DB->ForSql($v), "FULL").")";

					$val_int = array();
					foreach (array_keys($val) as $k)
						$val_int[] = intval($k);
					$keys = implode(", ", $val_int);

				$arSqlSearch[] = 
						"(FT.ID IN (".$DB->ForSql($keys).") AND ((".implode(") OR (", $arSqlTemp).")))
						OR
						(FT.ID NOT IN (".$DB->ForSql($keys).") AND (FT.LAST_POST_DATE > ".$DB->CharToDateFunction($DB->ForSql($strSqlTemp), "FULL")."))";
				}
				break;
			case "START_DATE":
			case "LAST_POST_DATE":
				if($val == '')
					$arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FT.".$key." IS NULL)";
				else
					$arSqlSearch[] = ($strNegative=="Y"?" FT.".$key." IS NULL OR NOT ":"")."(FT.".$key." ".$strOperation." ".$DB->CharToDateFunction($DB->ForSql($val), "FULL").")";
				break;
		}
	}
	if (count($arSqlSearch)>0)
		$strSqlSearch = " AND (".implode(") AND (", $arSqlSearch).")";
	if (count($arSqlSelect) > 0)
		$strSqlSelect = ", ".implode(", ", $arSqlSelect);
	if ($UseGroup)
	{
		foreach ($arSqlSelect as $key => $val)
		{
			if (mb_substr($key, 0, 1) != "!")
				$arSqlGroup[$key] = $val;
		}
		if (!empty($arSqlGroup)):
			$strSqlGroup = ", ".implode(", ", $arSqlGroup);
		endif;
	}
	foreach ($arOrder as $by => $order)
	{
		$by = mb_strtoupper($by);
		$order = mb_strtoupper($order);
		if ($order!="ASC") $order = "DESC";
		if (in_array($by, array("ID", "FORUM_ID", "TOPIC_ID", "TITLE", "TAGS", "DESCRIPTION", "ICON",
				"STATE", "APPROVED", "SORT", "VIEWS", "USER_START_ID", "USER_START_NAME", "START_DATE", 
				"POSTS", "LAST_POSTER_ID", "LAST_POSTER_NAME", "LAST_POST_DATE", "LAST_MESSAGE_ID", 
				"POSTS_UNAPPROVED", "ABS_LAST_POSTER_ID", "ABS_LAST_POSTER_NAME", "ABS_LAST_POST_DATE", "ABS_LAST_MESSAGE_ID", 
				"SOCNET_GROUP_ID", "OWNER_ID", "HTML"))):
			$arSqlOrder[] = "FT.".$by." ".$order;
		else:
			$arSqlOrder[] = "FT.SORT ".$order;
			$by = "SORT";
		endif;
	}
	$arSqlOrder = array_unique($arSqlOrder);
	DelDuplicateSort($arSqlOrder); 
	if (count($arSqlOrder) > 0)
		$strSqlOrder = " ORDER BY ".implode(", ", $arSqlOrder);

	if ($bCount || $descPageNumbering)
	{
		$strSql = 
			"SELECT COUNT(FT.ID) as CNT 
			FROM b_forum_topic FT
			WHERE 1 = 1 
			".$strSqlSearch;
		$db_res = $DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__); $iCnt = 0; if ($ar_res = $db_res->Fetch()): $iCnt = intval($ar_res["CNT"]); endif; if ($bCount): return $iCnt; endif; } $arSQL = array("select" => "", "join" => ""); if (!empty($arAddParams["sNameTemplate"])) { $arSQL = array_merge_recursive( CForumUser::GetFormattedNameFieldsForSelect(array_merge( $arAddParams, array( "sUserTablePrefix" => "U_START.", "sForumUserTablePrefix" => "FU_START.", "sFieldName" => "USER_START_NAME_FRMT", "sUserIDFieldName" => "FT.USER_START_ID"))), CForumUser::GetFormattedNameFieldsForSelect(array_merge( $arAddParams, array( "sUserTablePrefix" => "U_LAST.", "sForumUserTablePrefix" => "FU_LAST.", "sFieldName" => "LAST_POSTER_NAME_FRMT", "sUserIDFieldName" => "FT.LAST_POSTER_ID"))), CForumUser::GetFormattedNameFieldsForSelect(array_merge( $arAddParams, array( "sUserTablePrefix" => "U_ABS_LAST.", "sForumUserTablePrefix" => "FU_ABS_LAST.", "sFieldName" => "ABS_LAST_POSTER_NAME_FRMT", "sUserIDFieldName" => "FT.ABS_LAST_POSTER_ID")))); $arSQL["select"] = ",nt".implode(",nt", $arSQL["select"]); $arSQL["join"] = "n".implode("n", $arSQL["join"]); } if ($UseGroup) { $strSql = " SELECT F_T.*, FT.FORUM_ID, FT.TOPIC_ID, FT.TITLE, FT.TAGS, FT.DESCRIPTION, FT.ICON, n". " FT.STATE, FT.APPROVED, FT.SORT, FT.VIEWS, FT.USER_START_ID, FT.USER_START_NAME, n". " ".CForumNew::Concat("-", array("FT.ID", "FT.TITLE_SEO"))." as TITLE_SEO, n". " ".$DB->DateToCharFunction("FT.START_DATE", "FULL")." as START_DATE, n". " FT.POSTS, FT.LAST_POSTER_ID, FT.LAST_POSTER_NAME, n". " ".$DB->DateToCharFunction("FT.LAST_POST_DATE", "FULL")." as LAST_POST_DATE, n". " FT.LAST_POST_DATE AS LAST_POST_DATE_ORIGINAL, FT.LAST_MESSAGE_ID, n". " FT.POSTS_UNAPPROVED, FT.ABS_LAST_POSTER_ID, FT.ABS_LAST_POSTER_NAME, n". " ".$DB->DateToCharFunction("FT.ABS_LAST_POST_DATE", "FULL")." as ABS_LAST_POST_DATE, n". " FT.ABS_LAST_POST_DATE AS ABS_LAST_POST_DATE_ORIGINAL, FT.ABS_LAST_MESSAGE_ID, n". " FT.SOCNET_GROUP_ID, FT.OWNER_ID, FT.HTML, FT.XML_ID".$arSQL["select"]." n". " FROM ( n". " SELECT FT.ID".$strSqlSelect." n". " FROM b_forum_topic FT n". " WHERE 1 = 1 ".$strSqlSearch." n". " GROUP BY FT.ID ".$strSqlGroup." n". " ) F_T n". " INNER JOIN b_forum_topic FT ON (F_T.ID = FT.ID) ".$arSQL["join"]." n". $strSqlOrder; } else { $strSql = " SELECT FT.ID, FT.FORUM_ID, FT.TOPIC_ID, FT.TITLE, FT.TAGS, FT.DESCRIPTION, FT.ICON, n". " FT.STATE, FT.APPROVED, FT.SORT, FT.VIEWS, FT.USER_START_ID, FT.USER_START_NAME, n". " ".CForumNew::Concat("-", array("FT.ID", "FT.TITLE_SEO"))." as TITLE_SEO, n". " ".$DB->DateToCharFunction("FT.START_DATE", "FULL")." as START_DATE, n". " FT.POSTS, FT.LAST_POSTER_ID, FT.LAST_POSTER_NAME, n". " ".$DB->DateToCharFunction("FT.LAST_POST_DATE", "FULL")." as LAST_POST_DATE, n". " FT.LAST_POST_DATE AS LAST_POST_DATE_ORIGINAL, FT.LAST_MESSAGE_ID, n". " FT.POSTS_UNAPPROVED, FT.ABS_LAST_POSTER_ID, FT.ABS_LAST_POSTER_NAME, n". " ".$DB->DateToCharFunction("FT.ABS_LAST_POST_DATE", "FULL")." as ABS_LAST_POST_DATE, n". " FT.ABS_LAST_POST_DATE AS ABS_LAST_POST_DATE_ORIGINAL, FT.ABS_LAST_MESSAGE_ID, n". " FT.SOCNET_GROUP_ID, FT.OWNER_ID, FT.HTML, FT.XML_ID".$strSqlSelect.$arSQL["select"]." n". " FROM b_forum_topic FT ".$arSQL["join"]. " n". " WHERE 1 = 1 ".$strSqlSearch." n". $strSqlOrder; } $limit = $iNum > 0 ? (int)$iNum : $selectTopCount; if ($limit > 0) { $strSql .= "nLIMIT 0,".$limit; } if (!$iNum && $descPageNumbering) { $db_res = new CDBResult(); $db_res->NavQuery($strSql, $iCnt, $arAddParams); } else { $db_res = $DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__); } return new _CTopicDBResult($db_res, $arAddParams); }