1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
user.php
См. документацию.
1<?php
2
4
6/**********************************************************************/
7/************** FORUM USER ********************************************/
8/**********************************************************************/
10{
11 public static function IsAdmin($userId = false, $arGroups = false)
12 {
13 global $USER;
14 if (is_array($userId) && !empty($userId) && $arGroups === false)
15 {
17 $userId = false;
18 }
19 if (is_array($arGroups) && !empty($arGroups))
20 {
21 //
22 }
23 elseif (!is_object($USER))
24 {
25 $arGroups = array(2);
26 }
27 elseif ($userId === false || $userId == $USER->GetID())
28 {
29 $arGroups = $USER->GetUserGroupArray();
30 }
31 else
32 {
33 $arGroups = $USER->GetUserGroup($userId);
34 }
35 $result = (
36 in_array(1, $arGroups) ||
37 $GLOBALS["APPLICATION"]->GetGroupRight("forum", $arGroups) >= "W"
38 );
39 return $result;
40 }
41
42 public static function GetUserTopicVisits($forumID, $arTopic, $userID=null)
43 {
44 global $DB, $USER;
45
46 $arResult = array();
47
48 $forumID = intval($forumID);
49 if ($userID == null)
50 $userID = $USER->GetID();
51 else
52 $userID = intval($userID);
53 if (($forumID <= 0) || ($userID <= 0))
54 {
55 return $arResult;
56 }
57 $arSelectTopic = array();
58 foreach ($arTopic as $topicID)
59 $arSelectTopic[] = intval($topicID);
60 $arSelectTopic = array_unique(array_filter($arSelectTopic));
61 if (sizeof($arSelectTopic) < 1)
62 {
63 return $arResult;
64 }
65 $sTopicIDs = implode(",", $arSelectTopic);
66
67 $strSql = "SELECT FUT.TOPIC_ID,
68 ".$DB->DateToCharFunction("FUT.LAST_VISIT", "FULL")." as LAST_VISIT
69 FROM b_forum_user_topic FUT
70 WHERE (FORUM_ID=".$forumID." AND USER_ID=".$userID." AND TOPIC_ID IN (".$sTopicIDs."))";
71 $rVisit = $DB->Query($strSql);
72 if ($rVisit)
73 {
74 while ($arVisit = $rVisit->Fetch())
75 {
76 $arResult[$arVisit['TOPIC_ID']] = $arVisit['LAST_VISIT'];
77 }
78 }
79 return $arResult;
80 }
81
82 public static function IsLocked($userID)
83 {
84 $userID = (int) $userID;
85 if ($userID <= 0)
86 {
87 return false;
88 }
89
90 $cacheID = 'b_forum_user_locked_' . $userID;
91 $cache = Bitrix\Main\Application::getInstance()->getManagedCache();
92
93 if (CACHED_b_forum_user !== false && $cache->read(CACHED_b_forum_user, $cacheID, 'b_forum_user'))
94 {
95 $result = $cache->get($cacheID);
96 }
97 else
98 {
99 $allow = Bitrix\Forum\UserTable::query()
100 ->addSelect('ALLOW_POST')
101 ->where('USER_ID', $userID)
102 ->fetch();
103
104 if ($allow)
105 {
106 $result = $allow['ALLOW_POST'];
107 }
108 else
109 {
110 $result = 'Y';
111 }
112
113 $cache->set($cacheID, $result);
114 }
115
116 return $result != 'Y';
117 }
118
119 public static function CanUserAddUser($arUserGroups)
120 {
121 return True;
122 }
123
124 public static function CanUserUpdateUser($ID, $arUserGroups, $CurrentUserID = 0)
125 {
126 $ID = intval($ID);
127 $CurrentUserID = intval($CurrentUserID);
128 if (in_array(1, $arUserGroups)) return True;
129 $arUser = CForumUser::GetByID($ID);
130 if ($arUser && intval($arUser["USER_ID"]) == $CurrentUserID) return True;
131 return False;
132 }
133
134 public static function CanUserDeleteUser($ID, $arUserGroups)
135 {
136 $ID = intval($ID);
137 if (in_array(1, $arUserGroups)) return True;
138 return False;
139 }
140
141 public static function CheckFields($ACTION, &$arFields, $ID=false)
142 {
143 if (is_set($arFields, "AVATAR") && $arFields["AVATAR"]["name"] == '' && $arFields["AVATAR"]["del"] == '')
144 {
145 unset($arFields["AVATAR"]);
146 }
147
148 $aMsg = array();
149 // Checking user for updating or adding
150 // USER_ID as value
151 if ((is_set($arFields, "USER_ID") || $ACTION=="ADD") && intval($arFields["USER_ID"]) <= 0)
152 {
153 $aMsg[] = array(
154 "id" => 'EMPTY_USER_ID',
155 "text" => GetMessage("F_GL_ERR_EMPTY_USER_ID"));
156 }
157 elseif (is_set($arFields, "USER_ID"))
158 {
159 $user = CUser::GetByID($arFields["USER_ID"])->fetch();
160 if (empty($user))
161 {
162 $aMsg[] = array(
163 "id" => 'USER_DOES_NOT_EXIST',
164 "text" => GetMessage("F_GL_ERR_USER_NOT_EXIST", array("#UID#" => htmlspecialcharsbx($arFields["USER_ID"]))));
165 }
166
168
169 if ($ACTION == "UPDATE")
170 {
171 unset($arFields["USER_ID"]);
172 }
173 else if (!empty($res))
174 {
175 $aMsg[] = array(
176 "id" => 'USER_EXISTS',
177 "text" => GetMessage("F_GL_ERR_USER_IS_EXIST", array("#UID#" => htmlspecialcharsbx($arFields["USER_ID"]))));
178 }
179 else if (!array_key_exists("AVATAR", $arFields) && $user["PERSONAL_PHOTO"] > 0)
180 {
181 $arFields["AVATAR"] = CFile::MakeFileArray($user["PERSONAL_PHOTO"]);
182 if (!$arFields["AVATAR"] || CFile::ResizeImage($arFields["AVATAR"], array(
183 "width" => COption::GetOptionInt("forum", "avatar_max_width", 100),
184 "height" => COption::GetOptionInt("forum", "avatar_max_height", 100)))
185 )
186 {
187 unset($arFields["AVATAR"]);
188 }
189 }
190 }
191 // last visit
192 if (is_set($arFields, "LAST_VISIT"))
193 {
194 $arFields["LAST_VISIT"] = trim($arFields["LAST_VISIT"]);
195 if ($arFields["LAST_VISIT"] <> '')
196 {
197 if ($arFields["LAST_VISIT"] != $GLOBALS["DB"]->GetNowFunction() && !$GLOBALS["DB"]->IsDate($arFields["LAST_VISIT"], false, SITE_ID, "FULL"))
198 $aMsg[] = array(
199 "id" => 'LAST_VISIT',
200 "text" => GetMessage("F_GL_ERR_LAST_VISIT"));
201 }
202 else
203 {
204 unset($arFields["LAST_VISIT"]);
205 }
206 }
207 // date registration
208 if (is_set($arFields, "DATE_REG"))
209 {
210 $arFields["DATE_REG"] = trim($arFields["DATE_REG"]);
211 if ($arFields["DATE_REG"] <> '')
212 {
213 if ($arFields["DATE_REG"] != $GLOBALS["DB"]->GetNowFunction() && !$GLOBALS["DB"]->IsDate($arFields["DATE_REG"], false, SITE_ID, "SHORT"))
214 {
215 $aMsg[] = array(
216 "id" => 'DATE_REG',
217 "text" => GetMessage("F_GL_ERR_DATE_REG"));
218 }
219 }
220 else
221 {
222 unset($arFields["DATE_REG"]);
223 }
224 }
225 // avatar
226 if (is_set($arFields, "AVATAR"))
227 {
228 $max_size = COption::GetOptionInt("forum", "file_max_size", 5242880);
229 $size = array(
230 "width" => COption::GetOptionInt("forum", "avatar_max_width", 100),
231 "height" => COption::GetOptionInt("forum", "avatar_max_height", 100));
232 $res = CFile::CheckImageFile($arFields["AVATAR"], $max_size);
233 if ($res == '')
234 {
235 $res = CFile::CheckImageFile($arFields["AVATAR"], $max_size, $size["width"], $size["height"]);
236 if ($res <> '' && CFile::ResizeImage($arFields["AVATAR"], $size))
237 $res = '';
238 }
239 if ($res <> '')
240 {
241 $aMsg[] = array(
242 "id" => 'AVATAR',
243 "text" => $res);
244 }
245 }
246
247 if (!empty($aMsg))
248 {
249 $e = new CAdminException(array_reverse($aMsg));
250 $GLOBALS["APPLICATION"]->ThrowException($e);
251 return false;
252 }
253
254 // show name
255 if (is_set($arFields, "SHOW_NAME") || $ACTION == "ADD")
256 {
257 if (empty($arFields["SHOW_NAME"]))
258 $arFields["SHOW_NAME"] = COption::GetOptionString("forum", "USER_SHOW_NAME", "Y") == "Y" ? "Y" : "N";
259 $arFields["SHOW_NAME"] = ($arFields["SHOW_NAME"] == "N" ? "N" : "Y");
260 }
261 // allow post
262 if (is_set($arFields, "ALLOW_POST") || $ACTION=="ADD")
263 {
264 $arFields["ALLOW_POST"] = ($arFields["ALLOW_POST"] == "N" ? "N" : "Y");
265 }
266 return True;
267 }
268
269 public static function Add($fields, $strUploadDir = false)
270 {
271 if (!is_array($fields) || empty($fields))
272 {
273 return false;
274 }
275
276 if (!array_key_exists("AVATAR", $fields))
277 {
278 $user = CUser::GetByID($fields["USER_ID"])->fetch();
279 if ($user["PERSONAL_PHOTO"] > 0)
280 {
281 $fields["AVATAR"] = CFile::MakeFileArray($user["PERSONAL_PHOTO"]);
282 }
283 }
284 $result = \Bitrix\Forum\UserTable::add($fields);
285 if (!$result->isSuccess())
286 {
287 return false;
288 }
289
290 global $CACHE_MANAGER;
291 $CACHE_MANAGER->cleanDir("b_forum_user");
292
293 $id = $result->getPrimary();
294 return $id["ID"];
295 }
296
297 public static function Update($ID, $arFields, $strUploadDir = false, $UpdateByUserId = false)
298 {
299 if (!is_array($arFields) || empty($arFields))
300 {
301 return false;
302 }
303
304 if ($UpdateByUserId)
305 {
306 if ($res = \Bitrix\Forum\UserTable::getList([
307 "select" => ["ID"],
308 "filter" => ["USER_ID" => $ID]
309 ])->fetch())
310 {
311 $ID = intval($res["ID"]);
312 }
313 }
314 if ($ID <= 0)
315 {
316 return false;
317 }
318
319 if (is_set($arFields, "ALLOW_POST"))
320 {
321 if (CACHED_b_forum_user !== false)
322 $GLOBALS["CACHE_MANAGER"]->CleanDir("b_forum_user");
323 }
324 unset($GLOBALS["FORUM_CACHE"]["USER"]);
325 unset($GLOBALS["FORUM_CACHE"]["USER_ID"]);
326
327 $entity = \Bitrix\Forum\UserTable::getEntity();
328 $data = [];
329 foreach ($arFields as $k => $v)
330 {
331 $k = (mb_strpos($k, "=") === 0? mb_substr($k, 1) : $k);
332 if ($entity->hasField($k))
333 {
334 $field = $entity->getField($k);
335 $data[$k] = $v;
336 if ($field instanceof \Bitrix\Main\ORM\Fields\DateField)
337 {
338 $data[$k] = new \Bitrix\Main\Type\DateTime(\Bitrix\Main\Type\DateTime::isCorrect($v) ? $v : null);
339 }
340 else if (
341 isset($v)
342 && !is_array($v)
343 && preg_match("/{$k}\s*(\+|\-)\s*(\d+)/", $v, $matches)
344 )
345 {
346 $data[$k] = new \Bitrix\Main\DB\SqlExpression("?# $matches[1] $matches[2]", $k);
347 }
348 }
349 }
350
352 if (!$result->isSuccess())
353 {
354 return false;
355 }
356 return $ID;
357 }
358
359 public static function Delete($ID)
360 {
361 $result = \Bitrix\Forum\UserTable::delete($ID);
362 unset($GLOBALS["FORUM_CACHE"]["USER"]);
363 unset($GLOBALS["FORUM_CACHE"]["USER_ID"]);
364 return $result->isSuccess();
365 }
366
367 public static function CountUsers($bActive = False, $arFilter = array())
368 {
369 global $DB;
370 $arFilter = (is_array($arFilter) ? $arFilter : array());
371 $arSqlSearch = array();
372 $strSqlSearch = "";
373 if ($bActive)
374 $arSqlSearch[] = "NUM_POSTS > 0";
375 foreach ($arFilter as $key => $val)
376 {
378 $key = mb_strtoupper($key_res["FIELD"]);
379 $strNegative = $key_res["NEGATIVE"];
380 $strOperation = $key_res["OPERATION"];
381
382 switch ($key)
383 {
384 case "ACTIVE":
385 if ($val == '')
386 $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(U.".$key." IS NULL OR ".($DB->type == "MSSQL" ? "LEN" : "LENGTH")."(U.".$key.")<=0)";
387 else
388 $arSqlSearch[] = ($strNegative=="Y"?" U.".$key." IS NULL OR NOT (":"")."U.".$key." ".$strOperation." '".$DB->ForSql($val)."'".
389 ($strNegative=="Y"?")":"");
390 break;
391 }
392 }
393 if (count($arSqlSearch) > 0)
394 $strSqlSearch = " WHERE (".implode(") AND (", $arSqlSearch).") ";
395
396 $strSql = "SELECT COUNT(FU.ID) AS CNT FROM b_forum_user FU INNER JOIN b_user U ON (U.ID = FU.USER_ID)".$strSqlSearch;
397 $db_res = $DB->Query($strSql);
398 if ($ar_res = $db_res->Fetch())
399 return $ar_res["CNT"];
400
401 return 0;
402 }
403
404 public static function GetByID($ID)
405 {
406 global $DB;
407
408 $ID = intval($ID);
409 if (isset($GLOBALS["FORUM_CACHE"]["USER"][$ID]) && is_array($GLOBALS["FORUM_CACHE"]["USER"][$ID]) && is_set($GLOBALS["FORUM_CACHE"]["USER"][$ID], "ID"))
410 {
411 return $GLOBALS["FORUM_CACHE"]["USER"][$ID];
412 }
413 else
414 {
415 $strSql =
416 "SELECT FU.ID, FU.USER_ID, FU.SHOW_NAME, FU.DESCRIPTION, FU.IP_ADDRESS,
417 FU.REAL_IP_ADDRESS, FU.AVATAR, FU.NUM_POSTS, FU.POINTS as NUM_POINTS, FU.INTERESTS,
418 FU.HIDE_FROM_ONLINE, FU.SUBSC_GROUP_MESSAGE, FU.SUBSC_GET_MY_MESSAGE,
419 FU.LAST_POST, FU.ALLOW_POST, FU.SIGNATURE, FU.RANK_ID, FU.POINTS,
420 ".$DB->DateToCharFunction("FU.DATE_REG", "SHORT")." as DATE_REG,
421 ".$DB->DateToCharFunction("FU.LAST_VISIT", "FULL")." as LAST_VISIT
422 FROM b_forum_user FU
423 WHERE FU.ID = ".$ID;
424 $db_res = $DB->Query($strSql);
425 if ($res = $db_res->Fetch())
426 {
427 $GLOBALS["FORUM_CACHE"]["USER"][$ID] = $res;
428 return $res;
429 }
430 }
431 return False;
432 }
433
434 public static function GetByLogin($Name)
435 {
436 global $DB;
437 $Name = $DB->ForSql(trim($Name));
438 if (
439 isset($GLOBALS["FORUM_CACHE"]["USER_NAME"]) &&
440 is_set($GLOBALS["FORUM_CACHE"]["USER_NAME"], $Name) &&
441 is_array($GLOBALS["FORUM_CACHE"]["USER_NAME"][$Name]) &&
442 is_set($GLOBALS["FORUM_CACHE"]["USER_NAME"][$Name], "ID"))
443 {
444 return $GLOBALS["FORUM_CACHE"]["USER_NAME"][$Name];
445 }
446 else
447 {
448 $strSql =
449 "SELECT ID AS USER_ID
450 FROM b_user
451 WHERE LOGIN='".$Name."'";
452 $db_res = $DB->Query($strSql);
453 $res = $db_res->Fetch();
454 if (!empty($res["USER_ID"]))
455 {
456 $strSql =
457 "SELECT FU.ID, FU.USER_ID, FU.SHOW_NAME, FU.DESCRIPTION, FU.IP_ADDRESS,
458 FU.REAL_IP_ADDRESS, FU.AVATAR, FU.NUM_POSTS, FU.POINTS as NUM_POINTS,
459 FU.INTERESTS, FU.HIDE_FROM_ONLINE, FU.SUBSC_GROUP_MESSAGE, FU.SUBSC_GET_MY_MESSAGE,
460 FU.LAST_POST, FU.ALLOW_POST, FU.SIGNATURE, FU.RANK_ID, FU.POINTS,
461 ".$DB->DateToCharFunction("FU.DATE_REG", "SHORT")." as DATE_REG,
462 ".$DB->DateToCharFunction("FU.LAST_VISIT", "FULL")." as LAST_VISIT
463 FROM b_forum_user FU
464 WHERE FU.USER_ID = ".$res["USER_ID"];
465 $db_res = $DB->Query($strSql);
466 if ($res = $db_res->Fetch())
467 {
468 $GLOBALS["FORUM_CACHE"]["USER"][$res["USER_ID"]] = $res;
469 $GLOBALS["FORUM_CACHE"]["USER_NAME"][$Name] = $res;
470 return $res;
471 }
472 }
473 }
474
475 return False;
476 }
477
478 public static function GetByIDEx($ID, $arAddParams = array())
479 {
480 global $DB;
481 $arAddParams = (is_array($arAddParams) ? $arAddParams : array($arAddParams));
482
483 $ID = intval($ID);
484 $strSql =
485 "SELECT FU.ID, FU.USER_ID, FU.SHOW_NAME, FU.DESCRIPTION, FU.IP_ADDRESS,\n ".
486 " FU.REAL_IP_ADDRESS, FU.AVATAR, FU.NUM_POSTS, FU.POINTS as NUM_POINTS, FU.INTERESTS,\n ".
487 " FU.LAST_POST, FU.ALLOW_POST, FU.SIGNATURE, FU.RANK_ID,\n ".
488 " U.EMAIL, U.NAME, U.SECOND_NAME, U.LAST_NAME, U.LOGIN, U.PERSONAL_BIRTHDATE,\n ".
489 " ".$DB->DateToCharFunction("FU.DATE_REG", "SHORT")." as DATE_REG,\n ".
490 " ".$DB->DateToCharFunction("FU.LAST_VISIT", "FULL")." as LAST_VISIT,\n ".
491 " U.PERSONAL_ICQ, U.PERSONAL_WWW, U.PERSONAL_PROFESSION,\n ".
492 " U.PERSONAL_CITY, U.PERSONAL_COUNTRY, U.EXTERNAL_AUTH_ID, U.PERSONAL_PHOTO,\n ".
493 " U.PERSONAL_GENDER, FU.POINTS, FU.HIDE_FROM_ONLINE, FU.SUBSC_GROUP_MESSAGE, FU.SUBSC_GET_MY_MESSAGE,\n ".
494 " ".$DB->DateToCharFunction("U.PERSONAL_BIRTHDAY", "SHORT")." as PERSONAL_BIRTHDAY ".
495 (array_key_exists("SHOW_ABC", $arAddParams) || in_array("SHOW_ABC", $arAddParams) ?
496 ", \n\t".CForumUser::GetFormattedNameFieldsForSelect(
497 array_merge(
498 $arAddParams,
499 array(
500 "sUserTablePrefix" => "U.",
501 "sForumUserTablePrefix" => "FU.",
502 "sFieldName" => "SHOW_ABC"),
503 false
504 )
505 ) : "")."\n".
506 " FROM b_user U, b_forum_user FU \n".
507 " WHERE FU.USER_ID = U.ID AND FU.ID = ".$ID." ";
508 $db_res = $DB->Query($strSql);
509
510 if ($res = $db_res->Fetch())
511 {
512 return $res;
513 }
514 return False;
515 }
516
517 public static function GetByUSER_ID($USER_ID)
518 {
519 global $DB;
520
521 $USER_ID = intval($USER_ID);
522 if (isset($GLOBALS["FORUM_CACHE"]["USER_ID"][$USER_ID]) && is_array($GLOBALS["FORUM_CACHE"]["USER_ID"][$USER_ID]) && is_set($GLOBALS["FORUM_CACHE"]["USER_ID"][$USER_ID], "ID"))
523 {
524 return $GLOBALS["FORUM_CACHE"]["USER_ID"][$USER_ID];
525 }
526 else
527 {
528 $strSql =
529 "SELECT FU.ID, FU.USER_ID, FU.SHOW_NAME, FU.DESCRIPTION, FU.IP_ADDRESS,
530 FU.REAL_IP_ADDRESS, FU.AVATAR, FU.NUM_POSTS, FU.POINTS as NUM_POINTS,
531 FU.INTERESTS, FU.HIDE_FROM_ONLINE, FU.SUBSC_GROUP_MESSAGE, FU.SUBSC_GET_MY_MESSAGE,
532 FU.LAST_POST, FU.ALLOW_POST, FU.SIGNATURE, FU.RANK_ID, FU.POINTS,
533 ".$DB->DateToCharFunction("FU.DATE_REG", "SHORT")." as DATE_REG,
534 ".$DB->DateToCharFunction("FU.LAST_VISIT", "FULL")." as LAST_VISIT
535 FROM b_forum_user FU
536 WHERE FU.USER_ID = ".$USER_ID;
537 $db_res = $DB->Query($strSql);
538
539 if ($db_res && $res = $db_res->Fetch())
540 {
541 $GLOBALS["FORUM_CACHE"]["USER_ID"][$USER_ID] = $res;
542 return $res;
543 }
544 }
545 return False;
546 }
547
548 public static function GetByUSER_IDEx($USER_ID, $arAddParams = array())
549 {
550 global $DB;
551 $arAddParams = (is_array($arAddParams) ? $arAddParams : array($arAddParams));
552
553 $USER_ID = intval($USER_ID);
554 $strSql =
555 "SELECT F_USER.*, FU.ID, FU.USER_ID, FU.SHOW_NAME, FU.DESCRIPTION, FU.IP_ADDRESS,\n ".
556 " FU.REAL_IP_ADDRESS, FU.AVATAR, FU.NUM_POSTS, FU.POINTS as NUM_POINTS,\n ".
557 " FU.INTERESTS, FU.HIDE_FROM_ONLINE, FU.SUBSC_GROUP_MESSAGE, FU.SUBSC_GET_MY_MESSAGE,\n ".
558 " FU.LAST_POST, FU.ALLOW_POST, FU.SIGNATURE, FU.RANK_ID, FU.POINTS,\n ".
559 " ".$DB->DateToCharFunction("FU.DATE_REG", "SHORT")." as DATE_REG,\n ".
560 " ".$DB->DateToCharFunction("FU.LAST_VISIT", "FULL")." as LAST_VISIT,\n ".
561 " U.EMAIL, U.NAME, U.SECOND_NAME, U.LAST_NAME, U.LOGIN, U.PERSONAL_BIRTHDATE,\n ".
562 " U.PERSONAL_ICQ, U.PERSONAL_WWW, U.PERSONAL_PROFESSION,\n ".
563 " U.PERSONAL_CITY, U.PERSONAL_COUNTRY, U.EXTERNAL_AUTH_ID, U.PERSONAL_PHOTO, U.PERSONAL_GENDER,\n ".
564 " ".$DB->DateToCharFunction("U.PERSONAL_BIRTHDAY", "SHORT")." as PERSONAL_BIRTHDAY ".
565 (array_key_exists("SHOW_ABC", $arAddParams) || in_array("SHOW_ABC", $arAddParams) ?
566 ", \n\t".CForumUser::GetFormattedNameFieldsForSelect(
567 array_merge(
568 $arAddParams,
569 array(
570 "sUserTablePrefix" => "U.",
571 "sForumUserTablePrefix" => "FU.",
572 "sFieldName" => "SHOW_ABC"),
573 false
574 )
575 ) : ""). "\n".
576 " FROM b_forum_user FU \n".
577 " INNER JOIN b_user U ON (FU.USER_ID = U.ID) \n".
578 " LEFT JOIN ( \n".
579 " SELECT FM.AUTHOR_ID, MAX(FM.ID) AS LAST_MESSAGE_ID, COUNT(FM.ID) AS CNT \n".
580 " FROM b_forum_message FM \n".
581 " WHERE (FM.AUTHOR_ID = ".$USER_ID." AND FM.APPROVED = 'Y') \n".
582 " GROUP BY FM.AUTHOR_ID \n".
583 " ) F_USER ON (F_USER.AUTHOR_ID = FU.USER_ID) \n".
584 " WHERE (FU.USER_ID = ".$USER_ID.")";
585 $db_res = $DB->Query($strSql);
586
587 if ($db_res && $res = $db_res->Fetch())
588 {
589 return $res;
590 }
591 return False;
592 }
593
594
595 public static function GetUserRank($USER_ID, $strLang = false)
596 {
597 $USER_ID = intval($USER_ID);
598 $arUser = false;
599 if ($USER_ID <= 0) return false;
600
601 if (COption::GetOptionString("forum", "SHOW_VOTES", "Y") == "Y")
602 $arUser = CForumUser::GetByUSER_ID($USER_ID);
603 else
604 {
605 $authorityRatingId = CRatings::GetAuthorityRating();
606 $arRatingResult = CRatings::GetRatingResult($authorityRatingId, $USER_ID);
607 if (isset($arRatingResult['CURRENT_VALUE']))
608 $arUser = array('POINTS' => round(floatval($arRatingResult['CURRENT_VALUE'])/COption::GetOptionString("main", "rating_vote_weight", 1)));
609 }
610 if ($arUser)
611 {
612 if ($strLang === false || mb_strlen($strLang) != 2)
613 $db_res = CForumPoints::GetList(array("MIN_POINTS"=>"DESC"), array("<=MIN_POINTS"=>$arUser["POINTS"]));
614 else
615 $db_res = CForumPoints::GetListEx(array("MIN_POINTS"=>"DESC"), array("<=MIN_POINTS"=>$arUser["POINTS"], "LID" => $strLang));
616
617 if ($db_res && ($ar_res = $db_res->Fetch()))
618 return $ar_res;
619 }
620 return false;
621 }
622 //---------------> User visited
623 public static function SetUserForumLastVisit($USER_ID, $FORUM_ID = 0, $LAST_VISIT = false)
624 {
625 global $DB;
626 $USER_ID = intval($USER_ID);
627 $FORUM_ID = intval($FORUM_ID);
628 if (is_int($LAST_VISIT)):
629 $LAST_VISIT = $DB->CharToDateFunction(date(CDatabase::DateFormatToPHP(CLang::GetDateFormat("FULL")), $LAST_VISIT), "FULL");
630 elseif (is_string($LAST_VISIT)):
631 $LAST_VISIT = $DB->CharToDateFunction(trim($LAST_VISIT), "FULL");
632 else:
633 $LAST_VISIT = false;
634 endif;
635
636 if (!$LAST_VISIT):
637 $Fields = array("LAST_VISIT" => $DB->GetNowFunction());
638 $rows = $DB->Update("b_forum_user_forum", $Fields, "WHERE (FORUM_ID=".$FORUM_ID." AND USER_ID=".$USER_ID.")", "File: ".__FILE__."<br>Line: ".__LINE__);
639
640 if (intval($rows) <= 0):
641 $Fields["USER_ID"] = $USER_ID;
642 $Fields["FORUM_ID"] = $FORUM_ID;
643 $DB->Insert("b_forum_user_forum", $Fields, "File: ".__FILE__."<br>Line: ".__LINE__);
644 elseif ($FORUM_ID <= 0):
645 $DB->Query("DELETE FROM b_forum_user_forum WHERE (FORUM_ID > 0 AND USER_ID=".$USER_ID.")");
646 $DB->Query("DELETE FROM b_forum_user_topic WHERE (USER_ID=".$USER_ID.")");
647 else:
648 $DB->Query("DELETE FROM b_forum_user_topic WHERE (FORUM_ID=".$FORUM_ID." AND USER_ID=".$USER_ID.")");
649 endif;
650 else:
651 $Fields = array("LAST_VISIT" => $LAST_VISIT);
652 $rows = $DB->Update("b_forum_user_forum", $Fields,
653 "WHERE (FORUM_ID=".$FORUM_ID." AND USER_ID=".$USER_ID.")", "File: ".__FILE__."<br>Line: ".__LINE__);
654
655 if (intval($rows) <= 0):
656 $Fields = array("LAST_VISIT" => $LAST_VISIT, "FORUM_ID" => $FORUM_ID, "USER_ID" => $USER_ID);
657 $DB->Insert("b_forum_user_forum", $Fields, "File: ".__FILE__."<br>Line: ".__LINE__);
658 elseif ($FORUM_ID <= 0):
659 $DB->Query("DELETE FROM b_forum_user_forum WHERE (FORUM_ID > 0 AND USER_ID=".$USER_ID." AND LAST_VISIT <= ".$LAST_VISIT.")");
660 $DB->Query("DELETE FROM b_forum_user_topic WHERE (USER_ID=".$USER_ID." AND LAST_VISIT <= ".$LAST_VISIT.")");
661 else:
662 $DB->Query("DELETE FROM b_forum_user_topic WHERE (FORUM_ID=".$FORUM_ID." AND USER_ID=".$USER_ID." AND LAST_VISIT <= ".$LAST_VISIT.")");
663 endif;
664 endif;
665 return true;
666 }
667
668 public static function GetListUserForumLastVisit($arOrder = Array("LAST_VISIT"=>"DESC"), $arFilter = Array())
669 {
670 global $DB;
671 $arSqlSearch = Array();
672 $arSqlOrder = Array();
673 $strSqlSearch = "";
674 $strSqlOrder = "";
675 $arFilter = (is_array($arFilter) ? $arFilter : array());
676
677 foreach ($arFilter as $key => $val)
678 {
680 $key = mb_strtoupper($key_res["FIELD"]);
681 $strNegative = $key_res["NEGATIVE"];
682 $strOperation = $key_res["OPERATION"];
683
684 switch ($key)
685 {
686 case "ID":
687 case "USER_ID":
688 case "FORUM_ID":
689 if (intval($val)<=0)
690 $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FUF.".$key." IS NULL OR FUF.".$key."<=0)";
691 else
692 $arSqlSearch[] = ($strNegative=="Y"?" FUF.".$key." IS NULL OR NOT ":"")."(FUF.".$key." ".$strOperation." ".intval($val)." )";
693 break;
694 }
695 }
696 if (!empty($arSqlSearch))
697 $strSqlSearch = " AND (".implode(") AND (", $arSqlSearch).")";
698 foreach ($arOrder as $by=>$order)
699 {
700 $by = mb_strtoupper($by);
701 $order = mb_strtoupper($order);
702 if ($order!="ASC") $order = "DESC";
703
704 if ($by == "USER_ID") $arSqlOrder[] = " FUF.USER_ID ".$order." ";
705 elseif ($by == "FORUM_ID") $arSqlOrder[] = " FUF.FORUM_ID ".$order." ";
706 elseif ($by == "LAST_VISIT") $arSqlOrder[] = " FUF.LAST_VISIT ".$order." ";
707 else
708 {
709 $arSqlOrder[] = " FU.ID ".$order." ";
710 $by = "ID";
711 }
712 }
713 DelDuplicateSort($arSqlOrder);
714 if (count($arSqlOrder) > 0)
715 $strSqlOrder = " ORDER BY ".implode(", ", $arSqlOrder);
716
717 $strSql = "
718 SELECT FUF.ID, FUF.FORUM_ID, FUF.USER_ID, ".$DB->DateToCharFunction("FUF.LAST_VISIT", "FULL")." as LAST_VISIT
719 FROM b_forum_user_forum FUF
720 INNER JOIN b_user U ON (U.ID = FUF.USER_ID)
721 WHERE 1=1 ".$strSqlSearch."
722 ".$strSqlOrder;
723 $db_res = $DB->Query($strSql);
724 return $db_res;
725 }
726 //---------------> User visited
727
728 //---------------> User utils/
729
737 public static function GetFormattedNameByUserID($userID, $template = "", $arUser = array())
738 {
739 if (empty($userID))
740 return false;
741
742 static $arUsers = array();
743
744 if (!array_key_exists($userID, $arUsers))
745 {
746 $arUsers[$userID] = (!empty($arUser) ? $arUser : CForumUser::GetByUSER_ID($userID));
747 $arUsers[$userID] = (!empty($arUsers[$userID]) ? $arUsers[$userID] : array());
748 $arUsers[$userID]["SHOW_NAME"] = ($arUsers[$userID]["SHOW_NAME"] == "Y" ? "Y" : "N");
749 if (!array_key_exists("LOGIN", $arUsers[$userID]) || !array_key_exists("NAME", $arUsers[$userID]) ||
750 !array_key_exists("SECOND_NAME", $arUsers[$userID]) || !array_key_exists("LAST_NAME", $arUsers[$userID])
751 )
752 {
753 $dbRes = CUser::GetByID($userID);
754 if (($arRes = $dbRes->Fetch()) && $arRes)
755 $arUsers[$userID] = array_merge($arRes, $arUsers[$userID]);
756 }
757 $arUsers[$userID]["FORMATTED_NAME"] = ($arUsers[$userID]["SHOW_NAME"] == "Y" ?
758 CUser::FormatName($template, $arUsers[$userID], false, false) : "");
759 $arUsers[$userID]["FORMATTED_NAME"] = (empty($arUsers[$userID]["FORMATTED_NAME"]) ||
760 $arUsers[$userID]["FORMATTED_NAME"] == GetMessage("FORMATNAME_NONAME")?
761 $arUsers[$userID]["LOGIN"] : $arUsers[$userID]["FORMATTED_NAME"]);
762 }
763 return $arUsers[$userID]["FORMATTED_NAME"];
764 }
765
766 public static function GetUserPoints($USER_ID, $arAddParams = array())
767 {
768 global $DB;
769 $USER_ID = intval($USER_ID);
770 if ($USER_ID <= 0) return 0;
771 $arAddParams = (is_array($arAddParams) ? $arAddParams : array($arAddParams));
772 $arAddParams["INCREMENT"] = intval($arAddParams["INCREMENT"] ?? 0);
773 $arAddParams["DECREMENT"] = intval($arAddParams["DECREMENT"] ?? 0);
774 $arAddParams["NUM_POSTS"] = (is_set($arAddParams, "NUM_POSTS") ? $arAddParams["NUM_POSTS"] : false);
775 $arAddParams["RETURN_FETCH"] = (isset($arAddParams["RETURN_FETCH"]) && $arAddParams["RETURN_FETCH"] == "Y" ? "Y" : "N");
776 $strSql = "
777 SELECT
778 (".
779 ($arAddParams["NUM_POSTS"] ? $arAddParams["NUM_POSTS"] : "FU.NUM_POSTS").
780 ($arAddParams["INCREMENT"] > 0 ? "+".$arAddParams["INCREMENT"] : "").
781 ($arAddParams["DECREMENT"] > 0 ? "-".$arAddParams["DECREMENT"] : "").
782 ") AS NUM_POSTS, FP2P.MIN_NUM_POSTS, FP2P.POINTS_PER_POST, SUM(FUP.POINTS) AS POINTS_FROM_USER
783 FROM
784 b_forum_user FU
785 LEFT JOIN b_forum_points2post FP2P ON (FP2P.MIN_NUM_POSTS <= ".
786 ($arAddParams["NUM_POSTS"] ? $arAddParams["NUM_POSTS"] : "FU.NUM_POSTS").
787 ($arAddParams["INCREMENT"] > 0 ? "+".$arAddParams["INCREMENT"] : "").
788 ($arAddParams["DECREMENT"] > 0 ? "-".$arAddParams["DECREMENT"] : "").")
789 LEFT JOIN b_forum_user_points FUP ON (FUP.TO_USER_ID = FU.USER_ID)
790 WHERE
791 FU.user_id = ".$USER_ID."
792 GROUP BY
793 ".($arAddParams["NUM_POSTS"] ? "" : "FU.NUM_POSTS, ")."FP2P.MIN_NUM_POSTS, FP2P.POINTS_PER_POST
794 ORDER BY FP2P.MIN_NUM_POSTS DESC";
795
796 $db_res = $DB->Query($strSql);
797 if ($arAddParams["RETURN_FETCH"] == "Y"):
798 return $db_res;
799 elseif ($db_res && ($res = $db_res->Fetch())):
800 $result = floor(doubleVal($res["POINTS_PER_POST"])*intval($res["NUM_POSTS"]) + intval($res["POINTS_FROM_USER"]));
801 return $result;
802 endif;
803 return false;
804 }
805
806 public static function CountUserPoints($USER_ID = 0, $iCnt = false)
807 {
808 $USER_ID = intval($USER_ID);
809 $iNumUserPosts = intval($iCnt);
810 $iNumUserPoints = 0;
811 $fPointsPerPost = 0.0;
812 if ($USER_ID <= 0) return 0;
813
814 if ($iCnt === false):
815 $iNumUserPoints = CForumUser::GetUserPoints($USER_ID);
816 endif;
817
818 if ($iNumUserPoints === false || $iCnt != false):
819 $iNumUserPosts = CForumMessage::GetList(array(), array("AUTHOR_ID" => $USER_ID, "APPROVED" => "Y"), true);
820 $db_res = CForumPoints2Post::GetList(array("MIN_NUM_POSTS" => "DESC"), array("<=MIN_NUM_POSTS" => $iNumUserPosts));
821 if ($ar_res = $db_res->Fetch())
822 $fPointsPerPost = DoubleVal($ar_res["POINTS_PER_POST"]);
823 $iNumUserPoints = floor($fPointsPerPost*$iNumUserPosts);
824 $iCnt = CForumUserPoints::CountSumPoints($USER_ID);
825 $iNumUserPoints += $iCnt;
826 endif;
827 return $iNumUserPoints;
828 }
829
830 public static function SetStat($userId = 0, $params = [])
831 {
832 $enableCalculateStatistics = COption::GetOptionString('forum', 'enable_calculate_statistics', 'Y');
833 if (
834 $enableCalculateStatistics === 'N'
835 || empty($userId)
836 || (!empty($params['MESSAGE']['APPROVED']) && $params['MESSAGE']['APPROVED'] !== 'Y')
837 )
838 {
839 return;
840 }
841
842 $userId = intval($userId);
843 $params = is_array($params) ? $params : [];
844 $bNeedCreateUser = false;
845 $arUser = [];
846 $arUserFields = [];
847
848 if (isset($params['MESSAGE']['AUTHOR_ID']) && $params['MESSAGE']['AUTHOR_ID'] === $userId)
849 {
850 $arMessage = $params['MESSAGE'];
851 $params['ACTION'] = $params['ACTION'] ?? 'INCREMENT';
852 if ($params['ACTION'] == 'UPDATE')
853 {
854 $params['ACTION'] = ($arMessage['APPROVED'] == 'Y' ? 'INCREMENT' : 'DECREMENT');
855 $arMessage['APPROVED'] = 'Y';
856 }
857
858 $params['POSTS'] = intval($params['POSTS'] ?? 1);
859 $bNeedCreateUser = !($arUser = CForumUser::GetByUSER_ID($userId));
860
861 if ($params['ACTION'] == 'DECREMENT' && $arMessage['ID'] < $arUser['LAST_POST'])
862 {
863 $arUserFields = [
864 '=NUM_POSTS' => 'NUM_POSTS-'.$params['POSTS'],
865 'POINTS' => intval(CForumUser::GetUserPoints($userId, ['DECREMENT' => $params['POSTS']]))
866 ];
867 }
868 else if ($params['ACTION'] == 'INCREMENT' && $arMessage['ID'] < $arUser['LAST_POST'])
869 {
870 $arUserFields = [
871 '=NUM_POSTS' => 'NUM_POSTS+'.$params['POSTS'],
872 'POINTS' => intval(CForumUser::GetUserPoints($userId, ['INCREMENT' => $params['POSTS']]))
873 ];
874 }
875 else if ($params['ACTION'] == 'INCREMENT')
876 {
877 $arUserFields['IP_ADDRESS'] = $arMessage['AUTHOR_IP'];
878 $arUserFields['REAL_IP_ADDRESS'] = $arMessage['AUTHOR_REAL_IP'];
879 $arUserFields['LAST_POST'] = intval($arMessage['ID']);
880 $arUserFields['=NUM_POSTS'] = 'NUM_POSTS+' . $params['POSTS'];
881 $arUserFields['POINTS'] = CForumUser::GetUserPoints($userId, ['INCREMENT' => $params['POSTS']]);
882 }
883 }
884
885 if (empty($arUserFields))
886 {
887 $arUserFields = [
888 'LAST_POST' => false
889 ];
890 if ($bNeedCreateUser === false)
892 if (empty($arUser) || $bNeedCreateUser == true):
893 $bNeedCreateUser = true;
894 $arUser = CForumMessage::GetList(array(), array('AUTHOR_ID' => $userId, 'APPROVED' => 'Y'), 'cnt_and_last_mid');
895 $arUser = (is_array($arUser) ? $arUser : array());
896 endif;
897 $arMessage = CForumMessage::GetByID($arUser['LAST_MESSAGE_ID'], array('FILTER' => 'N'));
898 if ($arMessage):
899 $arUserFields['IP_ADDRESS'] = $arMessage['AUTHOR_IP'];
900 $arUserFields['REAL_IP_ADDRESS'] = $arMessage['AUTHOR_REAL_IP'];
901 $arUserFields['LAST_POST'] = intval($arMessage['ID']);
902 endif;
903 $arUserFields['NUM_POSTS'] = intval($arUser['CNT']);
904 $arUserFields['POINTS'] = intval(CForumUser::GetUserPoints($userId, array('NUM_POSTS' => $arUserFields['NUM_POSTS'])));
905 }
906
907 if ($bNeedCreateUser):
908 $arUserFields['USER_ID'] = $userId;
909 CForumUser::Add($arUserFields);
910 else:
911 CForumUser::Update($userId, $arUserFields, false, true);
912 endif;
913
914 return $userId;
915 }
916 //---------------> User actions
917 public static function OnUserDelete($user_id)
918 {
919 global $DB;
920 $user_id = intval($user_id);
921 if ($user_id>0)
922 {
923 $DB->Query("UPDATE b_forum SET LAST_POSTER_ID = NULL WHERE LAST_POSTER_ID = ".$user_id."");
924 $DB->Query("UPDATE b_forum_topic SET LAST_POSTER_ID = NULL WHERE LAST_POSTER_ID = ".$user_id."");
925 $DB->Query("UPDATE b_forum_topic SET USER_START_ID = NULL WHERE USER_START_ID = ".$user_id."");
926 $DB->Query("UPDATE b_forum_message SET AUTHOR_ID = NULL WHERE AUTHOR_ID = ".$user_id."");
927 $DB->Query("DELETE FROM b_forum_subscribe WHERE USER_ID = ".$user_id."");
928 $DB->Query("DELETE FROM b_forum_stat WHERE USER_ID = ".$user_id."");
929
930 $strSql = "
931 SELECT
932 F.ID
933 FROM
934 b_forum_user FU,
935 b_file F
936 WHERE
937 FU.USER_ID = $user_id
938 and FU.AVATAR = F.ID
939 ";
940 $z = $DB->Query($strSql);
941 while ($zr = $z->Fetch()) CFile::Delete($zr["ID"]);
942
943 $DB->Query("DELETE FROM b_forum_user WHERE USER_ID = ".$user_id."");
944
945 if(CModule::IncludeModule("socialnetwork"))
946 {
947 $dbRes = $DB->Query("select ID from b_forum_topic where OWNER_ID=".$user_id);
948 while($arRes = $dbRes->Fetch())
949 {
950 $DB->Query("DELETE FROM b_forum_message WHERE TOPIC_ID = ".$arRes["ID"]);
951 $DB->Query("DELETE FROM b_forum_topic WHERE ID = ".$arRes["ID"]);
952 }
953
954 }
955 }
956 return true;
957 }
958 // >-- Using for private message
959 public static function SearchUser($template)
960 {
961 global $DB;
962 $template = $DB->ForSql(str_replace("*", "%", $template));
963
964 $strSql =
965 "SELECT U.ID, U.NAME, U.LAST_NAME, U.LOGIN, F.SHOW_NAME ".
966 "FROM b_forum_user F LEFT JOIN b_user U ON(F.USER_ID = U.ID)".
967 "WHERE ((F.SHOW_NAME='Y')AND(U.NAME LIKE '".$template."' OR U.LAST_NAME LIKE '".$template."')) OR(( U.LOGIN LIKE '".$template."')AND(F.SHOW_NAME='N'))";
968 $dbRes = $DB->Query($strSql);
969 return $dbRes;
970 }
971
972 public static function UserAddInfo($arOrder = array(), $arFilter = Array(), $mode = false, $iNum = 0, $check_permission = true, $arNavigation = array())
973 {
974 global $DB, $USER;
975
976 $arSqlFrom = array();
977 $arSqlOrder = array();
978 $arSqlSearch = array();
979 $strSqlFrom = "";
980 $strSqlOrder = "";
981 $strSqlSearch = "";
982 $arFilter = (is_array($arFilter) ? $arFilter : array());
983 if (!CForumUser::IsAdmin() && $check_permission)
984 {
985 $arFilter["LID"] = SITE_ID;
986 $arFilter["PERMISSION"] = true;
987 }
988
989 foreach ($arFilter as $key => $val)
990 {
992 $key = mb_strtoupper($key_res["FIELD"]);
993 $strNegative = $key_res["NEGATIVE"];
994 $strOperation = $key_res["OPERATION"];
995 switch ($key)
996 {
997 case "ID":
998 case "AUTHOR_ID":
999 case "FORUM_ID":
1000 case "TOPIC_ID":
1001 if ($strOperation == 'IN'):
1002 $res = (is_array($val) ? $val : explode(",", $val));
1003 $val = array();
1004 foreach ($res as $v)
1005 $val[] = intval($v);
1006 $val = implode(",", $val);
1007 else:
1008 $val = intval($val);
1009 endif;
1010 if ($val <= 0)
1011 $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FM.".$key." IS NULL OR FM.".$key."<=0)";
1012 else
1013 $arSqlSearch[] = ($strNegative=="Y"?" FM.".$key." IS NULL OR NOT ":"")."FM.".$key." ".$strOperation." (".$DB->ForSql($val).")";
1014 break;
1015 case "APPROVED":
1016 if ($val == '')
1017 $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FM.".$key." IS NULL OR ".($DB->type == "MSSQL" ? "LEN" : "LENGTH")."(FM.".$key.")<=0)";
1018 else
1019 $arSqlSearch[] = ($strNegative=="Y"?" FM.".$key." IS NULL OR NOT ":"")."FM.".$key." ".$strOperation." '".$DB->ForSql($val)."'";
1020 break;
1021 case "DATE":
1022 case "POST_DATE":
1023 if ($val == '')
1024 $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."FM.".$key." IS NULL";
1025 else
1026 $arSqlSearch[] = ($strNegative=="Y"?" FM.".$key." IS NULL OR NOT ":"")."FM.".$key." ".$strOperation." ".$DB->CharToDateFunction($DB->ForSql($val), "SHORT");
1027 break;
1028 case "LID":
1029 $arSqlFrom["FS2"] = "LEFT JOIN b_forum2site FS2 ON (FS2.FORUM_ID = FM.FORUM_ID)";
1030 $arSqlSearch[] = ($strNegative=="Y"?" NOT ":"")."(FS2.SITE_ID ".$strOperation." '".$DB->ForSql($val)."')";
1031 break;
1032 case "ACTIVE":
1033 $arSqlFrom["F"] = "INNER JOIN b_forum F ON (F.ID = FM.FORUM_ID)";
1034 if ($val == '')
1035 $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(F.".$key." IS NULL OR ".($DB->type == "MSSQL" ? "LEN" : "LENGTH")."(F.".$key.")<=0)";
1036 else
1037 $arSqlSearch[] = ($strNegative=="Y"?" F.".$key." IS NULL OR NOT ":"")."F.".$key." ".$strOperation." '".$DB->ForSql($val)."'";
1038 break;
1039 case "USER_START_ID":
1040 if (!is_array($val))
1041 $val = array($val);
1042 $tmp = array();
1043 foreach ($val as $k=>$v)
1044 $tmp[] = intval(trim($v));
1045 $val = implode(",", $tmp);
1046 $arSqlFrom["FT"] = "INNER JOIN b_forum_topic FT ON (FT.ID = FM.TOPIC_ID)";
1047 if ($val == '')
1048 $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."FT.".$key." IS NULL OR FT.".$key."<=0";
1049 else
1050 $arSqlSearch[] = ($strNegative=="Y"?" FT.".$key." IS NULL OR NOT ":"")."FT.".$key." ".$strOperation." (".$DB->ForSql($val).")";
1051 break;
1052 case "PERMISSION":
1053 $arSqlFrom["FP"] = "
1054 INNER JOIN (
1055 SELECT FP.FORUM_ID, MAX(FP.PERMISSION) AS PERMISSION
1056 FROM b_forum_perms FP
1057 WHERE FP.GROUP_ID IN (".$DB->ForSql(implode(",", $USER->GetUserGroupArray())).") AND FP.PERMISSION > 'A'
1058 GROUP BY FP.FORUM_ID) FPP ON (FPP.FORUM_ID = FM.FORUM_ID) ";
1059 $arSqlSearch[] = "(FPP.PERMISSION > 'A' AND (FM.APPROVED='Y' OR FPP.PERMISSION >= 'Q'))";
1060 break;
1061 case "TOPIC_TITLE":
1062 case "POST_MESSAGE":
1063 if ($key == "TOPIC_TITLE")
1064 {
1065 $key = "FT.TITLE";
1066 $arSqlFrom["FT"] = "INNER JOIN b_forum_topic FT ON (FT.ID = FM.TOPIC_ID)";
1067 }
1068 else
1069 $key = "FM.POST_MESSAGE";
1070 if ($strOperation == "LIKE")
1071 $val = "%".$val."%";
1072
1073 if ($val == '')
1074 $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(".$key." IS NULL OR ".($DB->type == "MSSQL" ? "LEN" : "LENGTH")."(".$key.")<=0)";
1075 else
1076 $arSqlSearch[] = ($strNegative=="Y"?" ".$key." IS NULL OR NOT ":"")."(".$key." ".$strOperation." '".$DB->ForSQL($val)."')";
1077 break;
1078 }
1079 }
1080 ksort($arSqlFrom);
1081 if (count($arSqlFrom) > 0)
1082 $strSqlFrom = " ".implode(" ", $arSqlFrom);
1083
1084 if (count($arSqlSearch) > 0)
1085 $strSqlSearch = " AND (".implode(") AND (", $arSqlSearch).")";
1086
1087 foreach ($arOrder as $key=>$val)
1088 {
1089 $key = mb_strtoupper($key); $val = (mb_strtoupper($val) != "ASC" ? "DESC" : "ASC");
1090 switch ($key)
1091 {
1092 case "FIRST_POST":
1093 case "LAST_POST":
1094 $arSqlOrder["LAST_POST"] = "FMM.".$key." ".$val;
1095 break;
1096 case "FORUM_ID":
1097 case "TOPIC_ID":
1098 $arSqlOrder["ID"] = " FT.".$key." ".$val;
1099 break;
1100 }
1101 }
1102 if (count($arSqlOrder)>0)
1103 $strSqlOrder = "ORDER BY ".implode(", ", $arSqlOrder);
1104 else
1105 $strSqlOrder = "ORDER BY FMM.FIRST_POST DESC";
1106
1107 // *****************************************************
1108 $strSql = "
1109 SELECT FMM.*, FT.TITLE, FT.DESCRIPTION, FT.VIEWS, FT.LAST_POSTER_ID,
1110 ".CForumNew::Concat("-", array("FT.ID", "FT.TITLE_SEO"))." as TITLE_SEO,
1111 ".$DB->DateToCharFunction("FT.START_DATE", "FULL")." as START_DATE,
1112 FT.USER_START_NAME, FT.USER_START_ID, FT.POSTS, FT.LAST_POSTER_NAME,
1113 FT.LAST_MESSAGE_ID, '' as IMAGE, '' as IMAGE_DESCR,
1114 FT.APPROVED, FT.STATE, FT.FORUM_ID, FT.ICON, FT.SORT, FT.HTML
1115 FROM
1116 (
1117 SELECT FM.TOPIC_ID, COUNT(FM.ID) AS COUNT_MESSAGE, MIN(FM.ID) AS FIRST_POST, MAX(FM.ID) AS LAST_POST
1118 FROM b_forum_message FM
1119 ".$strSqlFrom."
1120 WHERE 1=1
1121 ".$strSqlSearch."
1122 GROUP BY FM.TOPIC_ID
1123 ) FMM
1124 LEFT JOIN b_forum_topic FT ON (FT.ID = FMM.TOPIC_ID)
1125 ".$strSqlOrder;
1126
1127
1128 $cnt = false;
1129 if (! empty($arNavigation))
1130 {
1131 $strCountSql = "
1132 SELECT COUNT( DISTINCT FM.TOPIC_ID ) CNT
1133 FROM b_forum_message FM
1134 ".$strSqlFrom."
1135 WHERE 1=1
1136 ".$strSqlSearch;
1137
1138 $dbCount_res = $DB->Query($strCountSql);
1139 if ($dbCount_res && $arCount = $dbCount_res->Fetch())
1140 {
1141 $cnt = $arCount['CNT'];
1142 }
1143 }
1144
1145 if (empty($arNavigation) || !$cnt)
1146 {
1147 $db_res = $DB->Query($strSql);
1148 }
1149 else
1150 {
1151 if (isset($arNavigation["SIZEN"]) && $arNavigation["SIZEN"])
1152 $arNavigation["nPageSize"] = $arNavigation["SIZEN"];
1153 if (isset($arNavigation["PAGEN"]) && $arNavigation["PAGEN"])
1154 $arNavigation["iNumPage"] = $arNavigation["PAGEN"];
1155 $db_res = new CDBResult();
1156 $db_res->NavQuery($strSql, $cnt, $arNavigation);
1157 }
1158
1159 return new _CTopicDBResult($db_res, $arNavigation);
1160 }
1161 // <-- Using for private message
1162
1163 public static function OnSocNetGroupDelete($group_id)
1164 {
1165 global $DB;
1166 $group_id = intval($group_id);
1167 if ($group_id>0)
1168 {
1169 if(CModule::IncludeModule("socialnetwork"))
1170 {
1171 $dbRes = $DB->Query("select ID from b_forum_topic where SOCNET_GROUP_ID=".$group_id);
1172 while($arRes = $dbRes->Fetch())
1173 {
1175 }
1176
1177 }
1178 }
1179 return true;
1180 }
1181
1182 public static function OnAfterUserUpdate($arFields = array())
1183 {
1184 if ($arFields["RESULT"] &&
1185 array_key_exists("PERSONAL_PHOTO", $arFields) && $arFields["PERSONAL_PHOTO"] > 0 &&
1186 ($user = CForumUser::GetByUSER_ID($arFields["ID"])) && $user &&
1187 ($avatar = CFile::MakeFileArray($arFields["PERSONAL_PHOTO"])) &&
1188 is_array($avatar))
1189 {
1190 self::Update($user["ID"], array( "AVATAR" => $avatar + array("old_file" => $user["AVATAR"])));
1191 }
1192 }
1193}
1194
1195
1196/**********************************************************************/
1197/************** SUBSCRIBE *********************************************/
1198/**********************************************************************/
1200{
1201 //---------------> User insert, update, delete
1202 public static function CanUserAddSubscribe($FID, $arUserGroups)
1203 {
1204 if (CForumNew::GetUserPermission($FID, $arUserGroups)>="E") return True;
1205 return False;
1206 }
1207
1208 public static function CanUserUpdateSubscribe($ID, $arUserGroups, $CurrentUserID = 0)
1209 {
1210 $ID = intval($ID);
1211 $CurrentUserID = intval($CurrentUserID);
1212 if (in_array(1, $arUserGroups)) return True;
1213
1214 $arSubscr = CForumSubscribe::GetByID($ID);
1215 if ($arSubscr && intval($arSubscr["USER_ID"]) == $CurrentUserID) return True;
1216 return False;
1217 }
1218
1219 public static function CanUserDeleteSubscribe($ID, $arUserGroups, $CurrentUserID = 0)
1220 {
1221 $ID = intval($ID);
1222 $CurrentUserID = intval($CurrentUserID);
1223 if (in_array(1, $arUserGroups)) return True;
1224
1225 $arSubscr = CForumSubscribe::GetByID($ID);
1226 if ($arSubscr && intval($arSubscr["USER_ID"]) == $CurrentUserID) return True;
1227 return False;
1228 }
1229
1230 public static function CheckFields($ACTION, &$arFields)
1231 {
1232 if ((is_set($arFields, "USER_ID") || $ACTION=="ADD") && intval($arFields["USER_ID"])<=0) return false;
1233 if ((is_set($arFields, "FORUM_ID") || $ACTION=="ADD") && intval($arFields["FORUM_ID"])<=0) return false;
1234 if ((is_set($arFields, "SITE_ID") || $ACTION=="ADD") && $arFields["SITE_ID"] == '') return false;
1235
1236 if ((is_set($arFields, "TOPIC_ID") || $ACTION=="ADD") && intval($arFields["TOPIC_ID"])<=0) $arFields["TOPIC_ID"] = false;
1237 if ((is_set($arFields, "NEW_TOPIC_ONLY") || $ACTION=="ADD") && ($arFields["NEW_TOPIC_ONLY"]!="Y")) $arFields["NEW_TOPIC_ONLY"] = "N";
1238
1239 if ($arFields["TOPIC_ID"]!==false) $arFields["NEW_TOPIC_ONLY"] = "N";
1240 if ($ACTION=="ADD")
1241 {
1242 $arFilter = array("USER_ID"=>intval($arFields["USER_ID"]), "FORUM_ID"=>intval($arFields["FORUM_ID"]), "TOPIC_ID"=>intval($arFields["TOPIC_ID"]));
1243 if(isset($arFields["SOCNET_GROUP_ID"]) && $arFields["SOCNET_GROUP_ID"])
1244 $arFilter["SOCNET_GROUP_ID"] = $arFields["SOCNET_GROUP_ID"];
1246 if ($res = $db_res->Fetch())
1247 {
1248 return false;
1249 }
1250 }
1251
1252 return True;
1253 }
1254
1255 public static function Add($arFields)
1256 {
1257 global $DB;
1258
1260 return false;
1261
1262 $Fields = array(
1263 "USER_ID" => intval($arFields["USER_ID"]),
1264 "FORUM_ID" => intval($arFields["FORUM_ID"]),
1265 "START_DATE" => $DB->GetNowFunction(),
1266 "NEW_TOPIC_ONLY" => "'".$DB->ForSQL($arFields["NEW_TOPIC_ONLY"], 1)."'",
1267 "SITE_ID" => "'".$DB->ForSQL($arFields["SITE_ID"], 2)."'",
1268 );
1269
1270 if(isset($arFields["SOCNET_GROUP_ID"]) && intval($arFields["SOCNET_GROUP_ID"])>0)
1271 $Fields["SOCNET_GROUP_ID"] = intval($arFields["SOCNET_GROUP_ID"]);
1272
1273 if (intval($arFields["TOPIC_ID"]) > 0)
1274 $Fields["TOPIC_ID"] = intval($arFields["TOPIC_ID"]);
1275
1276 return $DB->Insert("b_forum_subscribe", $Fields, "File: ".__FILE__."<br>Line: ".__LINE__);
1277 }
1278
1279 public static function Update($ID, $arFields)
1280 {
1281 global $DB;
1282 $ID = intval($ID);
1283
1285 return false;
1286
1287 $strUpdate = $DB->PrepareUpdate("b_forum_subscribe", $arFields);
1288 $strSql = "UPDATE b_forum_subscribe SET ".$strUpdate." WHERE ID = ".$ID;
1289 $DB->Query($strSql);
1290
1291 return $ID;
1292 }
1293
1294 public static function Delete($ID)
1295 {
1296 global $DB;
1297 $ID = intval($ID);
1298 return $DB->Query("DELETE FROM b_forum_subscribe WHERE ID = ".$ID, True);
1299 }
1300
1301 public static function DeleteUSERSubscribe($USER_ID)
1302 {
1303 global $DB;
1304 $USER_ID = intval($USER_ID);
1305 return $DB->Query("DELETE FROM b_forum_subscribe WHERE USER_ID = ".$USER_ID);
1306 }
1307
1308 public static function UpdateLastSend($MID, $sIDs)
1309 {
1310 global $DB;
1311 $MID = intval($MID);
1312 $arID = explode(",", $sIDs);
1313 if ($MID <= 0 || empty($sIDs) || (count($arID) == 1 && intval($arID[0]) == 0))
1314 return false;
1315
1316 $arUpdateIDs = array();
1317 foreach ($arID as $sID)
1318 {
1319 $value = intval($sID);
1320 if ($value > 0) $arUpdateIDs[] = $value;
1321 }
1322 if (count($arUpdateIDs) < 1)
1323 return false;
1324
1325 $DB->Query("UPDATE b_forum_subscribe SET LAST_SEND = ".$MID." WHERE ID IN (".implode(',', $arUpdateIDs).")");
1326 }
1327
1328 public static function GetList($arOrder = array("ID"=>"ASC"), $arFilter = array(), $arAddParams = array())
1329 {
1330 global $DB;
1331 $arSqlSearch = Array();
1332 $arFilter = (is_array($arFilter) ? $arFilter : array());
1333 $arAddParams = (is_array($arAddParams) ? $arAddParams : array());
1334
1335 foreach ($arFilter as $key => $val)
1336 {
1338 $key = mb_strtoupper($key_res["FIELD"]);
1339 $strNegative = $key_res["NEGATIVE"];
1340 $strOperation = $key_res["OPERATION"];
1341
1342 switch ($key)
1343 {
1344 case "ID":
1345 case "USER_ID":
1346 case "FORUM_ID":
1347 case "TOPIC_ID":
1348 case "LAST_SEND":
1349 if (intval($val)<=0)
1350 $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FP.".$key." IS NULL OR FP.".$key."<=0)";
1351 else
1352 $arSqlSearch[] = ($strNegative=="Y"?" FP.".$key." IS NULL OR NOT ":"")."(FP.".$key." ".$strOperation." ".intval($val)." )";
1353 break;
1354 case "TOPIC_ID_OR_NULL":
1355 $arSqlSearch[] = "(FP.TOPIC_ID = ".intval($val)." OR FP.TOPIC_ID = 0 OR FP.TOPIC_ID IS NULL)";
1356 break;
1357 case "NEW_TOPIC_ONLY":
1358 if ($val == '')
1359 $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FP.NEW_TOPIC_ONLY IS NULL)";
1360 else
1361 $arSqlSearch[] = ($strNegative=="Y"?" FP.NEW_TOPIC_ONLY IS NULL OR NOT ":"")."(FP.NEW_TOPIC_ONLY ".$strOperation." '".$DB->ForSql($val)."' )";
1362 break;
1363 case "SOCNET_GROUP_ID":
1364 if($val>0)
1365 $arSqlSearch[] = "FP.SOCNET_GROUP_ID=".intval($val);
1366 else
1367 $arSqlSearch[] = "FP.SOCNET_GROUP_ID IS NULL";
1368 break;
1369 case "LAST_SEND_OR_NULL":
1370 $arSqlSearch[] = "(FP.LAST_SEND IS NULL OR FP.LAST_SEND = 0 OR FP.LAST_SEND < ".intval($val).")";
1371 break;
1372 }
1373 }
1374
1375 $strSqlSearch = (empty($arSqlSearch) ? "" : " AND (".implode(") AND (", $arSqlSearch).") ");
1376
1377 $iCnt = 0;
1378 if (is_set($arAddParams, "bDescPageNumbering") || is_set($arAddParams, "nCount"))
1379 {
1380 $strSql = "SELECT COUNT(FP.ID) AS CNT FROM b_forum_subscribe FP WHERE 1 = 1 ".$strSqlSearch;
1381 $db_res = $DB->Query($strSql);
1382 if ($ar_res = $db_res->Fetch())
1383 $iCnt = intval($ar_res["CNT"]);
1384 if (is_set($arAddParams, "nCount"))
1385 return $iCnt;
1386 }
1387
1388 $strSql =
1389 "SELECT FP.ID, FP.USER_ID, FP.FORUM_ID, FP.TOPIC_ID, FP.LAST_SEND, FP.NEW_TOPIC_ONLY, FP.SITE_ID, ".
1390 " ".$DB->DateToCharFunction("FP.START_DATE", "FULL")." as START_DATE ".
1391 "FROM b_forum_subscribe FP ".
1392 "WHERE 1 = 1 ".
1393 " ".$strSqlSearch." ";
1394
1395 $arSqlOrder = Array();
1396 foreach ($arOrder as $by=>$order)
1397 {
1398 $by = mb_strtoupper($by);
1399 $order = mb_strtoupper($order);
1400 if ($order!="ASC") $order = "DESC";
1401
1402 if ($by == "FORUM_ID") $arSqlOrder[] = " FP.FORUM_ID ".$order." ";
1403 elseif ($by == "USER_ID") $arSqlOrder[] = " FP.USER_ID ".$order." ";
1404 elseif ($by == "TOPIC_ID") $arSqlOrder[] = " FP.TOPIC_ID ".$order." ";
1405 elseif ($by == "NEW_TOPIC_ONLY") $arSqlOrder[] = " FP.NEW_TOPIC_ONLY ".$order." ";
1406 elseif ($by == "START_DATE") $arSqlOrder[] = " FP.START_DATE ".$order." ";
1407 else
1408 {
1409 $arSqlOrder[] = " FP.ID ".$order." ";
1410 $by = "ID";
1411 }
1412 }
1413
1414 DelDuplicateSort($arSqlOrder);
1415 $strSqlOrder = (empty($arSqlOrder) ? "" : " ORDER BY ".implode(", ", $arSqlOrder));
1416
1417 $strSql .= $strSqlOrder.(isset($arAddParams["nTopCount"]) ? ($arAddParams["nTopCount"] > 0 ? "\nLIMIT 0,".intval($arAddParams["nTopCount"]) : "") : '');
1418
1419 if (isset($arAddParams["nTopCount"]) && $arAddParams["nTopCount"] <= 0 && is_set($arAddParams, "bDescPageNumbering"))
1420 {
1421 $db_res = new CDBResult();
1422 $db_res->NavQuery($strSql, $iCnt, $arAddParams);
1423 }
1424 else
1425 {
1426 $db_res = $DB->Query($strSql);
1427 }
1428
1429 return $db_res;
1430 }
1431
1432 public static function GetListEx($arOrder = array("ID"=>"ASC"), $arFilter = array())
1433 {
1434 global $DB;
1435 $arSqlSearch = array();
1436 $arSqlFrom = array();
1437 $arSqlGroup = array();
1438 $arSqlSelect = array();
1439 $arSqlOrder = array();
1440 $strSqlSelect = "";
1441 $strSqlSearch = "";
1442 $strSqlFrom = "";
1443 $strSqlGroup = "";
1444 $strSqlOrder = "";
1445 $arSqlSelectConst = array(
1446 "FS.ID" =>"FS.ID",
1447 "FS.USER_ID" => "FS.USER_ID",
1448 "FS.FORUM_ID" => "FS.FORUM_ID",
1449 "FS.TOPIC_ID" => "FS.TOPIC_ID",
1450 "TITLE_SEO" => CForumNew::Concat("-", array("FS.TOPIC_ID", "FT.TITLE_SEO")),
1451 "FS.LAST_SEND" => "FS.LAST_SEND",
1452 "FS.NEW_TOPIC_ONLY" => "FS.NEW_TOPIC_ONLY",
1453 "FS.SITE_ID" => "FS.SITE_ID",
1454 "START_DATE" => $DB->DateToCharFunction("FS.START_DATE", "FULL"),
1455 "U.EMAIL" => "U.EMAIL",
1456 "U.LOGIN" => "U.LOGIN",
1457 "U.NAME" => "U.NAME",
1458 "U.LAST_NAME" =>"U.LAST_NAME",
1459 "FT.TITLE" => "FT.TITLE",
1460 "FORUM_NAME" => "F.NAME"
1461 );
1462 $arFilter = (is_array($arFilter) ? $arFilter : array());
1463
1464 foreach ($arFilter as $key => $val)
1465 {
1467 $key = mb_strtoupper($key_res["FIELD"]);
1468 $strNegative = $key_res["NEGATIVE"];
1469 $strOperation = $key_res["OPERATION"];
1470
1471 switch ($key)
1472 {
1473 case "ID":
1474 case "USER_ID":
1475 case "FORUM_ID":
1476 case "TOPIC_ID":
1477 case "LAST_SEND":
1478 if (intval($val)<=0)
1479 $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FS.".$key." IS NULL OR FS.".$key."<=0)";
1480 else
1481 $arSqlSearch[] = ($strNegative=="Y"?" FS.".$key." IS NULL OR NOT ":"")."(FS.".$key." ".$strOperation." ".intval($val)." )";
1482 break;
1483 case "TOPIC_ID_OR_NULL":
1484 $arSqlSearch[] = "(FS.TOPIC_ID = ".intval($val)." OR FS.TOPIC_ID = 0 OR FS.TOPIC_ID IS NULL)";
1485 break;
1486 case "NEW_TOPIC_ONLY":
1487 if ($val == '')
1488 $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FS.".$key." IS NULL)";
1489 else
1490 $arSqlSearch[] = ($strNegative=="Y"?" FS.".$key." IS NULL OR NOT ":"")."(FS.".$key." ".$strOperation." '".$DB->ForSql($val)."' )";
1491 break;
1492 case "START_DATE":
1493 if($val == '')
1494 $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FS.".$key." IS NULL)";
1495 else
1496 $arSqlSearch[] = ($strNegative=="Y"?" FS.".$key." IS NULL OR NOT ":"")."(FS.".$key." ".$strOperation." ".$DB->CharToDateFunction($DB->ForSql($val), "SHORT").")";
1497 break;
1498 case "LAST_SEND_OR_NULL":
1499 $arSqlSearch[] = "(FS.LAST_SEND IS NULL OR FS.LAST_SEND = 0 OR FS.LAST_SEND < ".intval($val).")";
1500 break;
1501 case "ACTIVE":
1502 if ($val == '')
1503 $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(U.".$key." IS NULL)";
1504 else
1505 $arSqlSearch[] = ($strNegative=="Y"?" U.".$key." IS NULL OR NOT ":"")."(U.".$key." ".$strOperation." '".$DB->ForSql($val)."' )";
1506 break;
1507 case "FORUM":
1508 case "TOPIC":
1509 $key = ($key == "FORUM" ? "F.NAME" : "FT.TITLE");
1510 $arSqlSearch[] = GetFilterQuery($key, $val);
1511 break;
1512 case "SOCNET_GROUP_ID":
1513 if($val>0)
1514 $arSqlSearch[] = "FS.SOCNET_GROUP_ID=".intval($val);
1515 else
1516 $arSqlSearch[] = "FS.SOCNET_GROUP_ID IS NULL";
1517 break;
1518 case "PERMISSION":
1519 if($arFilter["SOCNET_GROUP_ID"]>0)
1520 {
1521 $arSqlSearch[] = "EXISTS(SELECT 'x'
1522 FROM b_sonet_features SF
1523 INNER JOIN b_sonet_features2perms SFP ON SFP.FEATURE_ID = SF.ID AND SFP.OPERATION_ID = 'view'
1524 WHERE SF.ENTITY_TYPE = 'G'
1525 AND SF.ENTITY_ID = FS.SOCNET_GROUP_ID
1526 AND SF.FEATURE = 'forum'
1527 AND SFP.ROLE = 'N' OR EXISTS(SELECT 'x' FROM b_sonet_user2group UG WHERE UG.USER_ID = FS.USER_ID AND ".$DB->IsNull("SFP.ROLE", "'K'")." >= UG.ROLE AND UG.GROUP_ID = FS.SOCNET_GROUP_ID)
1528 ) ";
1529 }
1530 elseif ($val <> '')
1531 {
1532 $arSqlSearch[] = "(
1533 (FP.PERMISSION >= '".$DB->ForSql($val)."') OR
1534 (FP1.PERMISSION >= '".$DB->ForSql($val)."') OR
1535 ((FP.ID IS NULL) AND (UG.GROUP_ID = 1)))";
1536 $arSqlSelect[] = "FU.SUBSC_GROUP_MESSAGE, FU.SUBSC_GET_MY_MESSAGE";
1537 $arSqlFrom[] = "
1538 LEFT JOIN b_forum_user FU ON (U.ID = FU.USER_ID)
1539 LEFT JOIN b_user_group UG ON (U.ID = UG.USER_ID)
1540 LEFT JOIN b_forum_perms FP ON (FP.FORUM_ID = FS.FORUM_ID AND FP.GROUP_ID=UG.GROUP_ID)
1541 LEFT JOIN b_forum_perms FP1 ON (FP1.FORUM_ID = FS.FORUM_ID AND FP1.GROUP_ID=2)";
1542 $arSqlGroup = array_values($arSqlSelectConst);
1543 $arSqlGroup[] = "FU.SUBSC_GROUP_MESSAGE, FU.SUBSC_GET_MY_MESSAGE";
1544 }
1545 break;
1546 }
1547 }
1548
1549 if (count($arSqlSelect) > 0)
1550 $strSqlSelect .= ", ".implode(", ", $arSqlSelect);
1551
1552 if (count($arSqlSearch) > 0)
1553 $strSqlSearch .= " AND (".implode(")
1554 AND
1555 (", $arSqlSearch).") ";
1556
1557 if (count($arSqlFrom)>0)
1558 $strSqlFrom .= " ".implode(" ", $arSqlFrom)." ";
1559
1560 if (count($arSqlGroup)>0)
1561 $strSqlGroup .= " GROUP BY ".implode(", ", $arSqlGroup)." ";
1562
1563 foreach ($arOrder as $by=>$order)
1564 {
1565 $by = mb_strtoupper($by);
1566 $order = mb_strtoupper($order);
1567 if ($order!="ASC") $order = "DESC";
1568
1569 if ($by == "FORUM_ID") $arSqlOrder[] = " FS.FORUM_ID ".$order." ";
1570 elseif ($by == "USER_ID") $arSqlOrder[] = " FS.USER_ID ".$order." ";
1571 elseif ($by == "FORUM_NAME") $arSqlOrder[] = " F.NAME ".$order." ";
1572 elseif ($by == "TOPIC_ID") $arSqlOrder[] = " FS.TOPIC_ID ".$order." ";
1573 elseif ($by == "TITLE") $arSqlOrder[] = " FT.TITLE ".$order." ";
1574 elseif ($by == "START_DATE") $arSqlOrder[] = " FS.START_DATE ".$order." ";
1575 elseif ($by == "NEW_TOPIC_ONLY") $arSqlOrder[] = " FS.NEW_TOPIC_ONLY ".$order." ";
1576 elseif ($by == "LAST_SEND") $arSqlOrder[] = " FS.LAST_SEND ".$order." ";
1577 else
1578 {
1579 $arSqlOrder[] = " FS.ID ".$order." ";
1580 $by = "ID";
1581 }
1582 }
1583 DelDuplicateSort($arSqlOrder);
1584 if (count($arSqlOrder)>0)
1585 $strSqlOrder = " ORDER BY ".implode(", ", $arSqlOrder);
1586
1587 $strSql = "
1588 SELECT FS.ID, FS.USER_ID, FS.FORUM_ID, FS.TOPIC_ID, FS.LAST_SEND, FS.NEW_TOPIC_ONLY, FS.SITE_ID,
1589 ".CForumNew::Concat("-", array("FS.TOPIC_ID", "FT.TITLE_SEO"))." as TITLE_SEO,
1590 ".$DB->DateToCharFunction("FS.START_DATE", "FULL")." as START_DATE,
1591 U.EMAIL, U.LOGIN, U.NAME, U.LAST_NAME, FT.TITLE, F.NAME AS FORUM_NAME".$strSqlSelect."
1592 FROM b_forum_subscribe FS
1593 INNER JOIN b_user U ON (FS.USER_ID = U.ID)
1594 LEFT JOIN b_forum_topic FT ON (FS.TOPIC_ID = FT.ID)
1595 LEFT JOIN b_forum F ON (FS.FORUM_ID = F.ID)
1596 ".$strSqlFrom."
1597 WHERE 1 = 1
1598 ".$strSqlSearch."
1599 ".$strSqlGroup."
1600 ".$strSqlOrder;
1601
1602 $db_res = $DB->Query($strSql);
1603 return $db_res;
1604 }
1605
1606 public static function GetByID($ID)
1607 {
1608 global $DB;
1609 $ID = intval($ID);
1610
1611 $strSql =
1612 "SELECT FP.ID, FP.USER_ID, FP.FORUM_ID, FP.TOPIC_ID, FP.LAST_SEND, FP.NEW_TOPIC_ONLY, FP.SITE_ID, ".
1613 " ".$DB->DateToCharFunction("FP.START_DATE", "FULL")." as START_DATE ".
1614 "FROM b_forum_subscribe FP ".
1615 "WHERE FP.ID = ".$ID."";
1616 $db_res = $DB->Query($strSql);
1617
1618 if ($res = $db_res->Fetch())
1619 {
1620 return $res;
1621 }
1622 return False;
1623 }
1624}
1625
1626/**********************************************************************/
1627/************** RANK **************************************************/
1628/**********************************************************************/
1630{
1631 //---------------> User insert, update, delete
1632 public static function CanUserAddRank($arUserGroups)
1633 {
1634 if (in_array(1, $arUserGroups)) return True;
1635 return False;
1636 }
1637
1638 public static function CanUserUpdateRank($ID, $arUserGroups)
1639 {
1640 if (in_array(1, $arUserGroups)) return True;
1641 return False;
1642 }
1643
1644 public static function CanUserDeleteRank($ID, $arUserGroups)
1645 {
1646 if (in_array(1, $arUserGroups)) return True;
1647 return False;
1648 }
1649
1650 public static function CheckFields($ACTION, &$arFields)
1651 {
1652 if (is_set($arFields, "LANG") || $ACTION=="ADD")
1653 {
1654 foreach ($arFields["LANG"] as $val)
1655 {
1656 if (!is_set($val, "LID") || empty($val["LID"])) return false;
1657 if (!is_set($val, "NAME") || empty($val["NAME"])) return false;
1658 }
1659
1660 $db_lang = CLang::GetList();
1661 while ($arLang = $db_lang->Fetch())
1662 {
1663 $bFound = false;
1664 foreach ($arFields["LANG"] as $val):
1665 $bFound = ($bFound ? $bFound : ($val["LID"] == $arLang["LID"]));
1666 endforeach;
1667 if (!$bFound)
1668 return false;
1669 }
1670 }
1671
1672 return True;
1673 }
1674
1675 // Tekuwie statusy posetitelej srazu ne pereschityvayutsya. Tol'ko postepenno v processe raboty.
1676 public static function Update($ID, $arFields)
1677 {
1678 global $DB;
1679 $ID = intval($ID);
1680 if ($ID <= 0)
1681 return False;
1682
1683 if (!CForumRank::CheckFields("UPDATE", $arFields))
1684 return false;
1685
1686 $strUpdate = $DB->PrepareUpdate("b_forum_rank", $arFields);
1687 $strSql = "UPDATE b_forum_rank SET ".$strUpdate." WHERE ID = ".$ID;
1688 $DB->Query($strSql);
1689
1690 if (is_set($arFields, "LANG"))
1691 {
1692 $DB->Query("DELETE FROM b_forum_rank_lang WHERE RANK_ID = ".$ID);
1693
1694 foreach ($arFields["LANG"] as $i => $val)
1695 {
1696 $arInsert = $DB->PrepareInsert("b_forum_rank_lang", $arFields["LANG"][$i]);
1697 $strSql = "INSERT INTO b_forum_rank_lang(RANK_ID, ".$arInsert[0].") VALUES(".$ID.", ".$arInsert[1].")";
1698 $DB->Query($strSql);
1699 }
1700 }
1701 return $ID;
1702 }
1703
1704 public static function Delete($ID)
1705 {
1706 global $DB;
1707 $ID = intval($ID);
1708
1709 $arUsers = array();
1710 $db_res = CForumUser::GetList(array(), array("RANK_ID"=>$ID));
1711 while ($ar_res = $db_res->Fetch())
1712 {
1713 $arUsers[] = $ar_res["USER_ID"];
1714 }
1715
1716 $DB->Query("DELETE FROM b_forum_rank_lang WHERE RANK_ID = ".$ID, True);
1717 $DB->Query("DELETE FROM b_forum_rank WHERE ID = ".$ID, True);
1718
1719 foreach ($arUsers as $userId)
1721
1722 return true;
1723 }
1724
1725 public static function GetList($arOrder = array("MIN_NUM_POSTS"=>"ASC"), $arFilter = array())
1726 {
1727 global $DB;
1728 $arSqlSearch = array();
1729 $arSqlOrder = array();
1730 $strSqlSearch = "";
1731 $strSqlOrder = "";
1732 $arFilter = (is_array($arFilter) ? $arFilter : array());
1733
1734 foreach ($arFilter as $key => $val)
1735 {
1737 $key = mb_strtoupper($key_res["FIELD"]);
1738 $strNegative = $key_res["NEGATIVE"];
1739 $strOperation = $key_res["OPERATION"];
1740
1741 switch ($key)
1742 {
1743 case "ID":
1744 case "MIN_NUM_POSTS":
1745 if (intval($val)<=0)
1746 $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FR.".$key." IS NULL OR FR.".$key."<=0)";
1747 else
1748 $arSqlSearch[] = ($strNegative=="Y"?" FR.".$key." IS NULL OR NOT ":"")."(FR.".$key." ".$strOperation." ".intval($val)." )";
1749 break;
1750 }
1751 }
1752
1753 if (count($arSqlSearch) > 0)
1754 $strSqlSearch = " AND (".implode(") AND (", $arSqlSearch).") ";
1755
1756 foreach ($arOrder as $by=>$order)
1757 {
1758 $by = mb_strtoupper($by);
1759 $order = mb_strtoupper($order);
1760 if ($order!="ASC") $order = "DESC";
1761
1762 if ($by == "ID") $arSqlOrder[] = " FR.ID ".$order." ";
1763 else
1764 {
1765 $arSqlOrder[] = " FR.MIN_NUM_POSTS ".$order." ";
1766 $by = "MIN_NUM_POSTS";
1767 }
1768 }
1769 DelDuplicateSort($arSqlOrder);
1770 if (count($arSqlOrder) > 0)
1771 $strSqlOrder = " ORDER BY ".implode(", ", $arSqlOrder);
1772
1773 $strSql =
1774 "SELECT FR.ID, FR.MIN_NUM_POSTS
1775 FROM b_forum_rank FR
1776 WHERE 1 = 1
1777 ".$strSqlSearch."
1778 ".$strSqlOrder;
1779
1780 $db_res = $DB->Query($strSql);
1781 return $db_res;
1782 }
1783
1784 public static function GetListEx($arOrder = array("MIN_NUM_POSTS"=>"ASC"), $arFilter = array())
1785 {
1786 global $DB;
1787 $arSqlSearch = array();
1788 $arSqlOrder = array();
1789 $strSqlSearch = "";
1790 $strSqlOrder = "";
1791 $arFilter = (is_array($arFilter) ? $arFilter : array());
1792
1793 foreach ($arFilter as $key => $val)
1794 {
1796 $key = mb_strtoupper($key_res["FIELD"]);
1797 $strNegative = $key_res["NEGATIVE"];
1798 $strOperation = $key_res["OPERATION"];
1799
1800 switch ($key)
1801 {
1802 case "ID":
1803 case "MIN_NUM_POSTS":
1804 if (intval($val)<=0)
1805 $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FR.".$key." IS NULL OR FR.".$key."<=0)";
1806 else
1807 $arSqlSearch[] = ($strNegative=="Y"?" FR.".$key." IS NULL OR NOT ":"")."(FR.".$key." ".$strOperation." ".intval($val)." )";
1808 break;
1809 case "LID":
1810 if ($val == '')
1811 $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FRL.LID IS NULL OR ".($DB->type == "MSSQL" ? "LEN" : "LENGTH")."(FRL.LID)<=0)";
1812 else
1813 $arSqlSearch[] = ($strNegative=="Y"?" FRL.LID IS NULL OR NOT ":"")."(FRL.LID ".$strOperation." '".$DB->ForSql($val)."' )";
1814 break;
1815 }
1816 }
1817 if (count($arSqlSearch) > 0)
1818 $strSqlSearch = " AND (".imlode(" ) AND (", $arSqlSearch).") ";
1819
1820 foreach ($arOrder as $by=>$order)
1821 {
1822 $by = mb_strtoupper($by);
1823 $order = mb_strtoupper($order);
1824 if ($order!="ASC") $order = "DESC";
1825
1826 if ($by == "ID") $arSqlOrder[] = " FR.ID ".$order." ";
1827 elseif ($by == "LID") $arSqlOrder[] = " FRL.LID ".$order." ";
1828 elseif ($by == "NAME") $arSqlOrder[] = " FRL.NAME ".$order." ";
1829 else
1830 {
1831 $arSqlOrder[] = " FR.MIN_NUM_POSTS ".$order." ";
1832 $by = "MIN_NUM_POSTS";
1833 }
1834 }
1835 DelDuplicateSort($arSqlOrder);
1836 if (count($arSqlOrder) > 0)
1837 $strSqlOrder = " ORDER BY ".implode(", ", $arSqlOrder);
1838
1839 $strSql = "
1840 SELECT FR.ID, FR.MIN_NUM_POSTS, FRL.LID, FRL.NAME
1841 FROM b_forum_rank FR
1842 LEFT JOIN b_forum_rank_lang FRL ON FR.ID = FRL.RANK_ID
1843 WHERE 1 = 1
1844 ".$strSqlSearch."
1845 ".$strSqlOrder;
1846
1847 $db_res = $DB->Query($strSql);
1848 return $db_res;
1849 }
1850
1851 public static function GetByID($ID)
1852 {
1853 global $DB;
1854
1855 $ID = intval($ID);
1856 $strSql =
1857 "SELECT FR.ID, FR.MIN_NUM_POSTS ".
1858 "FROM b_forum_rank FR ".
1859 "WHERE FR.ID = ".$ID."";
1860 $db_res = $DB->Query($strSql);
1861
1862 if ($res = $db_res->Fetch())
1863 {
1864 return $res;
1865 }
1866 return False;
1867 }
1868
1869 public static function GetByIDEx($ID, $strLang)
1870 {
1871 global $DB;
1872
1873 $ID = intval($ID);
1874 $strSql =
1875 "SELECT FR.ID, FRL.LID, FRL.NAME, FR.MIN_NUM_POSTS ".
1876 "FROM b_forum_rank FR ".
1877 " LEFT JOIN b_forum_rank_lang FRL ON (FR.ID = FRL.RANK_ID AND FRL.LID = '".$DB->ForSql($strLang)."') ".
1878 "WHERE FR.ID = ".$ID."";
1879 $db_res = $DB->Query($strSql);
1880
1881 if ($res = $db_res->Fetch())
1882 {
1883 return $res;
1884 }
1885 return False;
1886 }
1887
1888 public static function GetLangByID($RANK_ID, $strLang)
1889 {
1890 global $DB;
1891
1892 $RANK_ID = intval($RANK_ID);
1893 $strSql =
1894 "SELECT FRL.ID, FRL.RANK_ID, FRL.LID, FRL.NAME ".
1895 "FROM b_forum_rank_lang FRL ".
1896 "WHERE FRL.RANK_ID = ".$RANK_ID." ".
1897 " AND FRL.LID = '".$DB->ForSql($strLang)."' ";
1898 $db_res = $DB->Query($strSql);
1899
1900 if ($res = $db_res->Fetch())
1901 {
1902 return $res;
1903 }
1904 return False;
1905 }
1906}
1907
1909{
1910
1917 public static function RegisterUSER_OLD($arFields = array())
1918 {
1919 global $DB, $USER;
1920 $tmp = "";
1921 if ($_SESSION["FORUM"]["SHOW_NAME"] == "Y" && trim($USER->GetFormattedName(false)) <> '')
1922 $tmp = $USER->GetFormattedName(false);
1923 else
1924 $tmp = $USER->GetLogin();
1925
1926
1927 $session_id = \Bitrix\Main\Application::getInstance()->getKernelSession()->getId();
1928 $session_id = "'".$DB->ForSQL($session_id, 255)."'";
1929 $Fields = array(
1930 "FS.USER_ID" => intval($USER->GetID()),
1931 "FS.IP_ADDRESS" => "'".$DB->ForSql($_SERVER["REMOTE_ADDR"],15)."'",
1932 "FS.SHOW_NAME" => "'".$DB->ForSQL($tmp, 255)."'",
1933 "FS.LAST_VISIT" => $DB->GetNowFunction(),
1934 "FS.FORUM_ID" => intval($arFields["FORUM_ID"]),
1935 "FS.TOPIC_ID" => intval($arFields["TOPIC_ID"])
1936 );
1937 $FieldsForInsert = array(
1938 "USER_ID" => $Fields["FS.USER_ID"],
1939 "IP_ADDRESS" => $Fields["FS.IP_ADDRESS"],
1940 "SHOW_NAME" => $Fields["FS.SHOW_NAME"],
1941 "LAST_VISIT" => $Fields["FS.LAST_VISIT"],
1942 "FORUM_ID" => $Fields["FS.FORUM_ID"],
1943 "TOPIC_ID" => $Fields["FS.TOPIC_ID"],
1944 "PHPSESSID" => $session_id
1945 );
1946
1947
1948 if (intval($USER->GetID()) > 0)
1949 {
1950 $FieldsForUpdate = $Fields;
1951 $FieldsForUpdate["FU.LAST_VISIT"] = $DB->GetNowFunction();
1952 $rows = $DB->Update(
1953 "b_forum_user FU, b_forum_stat FS",
1954 $FieldsForUpdate,
1955 "WHERE (FU.USER_ID=".$Fields["FS.USER_ID"].") AND (FS.PHPSESSID=".$session_id.")",
1956 "File: ".__FILE__."<br>Line: ".__LINE__,
1957 false);
1958
1959 if (intval($rows) < 2)
1960 {
1961 if (intval($rows)<=0)
1962 {
1963 $rows = $DB->Update(
1964 "b_forum_user",
1965 array("USER_ID" => $Fields["FS.USER_ID"]),
1966 "WHERE (USER_ID=".$Fields["FS.USER_ID"].")",
1967 "File: ".__FILE__."<br>Line: ".__LINE__,
1968 false);
1969 if (intval($rows) <= 0)
1970 {
1971 $ID = CForumUser::Add(array("USER_ID" => $Fields["FS.USER_ID"]));
1972 }
1973
1974 $rows = $DB->Update(
1975 "b_forum_stat",
1976 array(
1977 "USER_ID" => $Fields["FS.USER_ID"],
1978 "IP_ADDRESS" => $Fields["FS.IP_ADDRESS"],
1979 "SHOW_NAME" => $Fields["FS.SHOW_NAME"],
1980 "LAST_VISIT" => $Fields["FS.LAST_VISIT"],
1981 "FORUM_ID" => $Fields["FS.FORUM_ID"],
1982 "TOPIC_ID" => $Fields["FS.TOPIC_ID"],
1983 ),
1984 "WHERE (PHPSESSID=".$session_id.")",
1985 "File: ".__FILE__."<br>Line: ".__LINE__,
1986 false);
1987 if (intval($rows) <= 0)
1988 {
1989 $DB->Insert("b_forum_stat", $FieldsForInsert, "File: ".__FILE__."<br>Line: ".__LINE__);
1990 }
1991 }
1992 }
1993 }
1994 else
1995 {
1996 $rows = $DB->Update(
1997 "b_forum_stat",
1998 array(
1999 "USER_ID" => $Fields["FS.USER_ID"],
2000 "IP_ADDRESS" => $Fields["FS.IP_ADDRESS"],
2001 "SHOW_NAME" => $Fields["FS.SHOW_NAME"],
2002 "LAST_VISIT" => $Fields["FS.LAST_VISIT"],
2003 "FORUM_ID" => $Fields["FS.FORUM_ID"],
2004 "TOPIC_ID" => $Fields["FS.TOPIC_ID"],
2005 ),
2006 "WHERE (PHPSESSID=".$session_id.")", "File: ".__FILE__."<br>Line: ".__LINE__);
2007
2008 if (intval($rows)<=0)
2009 {
2010 $DB->Insert("b_forum_stat", $FieldsForInsert, "File: ".__FILE__."<br>Line: ".__LINE__);
2011 }
2012 }
2013 return true;
2014 }
2015
2016 public static function RegisterUSER($arFields = array())
2017 {
2018 global $DB, $USER;
2019 $tmp = ($_SESSION["FORUM"]["SHOW_NAME"] == "Y" && trim($USER->GetFullName()) <> '' ?
2020 trim($USER->GetFullName()) : $USER->GetLogin());
2021 if (method_exists(\Bitrix\Main\Application::getInstance(), "getKernelSession"))
2022 {
2023 $session_id = \Bitrix\Main\Application::getInstance()->getKernelSession()->getId();
2024 }
2025 else
2026 {
2027 $session_id = bitrix_sessid();
2028 }
2029
2030 $session_id = "'".$DB->ForSQL($session_id, 255)."'";
2031
2032 $Fields = array(
2033 "USER_ID" => intval($USER->GetID()),
2034 "IP_ADDRESS" => "'".$DB->ForSql($_SERVER["REMOTE_ADDR"], 15)."'",
2035 "SHOW_NAME" => "'".$DB->ForSQL($tmp, 255)."'",
2036 "LAST_VISIT" => $DB->GetNowFunction(),
2037 "SITE_ID" => "'".$DB->ForSQL($arFields["SITE_ID"], 2)."'",
2038 "FORUM_ID" => intval($arFields["FORUM_ID"]),
2039 "TOPIC_ID" => intval($arFields["TOPIC_ID"]));
2040 $rows = $DB->Update("b_forum_stat", $Fields, "WHERE PHPSESSID=".$session_id."", "File: ".__FILE__."<br>Line: ".__LINE__);
2041 if (intval($rows)<=0)
2042 {
2043 $Fields = array(
2044 "USER_ID" => intval($USER->GetID()),
2045 "IP_ADDRESS" => "'".$DB->ForSql($_SERVER["REMOTE_ADDR"], 15)."'",
2046 "SHOW_NAME" => "'".$DB->ForSQL($tmp, 255)."'",
2047 "PHPSESSID" => $session_id,
2048 "LAST_VISIT" => $DB->GetNowFunction(),
2049 "SITE_ID" => "'".$DB->ForSQL($arFields["SITE_ID"], 2)."'",
2050 "FORUM_ID" => intval($arFields["FORUM_ID"]),
2051 "TOPIC_ID" => intval($arFields["TOPIC_ID"]));
2052 return $DB->Insert("b_forum_stat", $Fields, "File: ".__FILE__."<br>Line: ".__LINE__);
2053 }
2054 return true;
2055 }
2056
2057 public static function Add($arFields)
2058 {
2059 global $DB, $USER;
2060 $session_id = \Bitrix\Main\Application::getInstance()->getKernelSession()->getId();
2061 $Fields = array(
2062 "USER_ID" => $USER->GetID(),
2063 "IP_ADDRESS" => "'".$DB->ForSql($_SERVER["REMOTE_ADDR"],15)."'",
2064 "PHPSESSID" => "'".$DB->ForSQL($session_id, 255) . "'",
2065 "LAST_VISIT" => "'".$DB->GetNowFunction()."'",
2066 "FORUM_ID" => intval($arFields["FORUM_ID"]),
2067 "TOPIC_ID" => intval($arFields["TOPIC_ID"]));
2068
2069 return $DB->Insert("b_forum_stat", $Fields, "File: ".__FILE__."<br>Line: ".__LINE__);
2070 }
2071
2072 public static function GetListEx($arOrder = Array("ID"=>"ASC"), $arFilter = Array())
2073 {
2074 global $DB;
2075 $arSqlSearch = array();
2076 $arSqlSelect = array();
2077 $arSqlFrom = array();
2078 $arSqlGroup = array();
2079 $arSqlOrder = array();
2080 $arSql = array();
2081 $strSqlSearch = "";
2082 $strSqlSelect = "";
2083 $strSqlFrom = "";
2084 $strSqlGroup = "";
2085 $strSqlOrder = "";
2086 $strSql = "";
2087
2088 $arSqlSelectConst = array(
2089 "FSTAT.USER_ID" => "FSTAT.USER_ID",
2090 "FSTAT.IPADDRES" => "FSTAT.IPADDRES",
2091 "FSTAT.PHPSESSID" => "FSTAT.PHPSESSID",
2092 "LAST_VISIT" => $DB->DateToCharFunction("FSTAT.LAST_VISIT", "FULL"),
2093 "FSTAT.FORUM_ID" => "FSTAT.FORUM_ID",
2094 "FSTAT.TOPIC_ID" => "FSTAT.TOPIC_ID"
2095 );
2096 $arSqlSelect = $arSqlSelectConst;
2097 $arFilter = (is_array($arFilter) ? $arFilter : array());
2098
2099 foreach ($arFilter as $key => $val)
2100 {
2102 $key = mb_strtoupper($key_res["FIELD"]);
2103 $strNegative = $key_res["NEGATIVE"];
2104 $strOperation = $key_res["OPERATION"];
2105
2106 switch ($key)
2107 {
2108 case "TOPIC_ID":
2109 case "FORUM_ID":
2110 case "USER_ID":
2111 if (intval($val)<=0)
2112 $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FSTAT.".$key." IS NULL OR FSTAT.".$key."<=0)";
2113 else
2114 $arSqlSearch[] = ($strNegative=="Y"?" FSTAT.".$key." IS NULL OR NOT ":"")."(FSTAT.".$key." ".$strOperation." ".intval($val)." )";
2115 break;
2116 case "LAST_VISIT":
2117 if($val == '')
2118 $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FSTAT.".$key." IS NULL)";
2119 else
2120 $arSqlSearch[] = ($strNegative=="Y"?" FSTAT.".$key." IS NULL OR NOT ":"")."(FSTAT.".$key." ".$strOperation." ".$DB->CharToDateFunction($DB->ForSql($val), "FULL").")";
2121 break;
2122 case "HIDE_FROM_ONLINE":
2123 $arSqlFrom["FU"] = "LEFT JOIN b_forum_user FU ON FSTAT.USER_ID=FU.USER_ID";
2124 if ($val == '')
2125 $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FU.".$key." IS NULL OR ".($DB->type == "MSSQL" ? "LEN" : "LENGTH")."(FU.".$key.")<=0)";
2126 else
2127 $arSqlSearch[] = ($strNegative=="Y"?" FU.".$key." IS NULL OR NOT ":"")."(FU.".$key." ".$strOperation." '".$DB->ForSql($val)."' )";
2128 break;
2129 break;
2130 case "COUNT_GUEST":
2131 $arSqlSelect = array(
2132 "FSTAT.USER_ID" => "FSTAT.USER_ID",
2133 "FSTAT.SHOW_NAME" => "FSTAT.SHOW_NAME",
2134 "COUNT_USER" => "COUNT(FSTAT.PHPSESSID) AS COUNT_USER",
2135 );
2136 $arSqlGroup["FSTAT.USER_ID"] = "FSTAT.USER_ID";
2137 $arSqlGroup["FSTAT.SHOW_NAME"] = "FSTAT.SHOW_NAME";
2138 break;
2139 }
2140 }
2141 if (count($arSqlSearch) > 0)
2142 $strSqlSearch = " AND (".implode(") AND (", $arSqlSearch).") ";
2143 if (count($arSqlSelect) > 0)
2144 $strSqlSelect = implode(", ", $arSqlSelect);
2145 if (count($arSqlFrom) > 0)
2146 $strSqlFrom = implode(" ", $arSqlFrom);
2147 if (count($arSqlGroup) > 0)
2148 $strSqlGroup = " GROUP BY ".implode(", ", $arSqlGroup);
2149
2150
2151 foreach ($arOrder as $by=>$order)
2152 {
2153 $by = mb_strtoupper($by);
2154 $order = mb_strtoupper($order);
2155 $order = $order!="ASC" ? $order = "DESC" : "ASC";
2156
2157 if ($by == "USER_ID") $arSqlOrder[] = " FSTAT.USER_ID ".$order." ";
2158 }
2159
2160 DelDuplicateSort($arSqlOrder);
2161 if (count($arSqlOrder) > 0)
2162 $strSqlOrder = " ORDER BY ".implode(", ", $arSqlOrder);
2163
2164 $strSql = " SELECT ".$strSqlSelect."
2165 FROM b_forum_stat FSTAT
2166 ".$strSqlFrom."
2167 WHERE 1=1
2168 ".$strSqlSearch."
2169 ".$strSqlGroup."
2170 ".$strSqlOrder;
2171
2172 $db_res = $DB->Query($strSql);
2173 return $db_res;
2174 }
2175
2176 public static function CleanUp()
2177 {
2179 $helper = $connection->getSqlHelper();
2180 $connection->query(
2181 "DELETE FROM b_forum_stat WHERE LAST_VISIT < " . $helper->addDaysToDateTime(-1)
2182 );
2183 return "CForumStat::CleanUp();";
2184 }
2185}
$connection
Определения actionsdefinitions.php:38
$db_res
Определения options_user_settings.php:8
$ar_res
Определения options_user_settings_set.php:16
$arResult
Определения generate_coupon.php:16
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
Определения check_mail.php:18
Определения topic.php:950
static update(int $id, array &$data)
Определения user.php:1072
static getInstance()
Определения application.php:98
static getConnection($name="")
Определения application.php:638
Определения user.php:48
Определения user.php:1909
static GetListEx($arOrder=Array("ID"=>"ASC"), $arFilter=Array())
Определения user.php:2072
static RegisterUSER_OLD($arFields=array())
Определения user.php:1917
static Add($arFields)
Определения user.php:2057
static RegisterUSER($arFields=array())
Определения user.php:2016
static CleanUp()
Определения user.php:2176
static GetByID($ID, $arAddParams=array())
Определения message.php:591
static GetFilterOperation($key)
Определения forum_new.php:582
static GetUserPermission($ID, $arUserGroups)
Определения forum_new.php:564
static GetList($arOrder=array("MIN_NUM_POSTS"=>"ASC"), $arFilter=array())
Определения points.php:455
static GetListEx($arOrder=array("MIN_POINTS"=>"ASC"), $arFilter=array())
Определения points.php:216
static GetList($arOrder=array("MIN_POINTS"=>"ASC"), $arFilter=array())
Определения points.php:151
Определения user.php:1630
static GetLangByID($RANK_ID, $strLang)
Определения user.php:1888
static Delete($ID)
Определения user.php:1704
static GetListEx($arOrder=array("MIN_NUM_POSTS"=>"ASC"), $arFilter=array())
Определения user.php:1784
static GetList($arOrder=array("MIN_NUM_POSTS"=>"ASC"), $arFilter=array())
Определения user.php:1725
static CanUserDeleteRank($ID, $arUserGroups)
Определения user.php:1644
static GetByID($ID)
Определения user.php:1851
static CanUserAddRank($arUserGroups)
Определения user.php:1632
static CheckFields($ACTION, &$arFields)
Определения user.php:1650
static CanUserUpdateRank($ID, $arUserGroups)
Определения user.php:1638
static GetByIDEx($ID, $strLang)
Определения user.php:1869
static Update($ID, $arFields)
Определения user.php:1676
Определения user.php:1200
static UpdateLastSend($MID, $sIDs)
Определения user.php:1308
static CanUserAddSubscribe($FID, $arUserGroups)
Определения user.php:1202
static Delete($ID)
Определения user.php:1294
static Add($arFields)
Определения user.php:1255
static GetByID($ID)
Определения user.php:1606
static CanUserDeleteSubscribe($ID, $arUserGroups, $CurrentUserID=0)
Определения user.php:1219
static GetListEx($arOrder=array("ID"=>"ASC"), $arFilter=array())
Определения user.php:1432
static GetList($arOrder=array("ID"=>"ASC"), $arFilter=array(), $arAddParams=array())
Определения user.php:1328
static CheckFields($ACTION, &$arFields)
Определения user.php:1230
static DeleteUSERSubscribe($USER_ID)
Определения user.php:1301
static CanUserUpdateSubscribe($ID, $arUserGroups, $CurrentUserID=0)
Определения user.php:1208
static Update($ID, $arFields)
Определения user.php:1279
static Delete($ID)
Определения topic.php:413
Определения user.php:10
static CountUserPoints($USER_ID=0, $iCnt=false)
Определения user.php:806
static GetByLogin($Name)
Определения user.php:434
static GetUserRank($USER_ID, $strLang=false)
Определения user.php:595
static GetUserTopicVisits($forumID, $arTopic, $userID=null)
Определения user.php:42
static IsAdmin($userId=false, $arGroups=false)
Определения user.php:11
static Delete($ID)
Определения user.php:359
static GetUserPoints($USER_ID, $arAddParams=array())
Определения user.php:766
static GetByID($ID)
Определения user.php:404
static IsLocked($userID)
Определения user.php:82
static CheckFields($ACTION, &$arFields, $ID=false)
Определения user.php:141
static GetListUserForumLastVisit($arOrder=Array("LAST_VISIT"=>"DESC"), $arFilter=Array())
Определения user.php:668
static OnUserDelete($user_id)
Определения user.php:917
static OnSocNetGroupDelete($group_id)
Определения user.php:1163
static CanUserDeleteUser($ID, $arUserGroups)
Определения user.php:134
static GetByIDEx($ID, $arAddParams=array())
Определения user.php:478
static SearchUser($template)
Определения user.php:959
static CanUserAddUser($arUserGroups)
Определения user.php:119
static SetStat($userId=0, $params=[])
Определения user.php:830
static GetByUSER_ID($USER_ID)
Определения user.php:517
static OnAfterUserUpdate($arFields=array())
Определения user.php:1182
static CountUsers($bActive=False, $arFilter=array())
Определения user.php:367
static Add($fields, $strUploadDir=false)
Определения user.php:269
static CanUserUpdateUser($ID, $arUserGroups, $CurrentUserID=0)
Определения user.php:124
static GetByUSER_IDEx($USER_ID, $arAddParams=array())
Определения user.php:548
static UserAddInfo($arOrder=array(), $arFilter=Array(), $mode=false, $iNum=0, $check_permission=true, $arNavigation=array())
Определения user.php:972
static Update($ID, $arFields, $strUploadDir=false, $UpdateByUserId=false)
Определения user.php:297
static SetUserForumLastVisit($USER_ID, $FORUM_ID=0, $LAST_VISIT=false)
Определения user.php:623
static GetFormattedNameByUserID($userID, $template="", $arUser=array())
Определения user.php:737
static CountSumPoints($TO_USER_ID)
Определения points.php:720
Определения dbresult.php:88
static GetList($arOrder=Array("ID"=>"ASC"), $arFilter=Array(), $bCount=false, $iNum=0, $arAddParams=array())
Определения message.php:193
static Concat($glue="", $pieces=array())
Определения forum_new.php:247
static GetList($arOrder=Array("ID"=>"ASC"), $arFilter=Array(), $arAddParams=array())
Определения user.php:6
static GetAuthorityRating()
Определения ratings.php:1475
static GetRatingResult($ID, $entityId)
Определения ratings.php:729
global $CACHE_MANAGER
Определения clear_component_cache.php:7
if(!is_array($prop["VALUES"])) $tmp
Определения component_props.php:203
$arFields
Определения dblapprove.php:5
$data['IS_AVAILABLE']
Определения .description.php:13
$template
Определения file_edit.php:49
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$arGroups
Определения options.php:1766
$res
Определения filter_act.php:7
GetFilterQuery($field, $val, $procent="Y", $ex_sep=array(), $clob="N", $div_fields="Y", $clob_upper="N")
Определения filter_tools.php:383
$zr
Определения options.php:5
$result
Определения get_property_values.php:14
$bFound
Определения get_search.php:40
if($ajaxMode) $ID
Определения get_user.php:27
$entity
$_SERVER["DOCUMENT_ROOT"]
Определения cron_frame.php:9
global $DB
Определения cron_frame.php:29
global $USER
Определения csv_new_run.php:40
$ACTION
Определения csv_new_setup.php:27
endif
Определения csv_new_setup.php:990
$z
Определения options.php:31
bitrix_sessid()
Определения tools.php:4656
DelDuplicateSort(&$arSort)
Определения tools.php:2055
htmlspecialcharsbx($string, $flags=ENT_COMPAT, $doubleEncode=true)
Определения tools.php:2701
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
Определения tools.php:3778
is_set($a, $k=false)
Определения tools.php:2133
GetMessage($name, $aReplace=null)
Определения tools.php:3397
$order
Определения payment.php:8
return false
Определения prolog_main_admin.php:185
global_menu_<?echo $menu["menu_id"]?> adm main menu item icon adm main menu item text text adm main menu hover adm submenu menucontainer menu_id menu_id items_id items_id desktop menu_id block none adm global submenu<?=($subMenuDisplay=="block" ? " adm-global-submenu-active" :"")?> global_submenu_<?echo $menu["menu_id"]?> text MAIN_PR_ADMIN_FAV items adm submenu items wrap adm submenu items stretch wrap BX adminMenu itemsStretchScroll()"> <table class if (!empty( $menu["items"])) elseif ( $menu[ 'menu_id']=='desktop') if ( $menu[ 'menu_id']=='desktop') endforeach
Определения prolog_main_admin.php:255
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
if(empty($signedUserToken)) $key
Определения quickway.php:257
$i
Определения factura.php:643
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
Определения waybill.php:936
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
Определения template.php:799
$val
Определения options.php:1793
$matches
Определения index.php:22
$arRes
Определения options.php:104
const SITE_ID
Определения sonet_set_content_view.php:12
$rows
Определения options.php:264
$k
Определения template_pdf.php:567
$GLOBALS['_____370096793']
Определения update_client.php:1
$arFilter
Определения user_search.php:106
$dbRes
Определения yandex_detail.php:168
$fields
Определения yandex_run.php:501