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);
}