PageRenderTime 44ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 0ms

/modules/forum/classes/mysql/topic.php

https://gitlab.com/alexprowars/bitrix
PHP | 629 lines | 605 code | 22 blank | 2 comment | 102 complexity | 6f4508d509603007ea1091c31ce862f1 MD5 | raw file
  1. <?
  2. require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/forum/classes/general/topic.php");
  3. class CForumTopic extends CAllForumTopic
  4. {
  5. public static function GetList($arOrder = Array("SORT"=>"ASC"), $arFilter = Array(), $bCount = false, $iNum = 0, $arAddParams = array())
  6. {
  7. global $DB;
  8. $arOrder = (is_array($arOrder) ? $arOrder : array());
  9. $arFilter = (is_array($arFilter) ? $arFilter : array());
  10. $arAddParams = (is_array($arAddParams) ? $arAddParams : array($arAddParams));
  11. $arSqlSearch = array();
  12. $arSqlSelect = array();
  13. $arSqlGroup = array();
  14. $arSqlOrder = array();
  15. $strSqlSearch = "";
  16. $strSqlSelect = "";
  17. $strSqlGroup = "";
  18. $strSqlOrder = "";
  19. $UseGroup = false;
  20. foreach ($arFilter as $key => $val)
  21. {
  22. $key_res = CForumNew::GetFilterOperation($key);
  23. $key = mb_strtoupper($key_res["FIELD"]);
  24. $strNegative = $key_res["NEGATIVE"];
  25. $strOperation = $key_res["OPERATION"];
  26. switch ($key)
  27. {
  28. case "STATE":
  29. case "APPROVED":
  30. case "XML_ID":
  31. $val = CForumNew::prepareField($strOperation, "string", $val);
  32. if ($val == '')
  33. $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FT.".$key." IS NULL OR ".($DB->type == "MSSQL" ? "LEN" : "LENGTH")."(FT.".$key.")<=0)";
  34. else if ($strOperation == "IN")
  35. $arSqlSearch[] = ($strNegative=="Y"?" NOT ":"")."(FT.".$key." IN (".$val.") )";
  36. else
  37. $arSqlSearch[] = ($strNegative=="Y"?" FT.".$key." IS NULL OR NOT ":"")."(FT.".$key." ".$strOperation." '".$val."' )";
  38. break;
  39. case "ID":
  40. case "USER_START_ID":
  41. case "SOCNET_GROUP_ID":
  42. case "OWNER_ID":
  43. case "FORUM_ID":
  44. case "SORT":
  45. case "POSTS":
  46. case "TOPICS":
  47. if (($strOperation!="IN") && (intval($val) > 0))
  48. $arSqlSearch[] = ($strNegative=="Y"?" FT.".$key." IS NULL OR NOT ":"")."(FT.".$key." ".$strOperation." ".intval($val)." )";
  49. elseif (($strOperation =="IN") && ((is_array($val) && (array_sum($val) > 0)) || ($val <> '') ))
  50. {
  51. if (!is_array($val))
  52. $val = explode(',', $val);
  53. $val_int = array();
  54. foreach ($val as $v)
  55. $val_int[] = intval($v);
  56. $val = implode(", ", $val_int);
  57. $arSqlSearch[] = ($strNegative=="Y"?" NOT ":"")."(FT.".$key." IN (".$DB->ForSql($val).") )";
  58. }
  59. else
  60. $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FT.".$key." IS NULL OR FT.".$key."<=0)";
  61. break;
  62. case "RENEW_TOPIC":
  63. // vhodnye parametry tipa array("TID"=>time);
  64. // pri TID = 0 peredaetsya FORUM_LAST_VISIT
  65. $arSqlTemp = array();
  66. $strSqlTemp = $val[0];
  67. unset($val[0]);
  68. if (is_array($val) && !empty($val))
  69. {
  70. foreach ($val as $k => $v)
  71. $arSqlTemp[] = "(FT.ID=".intval($k).") AND (FT.LAST_POST_DATE > ".$DB->CharToDateFunction($DB->ForSql($v), "FULL").")";
  72. $val_int = array();
  73. foreach (array_keys($val) as $k)
  74. $val_int[] = intval($k);
  75. $keys = implode(", ", $val_int);
  76. $arSqlSearch[] =
  77. "(FT.ID IN (".$DB->ForSql($keys).") AND ((".implode(") OR (", $arSqlTemp).")))
  78. OR
  79. (FT.ID NOT IN (".$DB->ForSql($keys).") AND (FT.LAST_POST_DATE > ".$DB->CharToDateFunction($DB->ForSql($strSqlTemp), "FULL")."))";
  80. }
  81. break;
  82. case "START_DATE":
  83. case "LAST_POST_DATE":
  84. if($val == '')
  85. $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FT.".$key." IS NULL)";
  86. else
  87. $arSqlSearch[] = ($strNegative=="Y"?" FT.".$key." IS NULL OR NOT ":"")."(FT.".$key." ".$strOperation." ".$DB->CharToDateFunction($DB->ForSql($val), "FULL").")";
  88. break;
  89. }
  90. }
  91. if (count($arSqlSearch)>0)
  92. $strSqlSearch = " AND (".implode(") AND (", $arSqlSearch).")";
  93. if (count($arSqlSelect) > 0)
  94. $strSqlSelect = ", ".implode(", ", $arSqlSelect);
  95. if ($UseGroup)
  96. {
  97. foreach ($arSqlSelect as $key => $val)
  98. {
  99. if (mb_substr($key, 0, 1) != "!")
  100. $arSqlGroup[$key] = $val;
  101. }
  102. if (!empty($arSqlGroup)):
  103. $strSqlGroup = ", ".implode(", ", $arSqlGroup);
  104. endif;
  105. }
  106. foreach ($arOrder as $by => $order)
  107. {
  108. $by = mb_strtoupper($by);
  109. $order = mb_strtoupper($order);
  110. if ($order!="ASC") $order = "DESC";
  111. if (in_array($by, array("ID", "FORUM_ID", "TOPIC_ID", "TITLE", "TAGS", "DESCRIPTION", "ICON",
  112. "STATE", "APPROVED", "SORT", "VIEWS", "USER_START_ID", "USER_START_NAME", "START_DATE",
  113. "POSTS", "LAST_POSTER_ID", "LAST_POSTER_NAME", "LAST_POST_DATE", "LAST_MESSAGE_ID",
  114. "POSTS_UNAPPROVED", "ABS_LAST_POSTER_ID", "ABS_LAST_POSTER_NAME", "ABS_LAST_POST_DATE", "ABS_LAST_MESSAGE_ID",
  115. "SOCNET_GROUP_ID", "OWNER_ID", "HTML"))):
  116. $arSqlOrder[] = "FT.".$by." ".$order;
  117. else:
  118. $arSqlOrder[] = "FT.SORT ".$order;
  119. $by = "SORT";
  120. endif;
  121. }
  122. $arSqlOrder = array_unique($arSqlOrder);
  123. DelDuplicateSort($arSqlOrder);
  124. if (count($arSqlOrder) > 0)
  125. $strSqlOrder = " ORDER BY ".implode(", ", $arSqlOrder);
  126. if ($bCount || (is_set($arAddParams, "bDescPageNumbering") && intval($arAddParams["nTopCount"]) <= 0))
  127. {
  128. $strSql =
  129. "SELECT COUNT(FT.ID) as CNT
  130. FROM b_forum_topic FT
  131. WHERE 1 = 1
  132. ".$strSqlSearch;
  133. $db_res = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__);
  134. $iCnt = 0;
  135. if ($ar_res = $db_res->Fetch()):
  136. $iCnt = intval($ar_res["CNT"]);
  137. endif;
  138. if ($bCount):
  139. return $iCnt;
  140. endif;
  141. }
  142. $arSQL = array("select" => "", "join" => "");
  143. if (!empty($arAddParams["sNameTemplate"]))
  144. {
  145. $arSQL = array_merge_recursive(
  146. CForumUser::GetFormattedNameFieldsForSelect(array_merge(
  147. $arAddParams, array(
  148. "sUserTablePrefix" => "U_START.",
  149. "sForumUserTablePrefix" => "FU_START.",
  150. "sFieldName" => "USER_START_NAME_FRMT",
  151. "sUserIDFieldName" => "FT.USER_START_ID"))),
  152. CForumUser::GetFormattedNameFieldsForSelect(array_merge(
  153. $arAddParams, array(
  154. "sUserTablePrefix" => "U_LAST.",
  155. "sForumUserTablePrefix" => "FU_LAST.",
  156. "sFieldName" => "LAST_POSTER_NAME_FRMT",
  157. "sUserIDFieldName" => "FT.LAST_POSTER_ID"))),
  158. CForumUser::GetFormattedNameFieldsForSelect(array_merge(
  159. $arAddParams, array(
  160. "sUserTablePrefix" => "U_ABS_LAST.",
  161. "sForumUserTablePrefix" => "FU_ABS_LAST.",
  162. "sFieldName" => "ABS_LAST_POSTER_NAME_FRMT",
  163. "sUserIDFieldName" => "FT.ABS_LAST_POSTER_ID"))));
  164. $arSQL["select"] = ",\n\t".implode(",\n\t", $arSQL["select"]);
  165. $arSQL["join"] = "\n".implode("\n", $arSQL["join"]);
  166. }
  167. if ($UseGroup)
  168. {
  169. $strSql =
  170. " SELECT F_T.*, FT.FORUM_ID, FT.TOPIC_ID, FT.TITLE, FT.TAGS, FT.DESCRIPTION, FT.ICON, \n".
  171. " FT.STATE, FT.APPROVED, FT.SORT, FT.VIEWS, FT.USER_START_ID, FT.USER_START_NAME, \n".
  172. " ".CForumNew::Concat("-", array("FT.ID", "FT.TITLE_SEO"))." as TITLE_SEO, \n".
  173. " ".$DB->DateToCharFunction("FT.START_DATE", "FULL")." as START_DATE, \n".
  174. " FT.POSTS, FT.LAST_POSTER_ID, FT.LAST_POSTER_NAME, \n".
  175. " ".$DB->DateToCharFunction("FT.LAST_POST_DATE", "FULL")." as LAST_POST_DATE, \n".
  176. " FT.LAST_POST_DATE AS LAST_POST_DATE_ORIGINAL, FT.LAST_MESSAGE_ID, \n".
  177. " FT.POSTS_UNAPPROVED, FT.ABS_LAST_POSTER_ID, FT.ABS_LAST_POSTER_NAME, \n".
  178. " ".$DB->DateToCharFunction("FT.ABS_LAST_POST_DATE", "FULL")." as ABS_LAST_POST_DATE, \n".
  179. " FT.ABS_LAST_POST_DATE AS ABS_LAST_POST_DATE_ORIGINAL, FT.ABS_LAST_MESSAGE_ID, \n".
  180. " FT.SOCNET_GROUP_ID, FT.OWNER_ID, FT.HTML, FT.XML_ID".$arSQL["select"]." \n".
  181. " FROM ( \n".
  182. " SELECT FT.ID".$strSqlSelect." \n".
  183. " FROM b_forum_topic FT \n".
  184. " WHERE 1 = 1 ".$strSqlSearch." \n".
  185. " GROUP BY FT.ID ".$strSqlGroup." \n".
  186. " ) F_T \n".
  187. " INNER JOIN b_forum_topic FT ON (F_T.ID = FT.ID) ".$arSQL["join"]." \n".
  188. $strSqlOrder;
  189. }
  190. else
  191. {
  192. $strSql =
  193. " SELECT FT.ID, FT.FORUM_ID, FT.TOPIC_ID, FT.TITLE, FT.TAGS, FT.DESCRIPTION, FT.ICON, \n".
  194. " FT.STATE, FT.APPROVED, FT.SORT, FT.VIEWS, FT.USER_START_ID, FT.USER_START_NAME, \n".
  195. " ".CForumNew::Concat("-", array("FT.ID", "FT.TITLE_SEO"))." as TITLE_SEO, \n".
  196. " ".$DB->DateToCharFunction("FT.START_DATE", "FULL")." as START_DATE, \n".
  197. " FT.POSTS, FT.LAST_POSTER_ID, FT.LAST_POSTER_NAME, \n".
  198. " ".$DB->DateToCharFunction("FT.LAST_POST_DATE", "FULL")." as LAST_POST_DATE, \n".
  199. " FT.LAST_POST_DATE AS LAST_POST_DATE_ORIGINAL, FT.LAST_MESSAGE_ID, \n".
  200. " FT.POSTS_UNAPPROVED, FT.ABS_LAST_POSTER_ID, FT.ABS_LAST_POSTER_NAME, \n".
  201. " ".$DB->DateToCharFunction("FT.ABS_LAST_POST_DATE", "FULL")." as ABS_LAST_POST_DATE, \n".
  202. " FT.ABS_LAST_POST_DATE AS ABS_LAST_POST_DATE_ORIGINAL, FT.ABS_LAST_MESSAGE_ID, \n".
  203. " FT.SOCNET_GROUP_ID, FT.OWNER_ID, FT.HTML, FT.XML_ID".$strSqlSelect.$arSQL["select"]." \n".
  204. " FROM b_forum_topic FT ".$arSQL["join"]. " \n".
  205. " WHERE 1 = 1 ".$strSqlSearch." \n".
  206. $strSqlOrder;
  207. }
  208. $iNum = intval($iNum);
  209. if ($iNum > 0 || intval($arAddParams["nTopCount"]) > 0)
  210. {
  211. $iNum = ($iNum > 0) ? $iNum : intval($arAddParams["nTopCount"]);
  212. $strSql .= "\nLIMIT 0,".$iNum;
  213. }
  214. if (!$iNum && is_set($arAddParams, "bDescPageNumbering") && intval($arAddParams["nTopCount"]) <= 0)
  215. {
  216. $db_res = new CDBResult();
  217. $db_res->NavQuery($strSql, $iCnt, $arAddParams);
  218. }
  219. else
  220. {
  221. $db_res = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__);
  222. }
  223. return new _CTopicDBResult($db_res, $arAddParams);
  224. }
  225. public static function GetListEx($arOrder = Array("SORT"=>"ASC"), $arFilter = Array(), $bCount = false, $iNum = 0, $arAddParams = array())
  226. {
  227. global $DB, $USER;
  228. $arOrder = (is_array($arOrder) ? $arOrder : array());
  229. $arFilter = (is_array($arFilter) ? $arFilter : array());
  230. $arSqlSearch = array();
  231. $arSqlFrom = array();
  232. $arSqlSelect = array();
  233. $arSqlGroup = array();
  234. $arSqlOrder = array();
  235. $strSqlSearch = "";
  236. $strSqlFrom = "";
  237. $strSqlSelect = "";
  238. $strSqlGroup = "";
  239. $strSqlOrder = "";
  240. $UseGroup = false;
  241. $arAddParams = (is_array($arAddParams) ? $arAddParams : array($arAddParams));
  242. foreach ($arFilter as $key => $val)
  243. {
  244. $key_res = CForumNew::GetFilterOperation($key);
  245. $key = mb_strtoupper($key_res["FIELD"]);
  246. $strNegative = $key_res["NEGATIVE"];
  247. $strOperation = $key_res["OPERATION"];
  248. switch ($key)
  249. {
  250. case "STATE":
  251. case "XML_ID":
  252. case "APPROVED":
  253. $val = CForumNew::prepareField($strOperation, "string", $val);
  254. if ($val == '')
  255. $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FT.".$key." IS NULL OR ".($DB->type == "MSSQL" ? "LEN" : "LENGTH")."(FT.".$key.")<=0)";
  256. else if ($strOperation == "IN")
  257. $arSqlSearch[] = ($strNegative=="Y"?" NOT ":"")."(FT.".$key." IN (".$val.") )";
  258. else
  259. $arSqlSearch[] = ($strNegative=="Y"?" FT.".$key." IS NULL OR NOT ":"")."(FT.".$key." ".$strOperation." '".$val."' )";
  260. break;
  261. case "ID":
  262. case "FORUM_ID":
  263. case "SOCNET_GROUP_ID":
  264. case "OWNER_ID":
  265. case "USER_START_ID":
  266. case "SORT":
  267. case "POSTS":
  268. case "TOPICS":
  269. if (($strOperation!="IN")&&(intval($val)>0))
  270. $arSqlSearch[] = ($strNegative=="Y"?" FT.".$key." IS NULL OR NOT ":"")."(FT.".$key." ".$strOperation." ".intval($val)." )";
  271. elseif (($strOperation =="IN") && ((is_array($val) && (array_sum($val) > 0)) || (is_string($val) && $val <> '') ))
  272. {
  273. if (!is_array($val))
  274. $val = explode(',', $val);
  275. $val_int = array();
  276. foreach ($val as $v)
  277. $val_int[] = intval($v);
  278. $val = implode(", ", $val_int);
  279. $arSqlSearch[] = ($strNegative=="Y"?" NOT ":"")."(FT.".$key." IN (".$DB->ForSql($val).") )";
  280. }
  281. else
  282. $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FT.".$key." IS NULL OR FT.".$key."<=0)";
  283. break;
  284. case "TITLE_ALL":
  285. $arSqlSearch[] = GetFilterQuery("FT.TITLE, FT.DESCRIPTION", $val);
  286. break;
  287. case "TITLE":
  288. case "DESCRIPTION":
  289. $arSqlSearch[] = GetFilterQuery("FT.".$key, $val);
  290. $arSqlSearch[] = GetFilterQuery("FT.".$key, $val);
  291. break;
  292. case "START_DATE":
  293. case "LAST_POST_DATE":
  294. case "ABS_LAST_POST_DATE":
  295. if($val == '')
  296. $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FT.".$key." IS NULL)";
  297. else
  298. $arSqlSearch[] = ($strNegative=="Y"?" FT.".$key." IS NULL OR NOT ":"")."(FT.".$key." ".$strOperation." ".$DB->CharToDateFunction($DB->ForSql($val), "FULL").")";
  299. break;
  300. case "USER_ID":
  301. $arSqlSelect["LAST_VISIT"] = $DB->DateToCharFunction("FUT.LAST_VISIT", "FULL");
  302. $arSqlFrom["FUT"] = "LEFT JOIN b_forum_user_topic FUT ON (".(
  303. $val == '' ?
  304. ($strNegative=="Y"?"NOT":"")."(FUT.USER_ID IS NULL)"
  305. :
  306. "FUT.USER_ID=".intval($val)
  307. )." AND FUT.FORUM_ID = FT.FORUM_ID AND FUT.TOPIC_ID = FT.ID)";
  308. break;
  309. case "RENEW_TOPIC":
  310. if (($val <> '') && array_key_exists("FUT", $arSqlFrom))
  311. {
  312. $arSqlSearch[] =
  313. "((FT.LAST_POST_DATE ".$strOperation." ".$DB->CharToDateFunction($DB->ForSql($val), "FULL").") AND
  314. (
  315. (LAST_VISIT IS NULL) OR
  316. (LAST_VISIT < ".$DB->CharToDateFunction($DB->ForSql($val), "FULL").")
  317. )
  318. )
  319. OR
  320. ((FT.LAST_POST_DATE > FUT.LAST_VISIT) AND
  321. (
  322. (LAST_VISIT IS NOT NULL) AND
  323. (LAST_VISIT > ".$DB->CharToDateFunction($DB->ForSql($val), "FULL").")
  324. )
  325. )";
  326. }
  327. break;
  328. case "PERMISSION":
  329. if (!is_array($val))
  330. $val = explode(',', $val);
  331. if (empty($val)):
  332. $val = $GLOBALS["USER"]->GetGroups();
  333. elseif (is_array($val)):
  334. $val_int = array();
  335. foreach ($val as $v)
  336. $val_int[] = intval($v);
  337. $val = implode(", ", $val_int);
  338. endif;
  339. $arSqlFrom["FPP"] =
  340. " INNER JOIN ( \n".
  341. " SELECT FPP.FORUM_ID, MAX(FPP.PERMISSION) AS PERMISSION \n".
  342. " FROM b_forum_perms FPP \n".
  343. " WHERE FPP.GROUP_ID IN (".$DB->ForSql($val).") AND FPP.PERMISSION > 'A' \n".
  344. " GROUP BY FPP.FORUM_ID) FPP ON (FPP.FORUM_ID = FT.FORUM_ID) ";
  345. $arSqlSelect["PERMISSION"] = "FPP.PERMISSION";
  346. break;
  347. case "RENEW":
  348. $val = (is_array($val) ? $val : array("USER_ID" => $val));
  349. $val["USER_ID"] = intval($val["USER_ID"]);
  350. if ($val["USER_ID"] <= 0):
  351. break;
  352. endif;
  353. $perms = "NOT_CHECK";
  354. $arUserGroups = $GLOBALS["USER"]->GetGroups();
  355. if (is_set($arFilter, "PERMISSION")):
  356. $perms = "NORMAL";
  357. elseif (is_set($arFilter, "APPROVED") && $arFilter["APPROVED"] == "Y"):
  358. $perms = "ONLY_APPROVED";
  359. endif;
  360. $arSqlFrom["FUT"] = "LEFT JOIN b_forum_user_topic FUT ON (FUT.USER_ID=".intval($val["USER_ID"])." AND FUT.FORUM_ID = FT.FORUM_ID AND FUT.TOPIC_ID = FT.ID)";
  361. $arSqlFrom["FUF"] = "LEFT JOIN b_forum_user_forum FUF ON (FUF.USER_ID=".$val["USER_ID"]." AND FUF.FORUM_ID = FT.FORUM_ID)";
  362. $arSqlFrom["FUF_ALL"] = "LEFT JOIN b_forum_user_forum FUF_ALL ON (FUF_ALL.USER_ID=".$val["USER_ID"]." AND FUF_ALL.FORUM_ID = 0)";
  363. $arSqlSearch[] = "FT.STATE != 'L'";
  364. $arSqlSearch[] = "
  365. (
  366. FUT.LAST_VISIT IS NULL
  367. AND
  368. (
  369. (FUF_ALL.LAST_VISIT IS NULL AND FUF.LAST_VISIT IS NULL)
  370. OR
  371. (
  372. FUF.LAST_VISIT IS NOT NULL
  373. AND
  374. (
  375. ".
  376. ( $perms == "NORMAL" ? "
  377. (FPP.PERMISSION >= 'Q' AND FUF.LAST_VISIT < FT.ABS_LAST_POST_DATE)
  378. OR
  379. (FT.APPROVED = 'Y' AND FUF.LAST_VISIT < FT.LAST_POST_DATE)
  380. " :
  381. ( $perms == "NOT_CHECK" ? "
  382. (FUF.LAST_VISIT < FT.ABS_LAST_POST_DATE OR FUF.LAST_VISIT < FT.LAST_POST_DATE)
  383. " :
  384. "
  385. (FT.APPROVED = 'Y' AND FUF.LAST_VISIT < FT.LAST_POST_DATE)
  386. "
  387. )
  388. )
  389. ."
  390. )
  391. )
  392. OR
  393. (
  394. FUF.LAST_VISIT IS NULL AND FUF_ALL.LAST_VISIT IS NOT NULL
  395. AND
  396. (
  397. ".
  398. ( $perms == "NORMAL" ? "
  399. (FPP.PERMISSION >= 'Q' AND FUF_ALL.LAST_VISIT < FT.ABS_LAST_POST_DATE)
  400. OR
  401. (FT.APPROVED = 'Y' AND FUF_ALL.LAST_VISIT < FT.LAST_POST_DATE)
  402. " :
  403. ( $perms == "NOT_CHECK" ? "
  404. (FUF_ALL.LAST_VISIT < FT.ABS_LAST_POST_DATE OR FUF_ALL.LAST_VISIT < FT.LAST_POST_DATE)
  405. " :
  406. "
  407. (FT.APPROVED = 'Y' AND FUF_ALL.LAST_VISIT < FT.LAST_POST_DATE)
  408. "
  409. )
  410. )
  411. ."
  412. )
  413. )
  414. )
  415. )
  416. OR
  417. (
  418. FUT.LAST_VISIT IS NOT NULL
  419. AND
  420. (
  421. ".
  422. ( $perms == "NORMAL" ? "
  423. (FPP.PERMISSION >= 'Q' AND FUT.LAST_VISIT < FT.ABS_LAST_POST_DATE)
  424. OR
  425. (FT.APPROVED = 'Y' AND FUT.LAST_VISIT < FT.LAST_POST_DATE)
  426. " :
  427. ( $perms == "NOT_CHECK" ? "
  428. (FUT.LAST_VISIT < FT.ABS_LAST_POST_DATE OR FUT.LAST_VISIT < FT.LAST_POST_DATE)
  429. " :
  430. "
  431. (FT.APPROVED = 'Y' AND FUT.LAST_VISIT < FT.LAST_POST_DATE)
  432. "
  433. )
  434. )
  435. ." )
  436. )";
  437. break;
  438. case "PERMISSION_STRONG":
  439. $arSqlFrom["FP"] = "LEFT JOIN b_forum_perms FP ON (FP.FORUM_ID=FT.FORUM_ID)";
  440. $arSqlSearch[] = "FP.GROUP_ID IN (".$DB->ForSql($USER->GetGroups()).") AND (FP.PERMISSION IN ('Q','U','Y'))";
  441. $UseGroup = true;
  442. break;
  443. }
  444. }
  445. if (count($arSqlSearch)>0)
  446. $strSqlSearch = " AND (".implode(") AND (", $arSqlSearch).")";
  447. if (count($arSqlSelect) > 0)
  448. {
  449. $res = array();
  450. foreach ($arSqlSelect as $key => $val)
  451. {
  452. if (mb_substr($key, 0, 1) == "!")
  453. $key = mb_substr($key, 1);
  454. if ($key != $val)
  455. $res[] = $val." AS ".$key;
  456. else
  457. $res[] = $val;
  458. }
  459. $strSqlSelect = ", ".implode(", ", $res);
  460. }
  461. if (count($arSqlFrom) > 0)
  462. $strSqlFrom = implode("\n", $arSqlFrom);
  463. if ($UseGroup)
  464. {
  465. foreach ($arSqlSelect as $key => $val)
  466. {
  467. if (mb_substr($key, 0, 1) != "!")
  468. $arSqlGroup[$key] = $val;
  469. }
  470. if (!empty($arSqlGroup)):
  471. $strSqlGroup = ", ".implode(", ", $arSqlGroup);
  472. endif;
  473. }
  474. foreach ($arOrder as $by => $order)
  475. {
  476. $by = mb_strtoupper($by);
  477. $order = mb_strtoupper($order);
  478. if ($order!="ASC") $order = "DESC";
  479. if (in_array($by, array("ID", "FORUM_ID", "TOPIC_ID", "TITLE", "TAGS", "DESCRIPTION", "ICON",
  480. "STATE", "APPROVED", "SORT", "VIEWS", "USER_START_ID", "USER_START_NAME", "START_DATE",
  481. "POSTS", "LAST_POSTER_ID", "LAST_POSTER_NAME", "LAST_POST_DATE", "LAST_MESSAGE_ID",
  482. "POSTS_UNAPPROVED", "ABS_LAST_POSTER_ID", "ABS_LAST_POSTER_NAME", "ABS_LAST_POST_DATE", "ABS_LAST_MESSAGE_ID",
  483. "SOCNET_GROUP_ID", "OWNER_ID", "HTML", "XML_ID"))):
  484. $arSqlOrder[] = "FT.".$by." ".$order;
  485. elseif ($by == "FORUM_NAME"):
  486. $arSqlOrder[] = "F.NAME ".$order;
  487. else:
  488. $arSqlOrder[] = "FT.SORT ".$order;
  489. $by = "SORT";
  490. endif;
  491. }
  492. $arSqlOrder = array_unique($arSqlOrder);
  493. DelDuplicateSort($arSqlOrder);
  494. if (count($arSqlOrder) > 0):
  495. $strSqlOrder = " ORDER BY ".implode(", ", $arSqlOrder);
  496. endif;
  497. if ($bCount || (is_set($arAddParams, "bDescPageNumbering") && intval($arAddParams["nTopCount"])<=0))
  498. {
  499. $strSql = "SELECT COUNT(FT.ID) as CNT FROM b_forum_topic FT ";
  500. $arCountSqlFrom = $arSqlFrom;
  501. if (isset($arSqlFrom['FUT']) && (mb_strpos($strSqlSearch, "FUT.") === false))
  502. unset($arCountSqlFrom['FUT']);
  503. $strSqlCountFrom = implode("\n", $arCountSqlFrom);
  504. $strSql .= $strSqlCountFrom . " WHERE 1 = 1 ".$strSqlSearch;
  505. $db_res = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__);
  506. $iCnt = 0;
  507. if ($ar_res = $db_res->Fetch())
  508. {
  509. $iCnt = intval($ar_res["CNT"]);
  510. }
  511. if ($bCount)
  512. return $iCnt;
  513. }
  514. $arSQL = array("select" => "", "join" => "");
  515. if (!empty($arAddParams["sNameTemplate"]))
  516. {
  517. $arSQL = array_merge_recursive(
  518. CForumUser::GetFormattedNameFieldsForSelect(array_merge(
  519. $arAddParams, array(
  520. "sUserTablePrefix" => "U_START.",
  521. "sForumUserTablePrefix" => "FU_START.",
  522. "sFieldName" => "USER_START_NAME_FRMT",
  523. "sUserIDFieldName" => "FT.USER_START_ID"))),
  524. CForumUser::GetFormattedNameFieldsForSelect(array_merge(
  525. $arAddParams, array(
  526. "sUserTablePrefix" => "U_LAST.",
  527. "sForumUserTablePrefix" => "FU_LAST.",
  528. "sFieldName" => "LAST_POSTER_NAME_FRMT",
  529. "sUserIDFieldName" => "FT.LAST_POSTER_ID"))),
  530. CForumUser::GetFormattedNameFieldsForSelect(array_merge(
  531. $arAddParams, array(
  532. "sUserTablePrefix" => "U_ABS_LAST.",
  533. "sForumUserTablePrefix" => "FU_ABS_LAST.",
  534. "sFieldName" => "ABS_LAST_POSTER_NAME_FRMT",
  535. "sUserIDFieldName" => "FT.ABS_LAST_POSTER_ID"))));
  536. $arSQL["select"] = ",\n\t".implode(",\n\t", $arSQL["select"]);
  537. $arSQL["join"] = "\n".implode("\n", $arSQL["join"]);
  538. }
  539. if ($UseGroup)
  540. {
  541. $strSql =
  542. " SELECT F_T.*, FT.FORUM_ID, FT.TOPIC_ID, FT.TITLE, FT.TAGS, FT.DESCRIPTION, FT.ICON, \n".
  543. " FT.STATE, FT.APPROVED, FT.SORT, FT.VIEWS, FT.USER_START_ID, FT.USER_START_NAME, \n".
  544. " ".CForumNew::Concat("-", array("FT.ID", "FT.TITLE_SEO"))." as TITLE_SEO, \n".
  545. " ".$DB->DateToCharFunction("FT.START_DATE", "FULL")." as START_DATE, \n".
  546. " FT.POSTS, FT.LAST_POSTER_ID, FT.LAST_POSTER_NAME, \n".
  547. " ".$DB->DateToCharFunction("FT.LAST_POST_DATE", "FULL")." as LAST_POST_DATE, \n".
  548. " FT.LAST_POST_DATE AS LAST_POST_DATE_ORIGINAL, FT.LAST_MESSAGE_ID, \n".
  549. " FT.POSTS_UNAPPROVED, FT.ABS_LAST_POSTER_ID, FT.ABS_LAST_POSTER_NAME, \n".
  550. " ".$DB->DateToCharFunction("FT.ABS_LAST_POST_DATE", "FULL")." as ABS_LAST_POST_DATE, \n".
  551. " FT.ABS_LAST_POST_DATE AS ABS_LAST_POST_DATE_ORIGINAL, FT.ABS_LAST_MESSAGE_ID, \n".
  552. " FT.SOCNET_GROUP_ID, FT.OWNER_ID, FT.HTML, FT.XML_ID, \n".
  553. " F.NAME as FORUM_NAME, \n".
  554. " '' as IMAGE, '' as IMAGE_DESCR ".$arSQL["select"]." \n".
  555. " FROM \n".
  556. " ( \n".
  557. " SELECT FT.ID".$strSqlSelect." \n".
  558. " FROM b_forum_topic FT \n".
  559. " LEFT JOIN b_forum F ON (FT.FORUM_ID = F.ID) \n".
  560. " ".$strSqlFrom." \n".
  561. " WHERE 1 = 1 ".$strSqlSearch." \n".
  562. " GROUP BY FT.ID".$strSqlGroup." \n".
  563. " ) F_T \n".
  564. " INNER JOIN b_forum_topic FT ON (F_T.ID = FT.ID) \n".
  565. " LEFT JOIN b_forum F ON (FT.FORUM_ID = F.ID) ".$arSQL["join"]." \n".
  566. $strSqlOrder;
  567. }
  568. else
  569. {
  570. $strSql =
  571. " SELECT FT.ID, FT.FORUM_ID, FT.TOPIC_ID, FT.TITLE, FT.TAGS, FT.DESCRIPTION, FT.ICON, \n".
  572. " FT.STATE, FT.APPROVED, FT.SORT, FT.VIEWS, FT.USER_START_ID, FT.USER_START_NAME, \n".
  573. " ".CForumNew::Concat("-", array("FT.ID", "FT.TITLE_SEO"))." as TITLE_SEO, \n".
  574. " ".$DB->DateToCharFunction("FT.START_DATE", "FULL")." as START_DATE, \n".
  575. " FT.POSTS, FT.LAST_POSTER_ID, FT.LAST_POSTER_NAME, \n".
  576. " ".$DB->DateToCharFunction("FT.LAST_POST_DATE", "FULL")." as LAST_POST_DATE, \n".
  577. " FT.LAST_POST_DATE AS LAST_POST_DATE_ORIGINAL, FT.LAST_MESSAGE_ID, \n".
  578. " FT.POSTS_UNAPPROVED, FT.ABS_LAST_POSTER_ID, FT.ABS_LAST_POSTER_NAME, \n".
  579. " ".$DB->DateToCharFunction("FT.ABS_LAST_POST_DATE", "FULL")." as ABS_LAST_POST_DATE, \n".
  580. " FT.ABS_LAST_POST_DATE AS ABS_LAST_POST_DATE_ORIGINAL, FT.ABS_LAST_MESSAGE_ID, \n".
  581. " FT.SOCNET_GROUP_ID, FT.OWNER_ID, FT.HTML, FT.XML_ID, \n".
  582. " F.NAME as FORUM_NAME, \n".
  583. " '' as IMAGE, '' as IMAGE_DESCR".$strSqlSelect.$arSQL["select"]." \n".
  584. " FROM b_forum_topic FT \n".
  585. " LEFT JOIN b_forum F ON (FT.FORUM_ID = F.ID) \n".
  586. " ".$strSqlFrom.$arSQL["join"]." \n".
  587. " WHERE 1 = 1 ".$strSqlSearch." \n".
  588. $strSqlOrder;
  589. }
  590. $iNum = intval($iNum);
  591. if ($iNum > 0 || intval($arAddParams["nTopCount"]) > 0)
  592. {
  593. $iNum = ($iNum > 0) ? $iNum : intval($arAddParams["nTopCount"]);
  594. $strSql .= "\nLIMIT 0,".$iNum;
  595. }
  596. if (!$iNum && is_set($arAddParams, "bDescPageNumbering") && intval($arAddParams["nTopCount"]) <= 0)
  597. {
  598. $db_res = new CDBResult();
  599. $db_res->NavQuery($strSql, $iCnt, $arAddParams);
  600. }
  601. else
  602. {
  603. $db_res = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__);
  604. }
  605. return new _CTopicDBResult($db_res, $arAddParams);
  606. }
  607. }