• Модуль: forum
  • Путь к файлу: ~/bitrix/modules/forum/classes/general/user.php
  • Класс: CAllForumUser
  • Вызов: CAllForumUser::UserAddInfo
static function UserAddInfo($arOrder = array(), $arFilter = Array(), $mode = false, $iNum = 0, $check_permission = true, $arNavigation = array())
{
	global $DB, $USER;

	$arSqlFrom = array();
	$arSqlOrder = array();
	$arSqlSearch = array();
	$strSqlFrom = "";
	$strSqlOrder = "";
	$strSqlSearch = "";
	$arFilter = (is_array($arFilter) ? $arFilter : array());
	if (!CForumUser::IsAdmin() && $check_permission)
	{
		$arFilter["LID"] = SITE_ID;
		$arFilter["PERMISSION"] = true;
	}

	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 "ID":
			case "AUTHOR_ID":
			case "FORUM_ID":
			case "TOPIC_ID":
				if ($strOperation == 'IN'):
					$res = (is_array($val) ? $val : explode(",", $val));
					$val = array();
					foreach ($res as $v)
						$val[] = intval($v);
					$val = implode(",", $val);
				else:
					$val = intval($val);
				endif;
				if ($val <= 0)
					$arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FM.".$key." IS NULL OR FM.".$key."<=0)";
				else
					$arSqlSearch[] = ($strNegative=="Y"?" FM.".$key." IS NULL OR NOT ":"")."FM.".$key." ".$strOperation." (".$DB->ForSql($val).")";
				break;
			case "APPROVED":
				if ($val == '')
					$arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FM.".$key." IS NULL OR ".($DB->type == "MSSQL" ? "LEN" : "LENGTH")."(FM.".$key.")<=0)";
				else
					$arSqlSearch[] = ($strNegative=="Y"?" FM.".$key." IS NULL OR NOT ":"")."FM.".$key." ".$strOperation." '".$DB->ForSql($val)."'";
				break;
			case "DATE":
			case "POST_DATE":
				if ($val == '')
					$arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."FM.".$key." IS NULL";
				else
					$arSqlSearch[] = ($strNegative=="Y"?" FM.".$key." IS NULL OR NOT ":"")."FM.".$key." ".$strOperation." ".$DB->CharToDateFunction($DB->ForSql($val), "SHORT");
				break;
			case "LID":
				$arSqlFrom["FS2"] = "LEFT JOIN b_forum2site FS2 ON (FS2.FORUM_ID = FM.FORUM_ID)";
				$arSqlSearch[] = ($strNegative=="Y"?" NOT ":"")."(FS2.SITE_ID ".$strOperation." '".$DB->ForSql($val)."')";
				break;
			case "ACTIVE":
				$arSqlFrom["F"] = "INNER JOIN b_forum F ON (F.ID = FM.FORUM_ID)";
				if ($val == '')
					$arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(F.".$key." IS NULL OR ".($DB->type == "MSSQL" ? "LEN" : "LENGTH")."(F.".$key.")<=0)";
				else
					$arSqlSearch[] = ($strNegative=="Y"?" F.".$key." IS NULL OR NOT ":"")."F.".$key." ".$strOperation." '".$DB->ForSql($val)."'";
				break;
			case "USER_START_ID":
				if (!is_array($val))
					$val = array($val);
				$tmp = array();
				foreach ($val as $k=>$v)
					$tmp[] = intval(trim($v));
				$val = implode(",", $tmp);
				$arSqlFrom["FT"] = "INNER JOIN b_forum_topic FT ON (FT.ID = FM.TOPIC_ID)";
				if ($val == '')
					$arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."FT.".$key." IS NULL OR FT.".$key."<=0";
				else
					$arSqlSearch[] = ($strNegative=="Y"?" FT.".$key." IS NULL OR NOT ":"")."FT.".$key." ".$strOperation." (".$DB->ForSql($val).")";
				break;
			case "PERMISSION":
				$arSqlFrom["FP"] = "
					INNER JOIN (
						SELECT FP.FORUM_ID, MAX(FP.PERMISSION) AS PERMISSION
						FROM b_forum_perms FP
						WHERE FP.GROUP_ID IN (".$DB->ForSql(implode(",", $USER->GetUserGroupArray())).") AND FP.PERMISSION > 'A'
						GROUP BY FP.FORUM_ID) FPP ON (FPP.FORUM_ID = FM.FORUM_ID) ";
				$arSqlSearch[] = "(FPP.PERMISSION > 'A' AND (FM.APPROVED='Y' OR FPP.PERMISSION >= 'Q'))";
				break;
			case "TOPIC_TITLE":
			case "POST_MESSAGE":
				if ($key == "TOPIC_TITLE")
				{
					$key = "FT.TITLE";
					$arSqlFrom["FT"] = "INNER JOIN b_forum_topic FT ON (FT.ID = FM.TOPIC_ID)";
				}
				else
					$key = "FM.POST_MESSAGE";
				if ($strOperation == "LIKE")
					$val = "%".$val."%";

				if ($val == '')
					$arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(".$key." IS NULL OR ".($DB->type == "MSSQL" ? "LEN" : "LENGTH")."(".$key.")<=0)";
				else
					$arSqlSearch[] = ($strNegative=="Y"?" ".$key." IS NULL OR NOT ":"")."(".$key." ".$strOperation." '".$DB->ForSQL($val)."')";
				break;
		}
	}
	ksort($arSqlFrom);
	if (count($arSqlFrom) > 0)
		$strSqlFrom = " ".implode(" ", $arSqlFrom);

	if (count($arSqlSearch) > 0)
		$strSqlSearch = " AND (".implode(") AND (", $arSqlSearch).")";

	foreach ($arOrder as $key=>$val)
	{
		$key = mb_strtoupper($key); $val = (mb_strtoupper($val) != "ASC" ? "DESC" : "ASC");
		switch ($key)
		{
			case "FIRST_POST":
			case "LAST_POST":
				$arSqlOrder["LAST_POST"] = "FMM.".$key." ".$val;
			break;
			case "FORUM_ID":
			case "TOPIC_ID":
				$arSqlOrder["ID"] = " FT.".$key." ".$val;
			break;
		}
	}
	if (count($arSqlOrder)>0)
		$strSqlOrder = "ORDER BY ".implode(", ", $arSqlOrder);
	else
		$strSqlOrder = "ORDER BY FMM.FIRST_POST DESC";

	// *****************************************************
	$strSql = "
	SELECT FMM.*, FT.TITLE, FT.DESCRIPTION, FT.VIEWS, FT.LAST_POSTER_ID,
		".CForumNew::Concat("-", array("FT.ID", "FT.TITLE_SEO"))." as TITLE_SEO,
		".$DB->DateToCharFunction("FT.START_DATE", "FULL")." as START_DATE,
		FT.USER_START_NAME,	FT.USER_START_ID, FT.POSTS, FT.LAST_POSTER_NAME,
		FT.LAST_MESSAGE_ID, '' as IMAGE, '' as IMAGE_DESCR,
		FT.APPROVED, FT.STATE, FT.FORUM_ID, FT.ICON, FT.SORT, FT.HTML
	FROM
	(
		SELECT FM.TOPIC_ID, COUNT(FM.ID) AS COUNT_MESSAGE, MIN(FM.ID) AS FIRST_POST, MAX(FM.ID) AS LAST_POST
		FROM b_forum_message FM
		".$strSqlFrom."
		WHERE 1=1
		".$strSqlSearch."
		GROUP BY FM.TOPIC_ID
	) FMM
	LEFT JOIN b_forum_topic FT ON (FT.ID = FMM.TOPIC_ID)
	".$strSqlOrder;


	$cnt = false;
	if (! empty($arNavigation))
	{
		$strCountSql = "
			SELECT COUNT( DISTINCT FM.TOPIC_ID ) CNT
			FROM b_forum_message FM
			".$strSqlFrom."
			WHERE 1=1
			".$strSqlSearch;

		$dbCount_res = $DB->Query($strCountSql, false, "File: ".__FILE__."
Line: ".__LINE__); if ($dbCount_res && $arCount = $dbCount_res->Fetch()) { $cnt = $arCount['CNT']; } } if (empty($arNavigation) || !$cnt) { $db_res = $DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__); } else { if ($arNavigation["SIZEN"]) $arNavigation["nPageSize"] = $arNavigation["SIZEN"]; if ($arNavigation["PAGEN"]) $arNavigation["iNumPage"] = $arNavigation["PAGEN"]; $db_res = new CDBResult(); $db_res->NavQuery($strSql, $cnt, $arNavigation); } return new _CTopicDBResult($db_res, $arNavigation); }