PageRenderTime 50ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 1ms

/modules/forum/classes/mysql/user.php

https://gitlab.com/alexprowars/bitrix
PHP | 854 lines | 807 code | 40 blank | 7 comment | 145 complexity | 26db845cbc86eb6773f39a30e54a355a MD5 | raw file
  1. <?
  2. require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/forum/classes/general/user.php");
  3. class CForumUser extends CAllForumUser
  4. {
  5. public static function GetList($arOrder = Array("ID"=>"ASC"), $arFilter = Array(), $arAddParams = array())
  6. {
  7. global $DB;
  8. $arSqlSearch = array();
  9. $arSqlOrder = array();
  10. $strSqlSearch = "";
  11. $strSqlOrder = "";
  12. $arFilter = (is_array($arFilter) ? $arFilter : array());
  13. $arAddParams = (is_array($arAddParams) ? $arAddParams : array($arAddParams));
  14. if (is_set($arAddParams, "nameTemplate"))
  15. $arAddParams["sNameTemplate"] = $arAddParams["nameTemplate"];
  16. if (isset($arFilter['PERSONAL_BIRTHDAY_DATE']))
  17. {
  18. $subQuery = "SELECT U.ID FROM b_user U WHERE ";
  19. $key_res = CForumNew::GetFilterOperation($arFilter['PERSONAL_BIRTHDAY_DATE']);
  20. $key = mb_strtoupper($key_res["FIELD"]);
  21. $val = $arFilter['PERSONAL_BIRTHDAY_DATE'];
  22. $strNegative = $key_res["NEGATIVE"];
  23. $strOperation = $key_res["OPERATION"];
  24. $subQuery .= ($strNegative=="Y"?" U.PERSONAL_BIRTHDAY IS NULL OR NOT ":" U.PERSONAL_BIRTHDAY IS NOT NULL AND ")."(DATE_FORMAT(U.PERSONAL_BIRTHDAY, '%m-%d') ".$strOperation." '".$DB->ForSql($val)."')";
  25. $db_sub_res = $DB->Query($subQuery, false, "File: ".__FILE__."<br>Line: ".__LINE__);
  26. $arUserID = array();
  27. if ($db_sub_res)
  28. {
  29. while($ar_sub_res = $db_sub_res->Fetch())
  30. $arUserID[] = $ar_sub_res['ID'];
  31. }
  32. if (sizeof($arUserID) > 0)
  33. {
  34. if (sizeof($arUserID) > 50)
  35. $arUserID = array_slice($arUserID, 0, 50);
  36. unset($arFilter['PERSONAL_BIRTHDAY_DATE']);
  37. $arFilter['@USER_ID'] = $arUserID;
  38. }
  39. }
  40. foreach ($arFilter as $key => $val)
  41. {
  42. $key_res = CForumNew::GetFilterOperation($key);
  43. $key = mb_strtoupper($key_res["FIELD"]);
  44. $strNegative = $key_res["NEGATIVE"];
  45. $strOperation = $key_res["OPERATION"];
  46. switch ($key)
  47. {
  48. case "USER_ID":
  49. $userID = intval($val);
  50. if (is_array($val) && $strOperation == 'IN')
  51. {
  52. $userID = array();
  53. foreach($val as $valI)
  54. $userID[] = intval($valI);
  55. $userID = array_unique($userID);
  56. if (empty($userID))
  57. $val = $userID = 0;
  58. else
  59. $userID = '(' . implode(', ', $userID). ')';
  60. }
  61. if (!is_array($val) && intval($userID)<=0)
  62. $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(U.ID IS NULL OR U.ID<=0)";
  63. else
  64. $arSqlSearch[] = ($strNegative=="Y"?" U.ID IS NULL OR NOT ":"")."(U.ID ".$strOperation." ".$userID." )";
  65. break;
  66. case "ID":
  67. case "RANK_ID":
  68. case "NUM_POSTS":
  69. case "AVATAR":
  70. if (intval($val)<=0)
  71. $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FU.".$key." IS NULL OR FU.".$key."<=0)";
  72. else
  73. $arSqlSearch[] = ($strNegative=="Y"?" FU.".$key." IS NULL OR NOT ":"")."(FU.".$key." ".$strOperation." ".intval($val)." )";
  74. break;
  75. case "SHOW_NAME":
  76. case "HIDE_FROM_ONLINE":
  77. case "SUBSC_GROUP_MESSAGE":
  78. case "SUBSC_GET_MY_MESSAGE":
  79. case "ALLOW_POST":
  80. if ($val == '')
  81. $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FU.".$key." IS NULL OR LENGTH(FU.".$key.")<=0)";
  82. else
  83. $arSqlSearch[] = ($strNegative=="Y"?" FU.".$key." IS NULL OR NOT ":"")."(FU.".$key." ".$strOperation." '".$DB->ForSql($val)."' )";
  84. break;
  85. case "ACTIVE":
  86. if ($val == '')
  87. $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(U.".$key." IS NULL OR LEN(U.".$key.")<=0)";
  88. else
  89. $arSqlSearch[] = ($strNegative=="Y"?" U.".$key." IS NULL OR NOT ":"")."(U.".$key." ".$strOperation." '".$DB->ForSql($val)."' )";
  90. break;
  91. case "PERSONAL_BIRTHDATE":
  92. if ($val == '')
  93. $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(U.PERSONAL_BIRTHDATE IS NULL)";
  94. else
  95. $arSqlSearch[] = ($strNegative=="Y"?" U.PERSONAL_BIRTHDATE IS NULL OR NOT ":"")."(U.PERSONAL_BIRTHDATE ".$strOperation." '".$DB->ForSql($val)."')";
  96. break;
  97. case "PERSONAL_BIRTHDAY":
  98. if($val == '')
  99. $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(U.PERSONAL_BIRTHDAY IS NULL)";
  100. else
  101. $arSqlSearch[] = ($strNegative=="Y"?" U.PERSONAL_BIRTHDAY IS NULL OR NOT ":"")."(U.PERSONAL_BIRTHDAY ".$strOperation." ".$DB->CharToDateFunction($DB->ForSql($val), "SHORT").")";
  102. break;
  103. case "PERSONAL_BIRTHDAY_DATE":
  104. $arSqlSearch[] = ($strNegative=="Y"?" U.PERSONAL_BIRTHDAY IS NULL OR NOT ":"")."(DATE_FORMAT(U.PERSONAL_BIRTHDAY, '%m-%d') ".$strOperation." '".$DB->ForSql($val)."')";
  105. break;
  106. case "LAST_VISIT":
  107. if($val == '')
  108. $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FU.LAST_VISIT IS NULL)";
  109. else
  110. $arSqlSearch[] = ($strNegative=="Y"?" FU.LAST_VISIT IS NULL OR NOT ":"")."(FU.LAST_VISIT ".$strOperation." ".$DB->CharToDateFunction($DB->ForSql($val), "FULL").")";
  111. break;
  112. case "SHOW_ABC":
  113. $val = trim($val);
  114. if (!empty($val) && $val != "Y")
  115. {
  116. $arSqlSearch[] =
  117. "(
  118. (
  119. FU.SHOW_NAME = 'Y'
  120. AND
  121. LENGTH(TRIM(CONCAT_WS('',".self::GetNameFieldsForQuery($arAddParams["sNameTemplate"])."))) > 0
  122. AND
  123. (REPLACE(CONCAT_WS(' ',".self::GetNameFieldsForQuery($arAddParams["sNameTemplate"])."), ' ', ' ') LIKE '%".$DB->ForSql($val)."%')
  124. )
  125. OR
  126. (
  127. (
  128. FU.SHOW_NAME != 'Y'
  129. OR
  130. FU.SHOW_NAME IS NULL
  131. OR
  132. (
  133. FU.SHOW_NAME = 'Y'
  134. AND
  135. LENGTH(TRIM(CONCAT_WS('',".self::GetNameFieldsForQuery($arAddParams["sNameTemplate"])."))) <= 0
  136. )
  137. )
  138. AND
  139. (
  140. U.LOGIN LIKE '%".$DB->ForSql($val)."%'
  141. )
  142. )
  143. )";
  144. }
  145. break;
  146. }
  147. }
  148. if (count($arSqlSearch) > 0)
  149. $strSqlSearch = " AND (".implode(") AND (", $arSqlSearch).") ";
  150. foreach ($arOrder as $by=>$order)
  151. {
  152. $by = mb_strtoupper($by);
  153. $order = mb_strtoupper($order);
  154. if ($order!="ASC") $order = "DESC";
  155. if ($by == "USER_ID") $arSqlOrder[] = " U.ID ".$order." ";
  156. elseif ($by == "SHOW_NAME") $arSqlOrder[] = " FU.SHOW_NAME ".$order." ";
  157. elseif ($by == "HIDE_FROM_ONLINE") $arSqlOrder[] = " FU.HIDE_FROM_ONLINE ".$order." ";
  158. elseif ($by == "SUBSC_GROUP_MESSAGE") $arSqlOrder[] = " FU.SUBSC_GROUP_MESSAGE ".$order." ";
  159. elseif ($by == "SUBSC_GET_MY_MESSAGE") $arSqlOrder[] = " FU.SUBSC_GET_MY_MESSAGE ".$order." ";
  160. elseif ($by == "NUM_POSTS") $arSqlOrder[] = " FU.NUM_POSTS ".$order." ";
  161. elseif ($by == "LAST_POST") $arSqlOrder[] = " FU.LAST_POST ".$order." ";
  162. elseif ($by == "POINTS") $arSqlOrder[] = " FU.POINTS ".$order." ";
  163. elseif ($by == "NAME") $arSqlOrder[] = " U.NAME ".$order." ";
  164. elseif ($by == "LAST_NAME") $arSqlOrder[] = " U.LAST_NAME ".$order." ";
  165. elseif ($by == "LOGIN") $arSqlOrder[] = " U.LOGIN ".$order." ";
  166. elseif ($by == "LAST_VISIT") $arSqlOrder[] = " FU.LAST_VISIT ".$order." ";
  167. elseif ($by == "DATE_REGISTER") $arSqlOrder[] = " U.DATE_REGISTER ".$order." ";
  168. elseif ($by == "SHOW_ABC") $arSqlOrder[] = " SHOW_ABC ".$order." ";
  169. else
  170. {
  171. $arSqlOrder[] = " FU.ID ".$order." ";
  172. $by = "ID";
  173. }
  174. }
  175. DelDuplicateSort($arSqlOrder);
  176. if (count($arSqlOrder) > 0)
  177. $strSqlOrder = " ORDER BY ".implode(", ", $arSqlOrder);
  178. $strSql =
  179. "SELECT FU.ID, U.ID as USER_ID, FU.SHOW_NAME, FU.DESCRIPTION, FU.IP_ADDRESS,
  180. FU.REAL_IP_ADDRESS, FU.AVATAR, FU.NUM_POSTS, FU.POINTS as NUM_POINTS,
  181. FU.INTERESTS, FU.SUBSC_GROUP_MESSAGE, FU.SUBSC_GET_MY_MESSAGE,
  182. FU.LAST_POST, FU.ALLOW_POST, FU.SIGNATURE, FU.RANK_ID,
  183. U.EMAIL, U.NAME, U.SECOND_NAME, U.LAST_NAME, U.LOGIN, U.PERSONAL_BIRTHDATE,
  184. ".$DB->DateToCharFunction("FU.DATE_REG", "SHORT")." as DATE_REG,
  185. ".$DB->DateToCharFunction("FU.LAST_VISIT", "FULL")." as LAST_VISIT,
  186. ".$DB->DateToCharFunction("FU.LAST_VISIT", "SHORT")." as LAST_VISIT_SHORT,
  187. ".$DB->DateToCharFunction("U.DATE_REGISTER", "SHORT")." as DATE_REGISTER_SHORT,
  188. U.PERSONAL_ICQ, U.PERSONAL_WWW, U.PERSONAL_PROFESSION, U.DATE_REGISTER,
  189. U.PERSONAL_CITY, U.PERSONAL_COUNTRY, U.EXTERNAL_AUTH_ID, U.PERSONAL_PHOTO,
  190. U.PERSONAL_GENDER, FU.POINTS, FU.HIDE_FROM_ONLINE,
  191. ".$DB->DateToCharFunction("U.PERSONAL_BIRTHDAY", "SHORT")." as PERSONAL_BIRTHDAY ".
  192. (array_key_exists("SHOW_ABC", $arFilter) || array_key_exists("sNameTemplate", $arAddParams) ?
  193. ", \n".self::GetFormattedNameFieldsForSelect(
  194. array_merge(
  195. $arAddParams,
  196. array(
  197. "sUserTablePrefix" => "U.",
  198. "sForumUserTablePrefix" => "FU.",
  199. "sFieldName" => "SHOW_ABC")
  200. ),
  201. false
  202. )
  203. :
  204. ""
  205. ).
  206. ((isset($arFilter['USER_ID']) || isset($arFilter['@USER_ID'])) ?
  207. " FROM b_user U LEFT JOIN b_forum_user FU ON (FU.USER_ID = U.ID)"
  208. :
  209. " FROM b_forum_user FU LEFT JOIN b_user U ON (FU.USER_ID = U.ID)"
  210. ).
  211. " WHERE 1 = 1 ".$strSqlSearch." \n".
  212. $strSqlOrder;
  213. if (is_array($arAddParams) && (intval($arAddParams["nTopCount"])>0))
  214. $strSql .= " LIMIT 0,".intval($arAddParams["nTopCount"]);
  215. if (is_array($arAddParams) && is_set($arAddParams, "bDescPageNumbering") && (intval($arAddParams["nTopCount"])<=0))
  216. {
  217. $iCnt = 0;
  218. $strSqlCount =
  219. "SELECT COUNT('x') as CNT ".
  220. ((isset($arFilter['USER_ID']) || isset($arFilter['@USER_ID'])) ?
  221. " FROM b_user U LEFT JOIN b_forum_user FU ON (FU.USER_ID = U.ID)"
  222. :
  223. " FROM b_forum_user FU LEFT JOIN b_user U ON (FU.USER_ID = U.ID)"
  224. ).
  225. " WHERE 1 = 1 ".$strSqlSearch;
  226. $db_res = $DB->Query($strSqlCount, false, "File: ".__FILE__."<br>Line: ".__LINE__);
  227. if ($db_res && ($res = $db_res->Fetch()))
  228. $iCnt = $res["CNT"];
  229. $db_res = new CDBResult();
  230. $db_res->NavQuery($strSql, $iCnt, $arAddParams);
  231. }
  232. else
  233. {
  234. $db_res = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__);
  235. }
  236. return $db_res;
  237. }
  238. public static function GetListEx($arOrder = Array("ID"=>"ASC"), $arFilter = Array())
  239. {
  240. global $DB;
  241. $arSqlSearch = array();
  242. $arSqlSelect = array();
  243. $arSqlFrom = array();
  244. $arSqlGroup = array();
  245. $arSqlOrder = array();
  246. $arSql = array();
  247. $strSqlSearch = "";
  248. $strSqlSelect = "";
  249. $strSqlFrom = "";
  250. $strSqlGroup = "";
  251. $strSqlOrder = "";
  252. $strSql = "";
  253. $tmp = array();
  254. $arFilter = (is_array($arFilter) ? $arFilter : array());
  255. $arMainUserFields = array("LOGIN"=>"S", "NAME"=>"S", "LAST_NAME"=>"S", "SECOND_NAME"=>"S",
  256. "PERSONAL_PROFESSION"=>"S", "PERSONAL_WWW"=>"S", "PERSONAL_ICQ"=>"S", "PERSONAL_GENDER"=>"E",
  257. "PERSONAL_PHONE"=>"S", "PERSONAL_FAX"=>"S", "PERSONAL_MOBILE"=>"S", "PERSONAL_PAGER"=>"S",
  258. "PERSONAL_STREET"=>"S", "PERSONAL_MAILBOX"=>"S", "PERSONAL_CITY"=>"S", "PERSONAL_STATE"=>"S",
  259. "PERSONAL_ZIP"=>"S", "PERSONAL_COUNTRY"=>"I", "EXTERNAL_AUTH_ID"=>"S", "PERSONAL_NOTES"=>"S", "WORK_COMPANY"=>"S",
  260. "WORK_DEPARTMENT"=>"S", "WORK_POSITION"=>"S", "WORK_WWW"=>"S", "WORK_PHONE"=>"S", "WORK_FAX"=>"S",
  261. "WORK_PAGER"=>"S", "WORK_STREET"=>"S", "WORK_MAILBOX"=>"S", "WORK_CITY"=>"S", "WORK_STATE"=>"S",
  262. "WORK_ZIP"=>"S", "WORK_COUNTRY"=>"I", "WORK_PROFILE"=>"S", "WORK_NOTES"=>"S");
  263. $arSqlSelectConst = array(
  264. "FU.ID" => "FU.ID",
  265. "USER_ID" => "U.ID",
  266. "FU.SHOW_NAME" => "FU.SHOW_NAME",
  267. "FU.DESCRIPTION" => "FU.DESCRIPTION",
  268. "FU.IP_ADDRESS" => "FU.IP_ADDRESS",
  269. "FU.REAL_IP_ADDRESS" => "FU.REAL_IP_ADDRESS",
  270. "FU.AVATAR" => "FU.AVATAR",
  271. "FU.NUM_POSTS" => "FU.NUM_POSTS",
  272. "NUM_POINTS" => "FU.POINTS",
  273. "FU.INTERESTS" => "FU.INTERESTS",
  274. "FU.SUBSC_GROUP_MESSAGE" => "FU.SUBSC_GROUP_MESSAGE",
  275. "FU.SUBSC_GET_MY_MESSAGE" => "FU.SUBSC_GET_MY_MESSAGE",
  276. "FU.LAST_POST" => "FU.LAST_POST",
  277. "FU.ALLOW_POST" => "FU.ALLOW_POST",
  278. "FU.SIGNATURE" => "FU.SIGNATURE",
  279. "FU.RANK_ID" => "FU.RANK_ID",
  280. "FU.POINTS" => "FU.POINTS",
  281. "FU.HIDE_FROM_ONLINE" => "FU.HIDE_FROM_ONLINE",
  282. "U.DATE_REGISTER" => "U.DATE_REGISTER",
  283. "U.EMAIL" => "U.EMAIL",
  284. "U.NAME" => "U.NAME",
  285. "U.SECOND_NAME" => "U.SECOND_NAME",
  286. "U.LAST_NAME" => "U.LAST_NAME",
  287. "U.LOGIN" => "U.LOGIN",
  288. "U.PERSONAL_BIRTHDATE" => "U.PERSONAL_BIRTHDATE",
  289. "U.PERSONAL_ICQ" => "U.PERSONAL_ICQ",
  290. "U.PERSONAL_WWW" => "U.PERSONAL_WWW",
  291. "U.PERSONAL_PROFESSION" => "U.PERSONAL_PROFESSION",
  292. "U.PERSONAL_CITY" => "U.PERSONAL_CITY",
  293. "U.PERSONAL_COUNTRY" => "U.PERSONAL_COUNTRY",
  294. "U.EXTERNAL_AUTH_ID" => "U.EXTERNAL_AUTH_ID",
  295. "U.PERSONAL_PHOTO" => "U.PERSONAL_PHOTO",
  296. "U.PERSONAL_GENDER" => "U.PERSONAL_GENDER",
  297. "DATE_REG" => $DB->DateToCharFunction("FU.DATE_REG", "SHORT"),
  298. "LAST_VISIT" => $DB->DateToCharFunction("FU.LAST_VISIT", "FULL"),
  299. "PERSONAL_BIRTHDAY" => $DB->DateToCharFunction("U.PERSONAL_BIRTHDAY", "SHORT"),
  300. "U.WORK_POSITION" => "U.WORK_POSITION",
  301. "U.WORK_COMPANY" => "U.WORK_COMPANY"
  302. );
  303. foreach ($arFilter as $key => $val)
  304. {
  305. $key_res = CForumNew::GetFilterOperation($key);
  306. $key = mb_strtoupper($key_res["FIELD"]);
  307. $strNegative = $key_res["NEGATIVE"];
  308. $strOperation = $key_res["OPERATION"];
  309. switch ($key)
  310. {
  311. case "USER_ID":
  312. if (intval($val)<=0)
  313. $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(U.ID IS NULL OR U.ID<=0)";
  314. else
  315. $arSqlSearch[] = ($strNegative=="Y"?" U.ID IS NULL OR NOT ":"")."(U.ID ".$strOperation." ".intval($val)." )";
  316. break;
  317. case "ID":
  318. case "RANK_ID":
  319. case "NUM_POSTS":
  320. if (intval($val)<=0)
  321. $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FU.".$key." IS NULL OR FU.".$key."<=0)";
  322. else
  323. $arSqlSearch[] = ($strNegative=="Y"?" FU.".$key." IS NULL OR NOT ":"")."(FU.".$key." ".$strOperation." ".intval($val)." )";
  324. break;
  325. case "SHOW_NAME":
  326. case "HIDE_FROM_ONLINE":
  327. case "SUBSC_GROUP_MESSAGE":
  328. case "SUBSC_GET_MY_MESSAGE":
  329. case "ALLOW_POST":
  330. if ($val == '')
  331. $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FU.".$key." IS NULL OR LENGTH(FU.".$key.")<=0)";
  332. else
  333. $arSqlSearch[] = ($strNegative=="Y"?" FU.".$key." IS NULL OR NOT ":"")."(FU.".$key." ".$strOperation." '".$DB->ForSql($val)."' )";
  334. break;
  335. case "ACTIVE":
  336. if ($val == '')
  337. $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(U.".$key." IS NULL OR LEN(U.".$key.")<=0)";
  338. else
  339. $arSqlSearch[] = ($strNegative=="Y"?" U.".$key." IS NULL OR NOT ":"")."(U.".$key." ".$strOperation." '".$DB->ForSql($val)."' )";
  340. break;
  341. case "PERSONAL_BIRTHDATE":
  342. if ($val == '')
  343. $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(U.PERSONAL_BIRTHDATE IS NULL)";
  344. else
  345. $arSqlSearch[] = ($strNegative=="Y"?" U.PERSONAL_BIRTHDATE IS NULL OR NOT ":"")."(U.PERSONAL_BIRTHDATE ".$strOperation." '".$DB->ForSql($val)."')";
  346. break;
  347. case "PERSONAL_BIRTHDAY":
  348. if($val == '')
  349. $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(U.PERSONAL_BIRTHDAY IS NULL)";
  350. else
  351. $arSqlSearch[] = ($strNegative=="Y"?" U.PERSONAL_BIRTHDAY IS NULL OR NOT ":"")."(U.PERSONAL_BIRTHDAY ".$strOperation." ".$DB->CharToDateFunction($DB->ForSql($val), "SHORT").")";
  352. break;
  353. case "PERSONAL_BIRTHDAY_DATE":
  354. $arSqlSearch[] = ($strNegative=="Y"?" U.PERSONAL_BIRTHDAY IS NULL OR NOT ":"")."(DATE_FORMAT(U.PERSONAL_BIRTHDAY, '%m-%d') ".$strOperation." '".$DB->ForSql($val)."')";
  355. break;
  356. case "LAST_VISIT":
  357. if($val == '')
  358. $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FU.LAST_VISIT IS NULL)";
  359. else
  360. $arSqlSearch[] = ($strNegative=="Y"?" FU.LAST_VISIT IS NULL OR NOT ":"")."(FU.LAST_VISIT ".$strOperation." ".$DB->CharToDateFunction($DB->ForSql($val), "SHORT").")";
  361. break;
  362. case "LOGIN":
  363. case "EMAIL":
  364. $arSqlSearch[] = GetFilterQuery("U.".$key, $val);
  365. break;
  366. case "NAME":
  367. $arSqlSearch[] = GetFilterQuery("U.NAME, U.LAST_NAME, U.SECOND_NAME", $val);
  368. break;
  369. case"SUBSC_NEW_TOPIC_ONLY":
  370. $key = "NEW_TOPIC_ONLY";
  371. $arSqlFrom["FS"] = "INNER JOIN b_forum_subscribe FS ON (FU.USER_ID = FS.USER_ID)";
  372. if ($val == '')
  373. $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FS.".$key." IS NULL OR LENGTH(FS.".$key.")<=0)";
  374. else
  375. $arSqlSearch[] = ($strNegative=="Y"?" FS.".$key." IS NULL OR NOT ":"")."(FS.".$key." ".$strOperation." '".$DB->ForSql($val)."' )";
  376. break;
  377. case "SUBSC_START_DATE":
  378. $key = "START_DATE";
  379. $arSqlFrom["FS"] = "INNER JOIN b_forum_subscribe FS ON (FU.USER_ID = FS.USER_ID)";
  380. if($val == '')
  381. $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FS.".$key." IS NULL)";
  382. else
  383. $arSqlSearch[] = ($strNegative=="Y"?" FS.".$key." IS NULL OR NOT ":"")."(FS.".$key." ".$strOperation." ".$DB->CharToDateFunction($DB->ForSql($val), "SHORT").")";
  384. break;
  385. case "SUBSC_FORUM_ID":
  386. case "SUBSC_TOPIC_ID":
  387. case "SUBSC":
  388. $arSqlFrom["FS"] = "INNER JOIN b_forum_subscribe FS ON (FU.USER_ID = FS.USER_ID)";
  389. unset($arSqlSelectConst["FU.INTERESTS"]);
  390. $arSqlSelect = $arSqlSelectConst;
  391. $arSqlSelect["SUBSC_COUNT"] = "COUNT(FS.ID)";
  392. $arSqlSelect["SUBSC_START_DATE"] = $DB->DateToCharFunction("MIN(FS.START_DATE)", "FULL");
  393. $arSqlGroup = array_merge($arSqlSelectConst, $arSqlGroup);
  394. if ($key != "SUBSC")
  395. {
  396. $key = mb_substr($key, mb_strlen("SUBSC_"));
  397. if (intval($val)<=0)
  398. $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FS.".$key." IS NULL OR FS.".$key."<=0)";
  399. else
  400. $arSqlSearch[] = ($strNegative=="Y"?" FS.".$key." IS NULL OR NOT ":"")."(FS.".$key." ".$strOperation." ".intval($val)." )";
  401. }
  402. break;
  403. default:
  404. if (mb_substr($key, 0, mb_strlen("USER_")) == "USER_")
  405. {
  406. $strUserKey = mb_substr($key, mb_strlen("USER_"));
  407. if (array_key_exists($strUserKey, $arMainUserFields))
  408. {
  409. if ($arMainUserFields[$strUserKey]=="I")
  410. $arSqlSearch[] = ($strNegative=="Y"?" U.".$strUserKey." IS NULL OR NOT ":"")."(U.".$strUserKey." ".$strOperation." ".intval($val)." )";
  411. elseif ($arMainUserFields[$strUserKey]=="E")
  412. $arSqlSearch[] = ($strNegative=="Y"?" U.".$strUserKey." IS NULL OR NOT ":"")."(U.".$strUserKey." ".$strOperation." '".$DB->ForSql($val)."' )";
  413. else
  414. $arSqlSearch[] = GetFilterQuery("U.".$strUserKey, $val);
  415. }
  416. }
  417. }
  418. }
  419. if (count($arSqlSearch) > 0)
  420. $strSqlSearch = " AND (".implode(") AND (", $arSqlSearch).") ";
  421. if (count($arSqlSelect) <= 0)
  422. $arSqlSelect = $arSqlSelectConst;
  423. foreach ($arSqlSelect as $key => $val)
  424. {
  425. if ($val != $key)
  426. $tmp[] = $val." AS ".$key;
  427. else
  428. $tmp[] = $val;
  429. }
  430. $strSqlSelect = implode(", ", $tmp);
  431. if (count($arSqlFrom) > 0)
  432. $strSqlFrom = implode(" ", $arSqlFrom);
  433. if (count($arSqlGroup) > 0)
  434. $strSqlGroup = " GROUP BY ".implode(", ", $arSqlGroup);
  435. foreach ($arOrder as $by=>$order)
  436. {
  437. $by = mb_strtoupper($by);
  438. $order = mb_strtoupper($order);
  439. if ($order!="ASC")
  440. $order = "DESC";
  441. if ($by == "USER_ID") $arSqlOrder[] = " U.ID ".$order." ";
  442. elseif ($by == "SHOW_NAME") $arSqlOrder[] = " FU.SHOW_NAME ".$order." ";
  443. elseif ($by == "HIDE_FROM_ONLINE") $arSqlOrder[] = " FU.HIDE_FROM_ONLINE ".$order." ";
  444. elseif ($by == "SUBSC_GROUP_MESSAGE") $arSqlOrder[] = " FU.SUBSC_GROUP_MESSAGE ".$order." ";
  445. elseif ($by == "SUBSC_GET_MY_MESSAGE") $arSqlOrder[] = " FU.SUBSC_GET_MY_MESSAGE ".$order." ";
  446. elseif ($by == "NUM_POSTS") $arSqlOrder[] = " FU.NUM_POSTS ".$order." ";
  447. elseif ($by == "LAST_POST") $arSqlOrder[] = " FU.LAST_POST ".$order." ";
  448. elseif ($by == "POINTS") $arSqlOrder[] = " FU.POINTS ".$order." ";
  449. elseif ($by == "NAME") $arSqlOrder[] = " U.NAME ".$order." ";
  450. elseif ($by == "LAST_NAME") $arSqlOrder[] = " U.LAST_NAME ".$order." ";
  451. elseif ($by == "EMAIL") $arSqlOrder[] = " U.EMAIL ".$order." ";
  452. elseif ($by == "LOGIN") $arSqlOrder[] = " U.LOGIN ".$order." ";
  453. elseif ($by == "LAST_VISIT") $arSqlOrder[] = " FU.LAST_VISIT ".$order." ";
  454. elseif ($by == "DATE_REGISTER") $arSqlOrder[] = " U.DATE_REGISTER ".$order." ";
  455. elseif ($by == "ID") $arSqlOrder[] = " FU.ID ".$order." ";
  456. elseif (($by == "SUBSC_COUNT") && array_key_exists("FS", $arSqlFrom)) $arSqlOrder[] = " SUBSC_COUNT ".$order." ";
  457. elseif (($by == "SUBSC_START_DATE") && array_key_exists("FS", $arSqlFrom)) $arSqlOrder[] = " FS.START_DATE ".$order." ";
  458. elseif (mb_substr($by, 0, mb_strlen("USER_")) == "USER_")
  459. {
  460. $strUserBy = mb_substr($by, mb_strlen("USER_"));
  461. if (array_key_exists($strUserBy, $arMainUserFields))
  462. {
  463. $arSqlOrder[] = " U.".$strUserBy." ".$order." ";
  464. }
  465. }
  466. else
  467. {
  468. $arSqlOrder[] = " FU.ID ".$order." ";
  469. $by = "ID";
  470. }
  471. }
  472. DelDuplicateSort($arSqlOrder);
  473. if (count($arSqlOrder) > 0)
  474. $strSqlOrder = " ORDER BY ".implode(", ", $arSqlOrder);
  475. $strSql = "SELECT ".$strSqlSelect."
  476. FROM b_forum_user FU
  477. INNER JOIN b_user U ON (FU.USER_ID = U.ID)
  478. ".$strSqlFrom."
  479. WHERE 1 = 1
  480. ".$strSqlSearch."
  481. ".$strSqlGroup."
  482. ".$strSqlOrder;
  483. $db_res = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__);
  484. return $db_res;
  485. }
  486. public static function SearchUser($template, $arAddParams = array())
  487. {
  488. global $DB;
  489. $template = $DB->ForSql(str_replace("*", "%", $template));
  490. $arAddParams = (is_array($arAddParams) ? $arAddParams : array($arAddParams));
  491. $arAddParams["sNameTemplate"] = (is_set($arAddParams, "nameTemplate") ? $arAddParams["nameTemplate"] : $arAddParams["sNameTemplate"]);
  492. $strSqlSearch =
  493. "(
  494. F.SHOW_NAME = 'Y' AND LENGTH(U.NAME) > 0 AND U.NAME LIKE '".$template."'
  495. )
  496. OR
  497. (
  498. F.SHOW_NAME = 'Y' AND LENGTH(U.NAME) <= 0
  499. AND
  500. LENGTH(U.LAST_NAME) > 0 AND U.LAST_NAME LIKE '".$template."'
  501. )
  502. OR
  503. (
  504. (
  505. F.SHOW_NAME = 'N' OR F.SHOW_NAME = '' OR (F.SHOW_NAME IS NULL)
  506. OR
  507. (
  508. F.SHOW_NAME = 'Y'
  509. AND
  510. LENGTH(TRIM(CONCAT_WS('',".self::GetNameFieldsForQuery($arAddParams["sNameTemplate"]).")))<=0
  511. )
  512. )
  513. AND
  514. U.LOGIN LIKE '".$template."'
  515. )";
  516. if (mb_substr($template, 0, 1) == '%')
  517. $strSqlSearch =
  518. "(
  519. (
  520. F.SHOW_NAME = 'Y'
  521. AND
  522. LENGTH(TRIM(CONCAT_WS('',U.NAME,U.LAST_NAME))) > 0
  523. AND
  524. REPLACE(CONCAT_WS(' ',".self::GetNameFieldsForQuery($arAddParams["sNameTemplate"])."), ' ', ' ') LIKE '".$template."'
  525. )
  526. OR
  527. (
  528. (
  529. F.SHOW_NAME = 'N' OR F.SHOW_NAME = '' OR (F.SHOW_NAME IS NULL)
  530. OR
  531. (
  532. F.SHOW_NAME = 'Y'
  533. AND
  534. LENGTH(TRIM(CONCAT_WS('',".self::GetNameFieldsForQuery($arAddParams["sNameTemplate"])."))) <= 0
  535. )
  536. )
  537. AND
  538. U.LOGIN LIKE '".$template."'
  539. )
  540. )";
  541. $iCnt = 0;
  542. if ($arAddParams["bCount"] || is_set($arAddParams, "bDescPageNumbering"))
  543. {
  544. $strSql = "SELECT COUNT(U.ID) AS CNT FROM b_user U LEFT JOIN b_forum_user F ON (F.USER_ID = U.ID) WHERE ".$strSqlSearch;
  545. $db_res = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__);
  546. $iCnt = ($db_res && ($res = $db_res->Fetch()) ? intval($res["CNT"]) : 0);
  547. if ($arAddParams["bCount"])
  548. return $iCnt;
  549. }
  550. $strSql =
  551. "SELECT U.ID, U.NAME, U.SECOND_NAME, U.LAST_NAME, U.LOGIN, F.SHOW_NAME,
  552. CASE
  553. WHEN (F.SHOW_NAME = 'Y' AND LENGTH(TRIM(CONCAT_WS('',".self::GetNameFieldsForQuery($arAddParams["sNameTemplate"])."))) > 0)
  554. THEN TRIM(REPLACE(CONCAT_WS(' ',".self::GetNameFieldsForQuery($arAddParams["sNameTemplate"])."), ' ', ' '))
  555. ELSE U.LOGIN
  556. END AS SHOW_ABC
  557. FROM b_user U
  558. LEFT JOIN b_forum_user F ON (F.USER_ID = U.ID)
  559. WHERE ".$strSqlSearch."\n"."ORDER BY SHOW_ABC";
  560. if (is_set($arAddParams, "bDescPageNumbering")) {
  561. $db_res = new CDBResult();
  562. $db_res->NavQuery($strSql, $iCnt, $arAddParams);
  563. } else {
  564. if ($arAddParams["nTopCount"] > 0)
  565. $strSql .= " LIMIT 0,".$arAddParams["nTopCount"];
  566. $db_res = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__);
  567. }
  568. return $db_res;
  569. }
  570. /**
  571. * Converts name template fields from Bitrix name template to SQL query fields
  572. *
  573. * @param string $sNameTemplate Bitrix name template (ex: #LAST_NAME# #NAME#). Uses site name template if empty @see CSite::GetNameTemplates
  574. * @return string (ex: U.LAST_NAME, U.NAME)
  575. */
  576. public static function GetNameFieldsForQuery($sNameTemplate, $userTablePrefix = "U.")
  577. {
  578. global $DB;
  579. $sNameTemplate = (empty($sNameTemplate) ? CSite::GetDefaultNameFormat() : $sNameTemplate);
  580. if (!preg_match("/(#NAME#)|(#LAST_NAME#\,)|(#LAST_NAME#)|(#SECOND_NAME#)|(#NAME_SHORT#)|(#SECOND_NAME_SHORT#)/".BX_UTF_PCRE_MODIFIER, $sNameTemplate, $matches))
  581. $sNameTemplate = CSite::GetDefaultNameFormat();
  582. if (mb_strpos($sNameTemplate, "#NOBR#") !== false)
  583. $sNameTemplate = preg_replace("/\#NOBR\#(.+?)\#\/NOBR\#/".BX_UTF_PCRE_MODIFIER, "\\1", $sNameTemplate);
  584. preg_match_all("/(#NAME#)|(#LAST_NAME#\,)|(#LAST_NAME#)|(#SECOND_NAME#)|(#NAME_SHORT#)|(#SECOND_NAME_SHORT#)/".BX_UTF_PCRE_MODIFIER, $sNameTemplate, $matches);
  585. $tmp = array();
  586. foreach($matches[0] as $val) {
  587. $pos = mb_strpos($sNameTemplate, $val);
  588. if ($pos > 0) {
  589. $tmp[] = "'".$DB->ForSql(mb_substr($sNameTemplate, 0, $pos))."'";
  590. }
  591. $tmp[] = str_replace(
  592. array(
  593. "#NAME#",
  594. "#LAST_NAME#,",
  595. "#LAST_NAME#",
  596. "#SECOND_NAME#",
  597. "#NAME_SHORT#",
  598. "#SECOND_NAME_SHORT#"
  599. ),
  600. array(
  601. $userTablePrefix."NAME",
  602. "IF (LENGTH(TRIM(".$userTablePrefix."LAST_NAME)) <= 0, '', CONCAT(".$userTablePrefix."LAST_NAME, ','))",
  603. $userTablePrefix."LAST_NAME",
  604. $userTablePrefix."SECOND_NAME",
  605. "IF (LENGTH(TRIM(".$userTablePrefix."NAME)) <= 0,'',CONCAT(SUBSTRING(".$userTablePrefix."NAME,1,1),'.'))",
  606. "IF (LENGTH(TRIM(".$userTablePrefix."SECOND_NAME)) <= 0,'',CONCAT(SUBSTRING(".$userTablePrefix."SECOND_NAME,1,1),'.'))"
  607. ),
  608. $val
  609. );
  610. $sNameTemplate = mb_substr($sNameTemplate, ($pos + mb_strlen($val)));
  611. }
  612. if (!empty($sNameTemplate))
  613. $tmp[] = "'".$DB->ForSql($sNameTemplate)."'";
  614. $res = implode(",", $tmp);
  615. return (!empty($res) ? $res : "''");
  616. }
  617. public static function GetFormattedNameFieldsForSelect($arParams = array(), $bReturnAll = true)
  618. {
  619. $arParams = (is_array($arParams) ? $arParams : array($arParams));
  620. $arParams["sNameTemplate"] = trim($arParams["sNameTemplate"]);
  621. $arParams["sUserTablePrefix"] = rtrim((!empty($arParams["sUserTablePrefix"]) ? $arParams["sUserTablePrefix"] : "U"), ".").".";
  622. $arParams["sForumUserTablePrefix"] = rtrim((!empty($arParams["sForumUserTablePrefix"]) ? $arParams["sForumUserTablePrefix"] : "FU"), ".").".";
  623. $arParams["sFieldName"] = (!empty($arParams["sFieldName"]) ? $arParams["sFieldName"] : "AUTHOR_NAME_FRMT");
  624. $arParams["sUserIDFieldName"] = (!empty($arParams["sUserIDFieldName"]) ? $arParams["sUserIDFieldName"] : "F.LAST_POSTER_ID");
  625. $res = array(
  626. "select" =>
  627. "CASE ".
  628. " WHEN (".
  629. $arParams["sForumUserTablePrefix"]."USER_ID > 0 ".
  630. " AND ".
  631. $arParams["sForumUserTablePrefix"]."SHOW_NAME = 'Y' ".
  632. " AND ".
  633. "LENGTH(TRIM(CONCAT_WS('',".
  634. CForumUser::GetNameFieldsForQuery(
  635. $arParams["sNameTemplate"],
  636. $arParams["sUserTablePrefix"])."))) > 0".
  637. ") ".
  638. " THEN TRIM(REPLACE(CONCAT_WS(' ',".
  639. CForumUser::GetNameFieldsForQuery(
  640. $arParams["sNameTemplate"],
  641. $arParams["sUserTablePrefix"])."), ' ', ' '))".
  642. " ELSE ".$arParams["sUserTablePrefix"]."LOGIN ".
  643. " END AS ".$arParams["sFieldName"],
  644. "join" =>
  645. "LEFT JOIN b_forum_user ".rtrim($arParams["sForumUserTablePrefix"], ".").
  646. " ON (".$arParams["sUserIDFieldName"]."=".$arParams["sForumUserTablePrefix"]."USER_ID) ".
  647. "LEFT JOIN b_user ".rtrim($arParams["sUserTablePrefix"], ".").
  648. " ON (".$arParams["sUserIDFieldName"]."=".$arParams["sUserTablePrefix"]."ID) "
  649. );
  650. if ($bReturnAll)
  651. return $res;
  652. return $res["select"];
  653. }
  654. }
  655. class CForumSubscribe extends CAllForumSubscribe
  656. {
  657. }
  658. class CForumRank extends CAllForumRank
  659. {
  660. // Tekuwie statusy posetitelej srazu ne pereschityvayutsya. Tol'ko postepenno v processe raboty.
  661. public static function Add($arFields)
  662. {
  663. global $DB;
  664. if (!CForumRank::CheckFields("ADD", $arFields))
  665. return false;
  666. $arInsert = $DB->PrepareInsert("b_forum_rank", $arFields);
  667. $strSql = "INSERT INTO b_forum_rank(".$arInsert[0].") VALUES(".$arInsert[1].")";
  668. $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__);
  669. $ID = intval($DB->LastID());
  670. foreach ($arFields["LANG"] as $i => $val)
  671. {
  672. $arInsert = $DB->PrepareInsert("b_forum_rank_lang", $arFields["LANG"][$i]);
  673. $strSql = "INSERT INTO b_forum_rank_lang(RANK_ID, ".$arInsert[0].") VALUES(".$ID.", ".$arInsert[1].")";
  674. $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__);
  675. }
  676. return $ID;
  677. }
  678. }
  679. class CForumStat extends CALLForumStat
  680. {
  681. public static function GetListEx($arOrder = Array("ID"=>"ASC"), $arFilter = Array(), $arAddParams = array())
  682. {
  683. global $DB;
  684. $arSqlSearch = array();
  685. $arSqlFrom = array();
  686. $arSqlOrder = array();
  687. $strSqlSearch = "";
  688. $strSqlFrom = "";
  689. $strSqlOrder = "";
  690. $arFilter = (is_array($arFilter) ? $arFilter : array());
  691. foreach ($arFilter as $key => $val)
  692. {
  693. $key_res = CForumNew::GetFilterOperation($key);
  694. $key = mb_strtoupper($key_res["FIELD"]);
  695. $strNegative = $key_res["NEGATIVE"];
  696. $strOperation = $key_res["OPERATION"];
  697. switch ($key)
  698. {
  699. case "TOPIC_ID":
  700. case "FORUM_ID":
  701. if (intval($val)<=0)
  702. $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FSTAT.".$key." IS NULL OR FSTAT.".$key."<=0)";
  703. else
  704. $arSqlSearch[] = ($strNegative=="Y"?" FSTAT.".$key." IS NULL OR NOT ":"")."(FSTAT.".$key." ".$strOperation." ".intval($val).")";
  705. break;
  706. case "SITE_ID":
  707. $bOrNull = false;
  708. if (is_array($val)):
  709. $res = array();
  710. foreach ($val as $v):
  711. $v = trim($v);
  712. if ($v == "NULL")
  713. $bOrNull = true;
  714. elseif (!empty($v))
  715. $res[] = "'".$DB->ForSql($v)."'";
  716. endforeach;
  717. $val = (!empty($res) ? implode(", ", $res) : "");
  718. $strOperation = (!empty($res) ? "IN" : $strOperation);
  719. else:
  720. $val = "'".$DB->ForSql($val)."'";
  721. endif;
  722. if ($val == '')
  723. $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FSTAT.".$key." IS NULL OR LENGTH(FSTAT.".$key.")<=0)";
  724. elseif ($strOperation == "IN")
  725. $arSqlSearch[] = ($strNegative=="Y"?" FSTAT.".$key." IS NULL OR NOT ":"")."(FSTAT.".$key." IN (".$val.")".(
  726. $bOrNull ? " OR (FSTAT.".$key." IS NULL OR LENGTH(FSTAT.".$key.")<=0)" : "").")";
  727. else
  728. $arSqlSearch[] = ($strNegative=="Y"?" FSTAT.".$key." IS NULL OR NOT ":"")."(FSTAT.".$key." ".$strOperation." ".$val.")";
  729. break;
  730. case "LAST_VISIT":
  731. if($val == '')
  732. $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FSTAT.".$key." IS NULL)";
  733. else
  734. $arSqlSearch[] = ($strNegative=="Y"?" FSTAT.".$key." IS NULL OR NOT ":"")."(FSTAT.".$key." ".$strOperation." ".$DB->CharToDateFunction($DB->ForSql($val), "FULL").")";
  735. break;
  736. case "PERIOD":
  737. if($val == '')
  738. $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FSTAT.LAST_VISIT IS NULL)";
  739. else
  740. $arSqlSearch[] = ($strNegative=="Y"?" FSTAT.LAST_VISIT IS NULL OR NOT ":"").
  741. "(FROM_UNIXTIME(UNIX_TIMESTAMP(CURRENT_TIMESTAMP) - ".intval($val).") ".$strOperation." FSTAT.LAST_VISIT)";
  742. break;
  743. case "HIDE_FROM_ONLINE":
  744. $arSqlFrom["FU"] = "LEFT JOIN b_forum_user FU ON (FSTAT.USER_ID=FU.USER_ID)";
  745. if ($val == '')
  746. $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FU.".$key." IS NULL OR LENGTH(FU.".$key.")<=0)";
  747. else
  748. $arSqlSearch[] = ($strNegative=="Y"?" FU.".$key." IS NULL OR NOT ":"")."(((FU.".$key." ".$strOperation." '".$DB->ForSql($val)."' ) AND (FSTAT.USER_ID > 0)) OR (FSTAT.USER_ID <= 0))";
  749. break;
  750. break;
  751. case "ACTIVE":
  752. $arSqlFrom["U"] = "LEFT JOIN b_user U ON (FSTAT.USER_ID=U.ID)";
  753. $arSqlSearch[] = ($strNegative=="Y"?" U.".$key." IS NULL OR NOT ":"")."(FSTAT.USER_ID = 0 OR U.ACTIVE = 'Y')";
  754. break;
  755. }
  756. }
  757. if (!empty($arSqlSearch))
  758. $strSqlSearch = " AND ".implode(" AND ", $arSqlSearch)." ";
  759. if (!empty($arSqlFrom))
  760. $strSqlFrom = implode("\n", $arSqlFrom);
  761. foreach ($arOrder as $by=>$order)
  762. {
  763. $by = mb_strtoupper($by);
  764. $order = mb_strtoupper($order);
  765. $order = $order!="ASC" ? $order = "DESC" : "ASC";
  766. if ($by == "USER_ID") $arSqlOrder[] = " FSTAT.USER_ID ".$order." ";
  767. }
  768. DelDuplicateSort($arSqlOrder);
  769. if (count($arSqlOrder) > 0)
  770. $strSqlOrder = " ORDER BY ".implode(", ", $arSqlOrder);
  771. $strSql =
  772. "SELECT FSTAT.USER_ID, FSTAT.IP_ADDRESS, FSTAT.PHPSESSID, \n".
  773. " ".$DB->DateToCharFunction("FSTAT.LAST_VISIT", "FULL")." AS LAST_VISIT, \n".
  774. " FSTAT.FORUM_ID, FSTAT.TOPIC_ID \n".
  775. "FROM b_forum_stat FSTAT ".$strSqlFrom. "\n".
  776. "WHERE 1=1 ".$strSqlSearch."\n".
  777. $strSqlOrder;
  778. if (is_set($arFilter, "COUNT_GUEST"))
  779. {
  780. $strSql =
  781. "SELECT FST.*, FU.*, FSTAT.IP_ADDRESS, FSTAT.PHPSESSID, \n".
  782. " ".$DB->DateToCharFunction("FSTAT.LAST_VISIT", "FULL")." AS LAST_VISIT, \n".
  783. " FSTAT.FORUM_ID, FSTAT.TOPIC_ID, \n".
  784. " U.LOGIN, U.NAME, U.SECOND_NAME, U.LAST_NAME, \n".
  785. " ".
  786. (!empty($arAddParams["sNameTemplate"]) ?
  787. CForumUser::GetFormattedNameFieldsForSelect(
  788. array_merge(
  789. $arAddParams,
  790. array(
  791. "sUserTablePrefix" => "U.",
  792. "sForumUserTablePrefix" => "FU.",
  793. "sFieldName" => "SHOW_NAME")
  794. ),
  795. false
  796. ) :
  797. "FSTAT.SHOW_NAME"
  798. )."\n ".
  799. " FROM ( ".
  800. " SELECT FSTAT.USER_ID, MAX(FSTAT.ID) FST_ID, COUNT(FSTAT.PHPSESSID) COUNT_USER ".
  801. " FROM b_forum_stat FSTAT ".
  802. $strSqlFrom.
  803. " WHERE 1=1 ".$strSqlSearch.
  804. " GROUP BY FSTAT.USER_ID".
  805. ") FST ".
  806. "LEFT JOIN b_forum_stat FSTAT ON (FST.FST_ID = FSTAT.ID) ".
  807. "LEFT JOIN b_forum_user FU ON (FST.USER_ID = FU.USER_ID) ".
  808. "LEFT JOIN b_user U ON (FST.USER_ID = U.ID) ".
  809. $strSqlOrder;
  810. }
  811. $db_res = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__);
  812. return $db_res;
  813. }
  814. }