- Модуль: 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;
}