1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
forum_new.php
См. документацию.
1<?php
2##############################################
3# Bitrix Site Manager Forum #
4# Copyright (c) 2002-2009 Bitrix #
5# https://www.bitrixsoft.com #
6# mailto:admin@bitrixsoft.com #
7##############################################
8use \Bitrix\Main;
9use \Bitrix\Forum;
10IncludeModuleLangFile(__FILE__);
11/**********************************************************************/
12/************** FORUM *************************************************/
13/**********************************************************************/
15{
16 //---------------> Forum insert, update, delete
17 public static function CanUserViewForum($FID, $arUserGroups, $ExternalPermission = false)
18 {
19 $FID = intval($FID);
20 $arUserGroups = (!is_array($arUserGroups) ? array($arUserGroups) : $arUserGroups);
21 if ($ExternalPermission === false && CForumUser::IsAdmin($arUserGroups)):
22 return true;
23 endif;
24 $strPerms = ($ExternalPermission == false ? CForumNew::GetUserPermission($FID, $arUserGroups) : $ExternalPermission);
25 if ($strPerms >= "Y")
26 return true;
27 $arForum = CForumNew::GetByID($FID);
28 if (!is_array($arForum) || $arForum["ACTIVE"] != "Y"):
29 return false;
30 endif;
31 return ($strPerms < "E" ? false : true);
32 }
33
34 public static function CanUserAddForum($arUserGroups, $iUserID = 0)
35 {
36 $arUserGroups = (!is_array($arUserGroups) ? array($arUserGroups) : $arUserGroups);
37 return CForumUser::IsAdmin($arUserGroups);
38 }
39
40 public static function CanUserUpdateForum($FID, $arUserGroups, $iUserID = 0, $ExternalPermission = false)
41 {
42 $FID = intval($FID);
43 if ($ExternalPermission === false && CForumUser::IsAdmin($arUserGroups)):
44 return true;
45 elseif (!CForumUser::IsLocked($iUserID)):
46 $strPerms = ($ExternalPermission == false ? CForumNew::GetUserPermission($FID, $arUserGroups) : $ExternalPermission);
47 else:
48 $strPerms = CForumNew::GetPermissionUserDefault($FID, $arUserGroups);
49 endif;
50 return ($strPerms < "Y" ? false : true);
51 }
52
53 public static function CanUserDeleteForum($FID, $arUserGroups, $iUserID = 0, $ExternalPermission = false)
54 {
55 $FID = intval($FID);
56 $arUserGroups = (!is_array($arUserGroups) ? array($arUserGroups) : $arUserGroups);
57 if ($ExternalPermission === false && CForumUser::IsAdmin($arUserGroups)):
58 return true;
59 elseif (!CForumUser::IsLocked($iUserID)):
60 $strPerms = ($ExternalPermission == false ? CForumNew::GetUserPermission($FID, $arUserGroups) : $ExternalPermission);
61 else:
63 endif;
64 return ($strPerms < "Y" ? false : true);
65 }
66
67 public static function CanUserModerateForum($FID, $arUserGroups, $iUserID = 0, $ExternalPermission = false)
68 {
69 $FID = intval($FID);
70 $arUserGroups = (!is_array($arUserGroups) ? array($arUserGroups) : $arUserGroups);
71 if ($ExternalPermission === false && CForumUser::IsAdmin($arUserGroups)):
72 return true;
73 elseif (!CForumUser::IsLocked($iUserID)):
74 $strPerms = ($ExternalPermission == false ? CForumNew::GetUserPermission($FID, $arUserGroups) : $ExternalPermission);
75 else:
77 endif;
78
79 if ($strPerms >= "Y"):
80 return true;
81 endif;
82 $arForum = CForumNew::GetByID($FID);
83 if (!is_array($arForum) || $arForum["ACTIVE"] != "Y"):
84 return false;
85 endif;
86 return ($strPerms < "Q" ? false : true);
87 }
88
89 public static function CanUserEditForum($FID, $arUserGroups, $iUserID = 0, $ExternalPermission = false)
90 {
91 $FID = intval($FID);
92 $arUserGroups = (!is_array($arUserGroups) ? array($arUserGroups) : $arUserGroups);
93 if ($ExternalPermission === false && CForumUser::IsAdmin($arUserGroups)):
94 return true;
95 elseif (!CForumUser::IsLocked($iUserID)):
96 $strPerms = ($ExternalPermission == false ? CForumNew::GetUserPermission($FID, $arUserGroups) : $ExternalPermission);
97 else:
99 endif;
100 if ($strPerms >= "Y"):
101 return true;
102 endif;
103 $arForum = CForumNew::GetByID($FID);
104 if (!is_array($arForum) || $arForum["ACTIVE"] != "Y"):
105 return false;
106 endif;
107 return ($strPerms < "U" ? false : true);
108 }
109
110 public static function CheckFields($ACTION, &$arFields)
111 {
112 $aMsg = array();
113 if (is_set($arFields, "NAME") || $ACTION == "ADD")
114 {
115 $arFields["NAME"] = trim($arFields["NAME"]);
116 if (empty($arFields["NAME"]))
117 $aMsg[] = array(
118 "id" => "NAME",
119 "text" => GetMessage("F_ERROR_EMPTY_NAME"));
120 }
121
122 if (!is_set($arFields, "SITES") && is_set($arFields, "LID"))
123 {
124 if (is_set($arFields, "PATH2FORUM_MESSAGE"))
125 $arFields["SITES"] = Array($arFields["LID"] => $arFields["PATH2FORUM_MESSAGE"]);
126 else
127 {
128 $sPath = "/";
129 $db_res = CSite::GetByID($arFields["LID"]);
130 if ($db_res && $res = $db_res->Fetch())
131 $sPath = $res["DIR"];
132 $arFields["SITES"] = array(
133 $arFields["LID"] => $sPath.(COption::GetOptionString("forum", "REL_FPATH", "")).
134 "forum/read.php?FID=#FORUM_ID#&TID=#TOPIC_ID#&MID=#MESSAGE_ID##message#MESSAGE_ID#");
135 }
136 }
137
138 if (isset($arFields["SITES"]) || $ACTION == "ADD")
139 {
140 $oldForumSites = is_array($arFields["SITES"]) ? $arFields["SITES"] : [];
141 $newForumSites = [];
142 $dbSites = CSite::GetList();
143 while ($res = $dbSites->Fetch())
144 {
145 $siteId = $res["LID"];
146 if (isset($oldForumSites[$siteId]))
147 {
148 if (!empty($oldForumSites[$siteId]))
149 {
150 $newForumSites[$siteId] = $oldForumSites[$siteId];
151 }
152 else
153 {
154 $aMsg[] = [
155 "id" => "SITE_PATH[".$siteId."]",
156 "text" => GetMessage("F_ERROR_EMPTY_SITE_PATH",
157 ["#SITE_ID#" => $siteId, "#SITE_NAME#" => $res["NAME"]])
158 ];
159 }
160 }
161 }
162 $arFields["SITES"] = $newForumSites;
163 }
164 if(!empty($aMsg))
165 {
166 $e = new CAdminException(array_reverse($aMsg));
167 $GLOBALS["APPLICATION"]->ThrowException($e);
168 return false;
169 }
170
171 if (is_set($arFields, "SORT") || $ACTION=="ADD") $arFields["SORT"] = intval(intVal($arFields["SORT"]) <= 0 ? 100 : $arFields["SORT"]);
172 if (is_set($arFields, "FORUM_GROUP_ID") || $ACTION=="ADD") $arFields["FORUM_GROUP_ID"] = (intval($arFields["FORUM_GROUP_ID"]) <= 0 ? false : intval($arFields["FORUM_GROUP_ID"]));
173
174 if (is_set($arFields, "ACTIVE") || $ACTION=="ADD") $arFields["ACTIVE"] = ($arFields["ACTIVE"] == "Y" ? "Y" : "N");
175 if (is_set($arFields, "INDEXATION") || $ACTION=="ADD") $arFields["INDEXATION"] = ($arFields["INDEXATION"] == "N" ? "N" : "Y");
176 if (is_set($arFields, "DEDUPLICATION") || $ACTION=="ADD") $arFields["DEDUPLICATION"] = ($arFields["DEDUPLICATION"] == "N" ? "N" : "Y");
177 if (is_set($arFields, "MODERATION") || $ACTION=="ADD") $arFields["MODERATION"] = ($arFields["MODERATION"] == "Y" ? "Y" : "N");
178
179 if (is_set($arFields, "ALLOW_HTML") || $ACTION=="ADD") $arFields["ALLOW_HTML"] = ($arFields["ALLOW_HTML"] == "Y" ? "Y" : "N");
180 if (is_set($arFields, "ALLOW_ANCHOR") || $ACTION=="ADD") $arFields["ALLOW_ANCHOR"] = ($arFields["ALLOW_ANCHOR"] == "N" ? "N" : "Y");
181 if (is_set($arFields, "ALLOW_BIU") || $ACTION=="ADD") $arFields["ALLOW_BIU"] = ($arFields["ALLOW_BIU"] == "N" ? "N" : "Y");
182 if (is_set($arFields, "ALLOW_IMG") || $ACTION=="ADD") $arFields["ALLOW_IMG"] = ($arFields["ALLOW_IMG"] == "N" ? "N" : "Y");
183 if (is_set($arFields, "ALLOW_VIDEO") || $ACTION=="ADD") $arFields["ALLOW_VIDEO"] = ($arFields["ALLOW_VIDEO"] == "N" ? "N" : "Y");
184 if (is_set($arFields, "ALLOW_LIST") || $ACTION=="ADD") $arFields["ALLOW_LIST"] = ($arFields["ALLOW_LIST"] == "N" ? "N" : "Y");
185 if (is_set($arFields, "ALLOW_QUOTE") || $ACTION=="ADD") $arFields["ALLOW_QUOTE"] = ($arFields["ALLOW_QUOTE"] == "N" ? "N" : "Y");
186 if (is_set($arFields, "ALLOW_CODE") || $ACTION=="ADD") $arFields["ALLOW_CODE"] = ($arFields["ALLOW_CODE"] == "N" ? "N" : "Y");
187 if (is_set($arFields, "ALLOW_FONT") || $ACTION=="ADD") $arFields["ALLOW_FONT"] = ($arFields["ALLOW_FONT"] == "N" ? "N" : "Y");
188 if (is_set($arFields, "ALLOW_TABLE") || $ACTION=="ADD") $arFields["ALLOW_TABLE"] = ($arFields["ALLOW_TABLE"] == "N" ? "N" : "Y");
189 if (is_set($arFields, "ALLOW_ALIGN") || $ACTION=="ADD") $arFields["ALLOW_ALIGN"] = ($arFields["ALLOW_ALIGN"] == "N" ? "N" : "Y");
190 if (is_set($arFields, "ALLOW_SMILES") || $ACTION=="ADD") $arFields["ALLOW_SMILES"] = ($arFields["ALLOW_SMILES"] == "N" ? "N" : "Y");
191 if (is_set($arFields, "ALLOW_UPLOAD") || $ACTION=="ADD") $arFields["ALLOW_UPLOAD"] = (in_array($arFields["ALLOW_UPLOAD"], array("Y", "F", "A")) ? $arFields["ALLOW_UPLOAD"] : "N");
192 if (is_set($arFields, "ALLOW_NL2BR") || $ACTION=="ADD") $arFields["ALLOW_NL2BR"] = ($arFields["ALLOW_NL2BR"] == "Y" ? "Y" : "N");
193 if (is_set($arFields, "ALLOW_TOPIC_TITLED") || $ACTION=="ADD") $arFields["ALLOW_TOPIC_TITLED"] = ($arFields["ALLOW_TOPIC_TITLED"] == "Y" ? "Y" : "N");
194
195 if (is_set($arFields, "ALLOW_MOVE_TOPIC") || $ACTION=="ADD") $arFields["ALLOW_MOVE_TOPIC"] = ($arFields["ALLOW_MOVE_TOPIC"] == "Y" ? "Y" : "N");
196 if (is_set($arFields, "ALLOW_SIGNATURE") || $ACTION=="ADD") $arFields["ALLOW_SIGNATURE"] = ($arFields["ALLOW_SIGNATURE"] == "Y" ? "Y" : "N");
197
198 if (is_set($arFields, "ASK_GUEST_EMAIL") || $ACTION=="ADD") $arFields["ASK_GUEST_EMAIL"] = ($arFields["ASK_GUEST_EMAIL"] == "Y" ? "Y" : "N");
199 if (is_set($arFields, "ASK_GUEST_EMAIL") || $ACTION=="ADD") $arFields["ASK_GUEST_EMAIL"] = ($arFields["ASK_GUEST_EMAIL"] == "Y" ? "Y" : "N");
200
201 if (is_set($arFields, "LAST_POSTER_NAME") && COption::GetOptionString("forum", "FILTER", "Y") == "Y")
202 {
203 $arr = array("LAST_POSTER_NAME" => CFilterUnquotableWords::Filter($arFields["LAST_POSTER_NAME"]));
204 $arr["LAST_POSTER_NAME"] = (empty($arr["LAST_POSTER_NAME"]) ? "*" : $arr["LAST_POSTER_NAME"]);
205 $arFields["HTML"] = serialize($arr);
206 }
207 return true;
208 }
209
210 public static function Update($ID, $arFields, $bReindex = true)
211 {
212 global $DB;
213 $ID = intval($ID);
214 $arForum_prev = array();
215 $arProcAuth = array();
216
217 if ($ID <= 0 || !CForumNew::CheckFields("UPDATE", $arFields))
218 return false;
219
220 if ($arFields["ACTIVE"] == "N")
221 $arForum_prev = CForumNew::GetByID($ID);
222/***************** Event onBeforeForumUpdate ***********************/
223 foreach (GetModuleEvents("forum", "onBeforeForumUpdate", true) as $arEvent)
224 {
225 if (ExecuteModuleEventEx($arEvent, array(&$ID, &$arFields)) === false)
226 return false;
227 }
228/***************** /Event ******************************************/
229 if (empty($arFields))
230 return false;
231/***************** Cleaning cache **********************************/
232 unset($GLOBALS["FORUM_CACHE"]["FORUM"][$ID]);
233 if(CACHED_b_forum !== false)
234 $GLOBALS["CACHE_MANAGER"]->CleanDir("b_forum");
235 if(CACHED_b_forum2site !== false && is_array($arFields["SITES"]) && count($arFields["SITES"]) > 0)
236 $GLOBALS["CACHE_MANAGER"]->CleanDir("b_forum2site");
237/***************** Cleaning cache/**********************************/
238 $strUpdate = $DB->PrepareUpdate("b_forum", $arFields);
239 if (!empty($strUpdate))
240 {
241 $strSql = "UPDATE b_forum SET ".$strUpdate." WHERE ID=".$ID;
242 $DB->Query($strSql);
243 }
244
245 if (is_array($arFields["SITES"]) && count($arFields["SITES"]) > 0)
246 {
247 $DB->Query("DELETE FROM b_forum2site WHERE FORUM_ID = ".$ID);
248 foreach ($arFields["SITES"] as $key => $value)
249 {
250 $value = $DB->ForSql($value, 250);
251 $strSql = "INSERT INTO b_forum2site (FORUM_ID, SITE_ID, PATH2FORUM_MESSAGE) VALUES(".$ID.", '".$DB->ForSql($key, 2)."', '".$value."') ";
252 if ($DB->type == "MYSQL")
253 $strSql .= "ON DUPLICATE KEY UPDATE PATH2FORUM_MESSAGE='".$value."'";
254 $DB->Query($strSql);
255 }
256 }
257
258 if (is_set($arFields, "GROUP_ID") && is_array($arFields["GROUP_ID"]))
260/***************** Event onAfterForumUpdate ************************/
261 foreach (GetModuleEvents("forum", "onAfterForumUpdate", true) as $arEvent)
263/***************** /Event ******************************************/
264
265/***************** Update statistic ********************************/
266/* If forum became inactive than all statistics for users of this forum will be recalculated.*/
267 if ($arFields["ACTIVE"] == "N" && $arForum_prev["ACTIVE"] == "Y")
268 {
269 $db_res = CForumMessage::GetList(array(), array("FORUM_ID"=>$ID, "!AUTHOR_ID"=>0));
270 while ($res = $db_res->Fetch())
271 {
272 $res["AUTHOR_ID"] = intval($res["AUTHOR_ID"]);
273 if (!in_array($res["AUTHOR_ID"], $arProcAuth))
274 {
275 CForumUser::SetStat($res["AUTHOR_ID"]);
276 $arProcAuth[] = $res["AUTHOR_ID"];
277 }
278 }
279 unset($arProcAuth);
280 }
281/***************** Update search module ****************************/
282 if (CModule::IncludeModule("search") && $bReindex == true)
283 {
284 if ($arFields["ACTIVE"] == "N" && $arForum_prev["ACTIVE"] == "Y" ||
285 $arFields["INDEXATION"] == "N" && $arForum_prev["INDEXATION"] == "Y")
286 {
287 CSearch::DeleteIndex("forum", false, $ID);
288 }
289 elseif (is_set($arFields, "GROUP_ID") && is_array($arFields["GROUP_ID"]))
290 {
292 $arGPerm = Array();
293 foreach ($arGroups as $i => $group)
294 {
295 if ($group[1] >= "E")
296 {
297 $arGPerm[] = $group[0];
298 if ($group[0] == 2)
299 break;
300 }
301 }
302 CSearch::ChangePermission("forum", $arGPerm, false, $ID);
303 }
304 }
305 return $ID;
306 }
307
308 public static function Delete($ID)
309 {
310 global $DB;
311 $ID = intval($ID);
312 $bCanDelete = true;
313/***************** Event OnBeforeForumDelete ***********************/
314 foreach (GetModuleEvents("forum", "OnBeforeForumDelete", true) as $arEvent)
315 {
316 if (ExecuteModuleEventEx($arEvent, array(&$ID)) === false)
317 {
318 $bCanDelete = false;
319 break;
320 }
321 }
322/***************** /Event ******************************************/
323 if (!$bCanDelete)
324 return false;
325/***************** Event OnForumDelete *****************************/
326 foreach (GetModuleEvents("forum", "OnForumDelete", true) as $arEvent)
327 ExecuteModuleEventEx($arEvent, array(&$ID));
328/***************** /Event ******************************************/
329/***************** Cleaning cache **********************************/
330 unset($GLOBALS["FORUM_CACHE"]["FORUM"][$ID]);
331 if(CACHED_b_forum !== false)
332 $GLOBALS["CACHE_MANAGER"]->CleanDir("b_forum");
333 if(CACHED_b_forum_perms !== false)
334 $GLOBALS["CACHE_MANAGER"]->CleanDir("b_forum_perms");
335 if(CACHED_b_forum2site !== false)
336 $GLOBALS["CACHE_MANAGER"]->CleanDir("b_forum2site");
337/***************** Cleaning cache/**********************************/
338/***************** Search module ***********************************/
339 set_time_limit(0);
340 if (CModule::IncludeModule("search"))
341 {
342 CSearch::DeleteIndex("forum", false, $ID);
343 }
344 CForumFiles::Delete(array("FORUM_ID" => $ID), array("DELETE_FORUM_FILE" => "Y"));
345 $DB->StartTransaction();
346 // Update USER statistic
347 $arProcAuth = array();
348 $db_res = CForumMessage::GetList(array(), array("FORUM_ID"=>$ID, "!AUTHOR_ID"=>0));
349 while ($res = $db_res->Fetch())
350 {
351 $res["AUTHOR_ID"] = intval($res["AUTHOR_ID"]);
352 if (!in_array($res["AUTHOR_ID"], $arProcAuth))
353 {
354 $arProcAuth[] = intval($res["AUTHOR_ID"]);
355 }
356 }
357 if (IsModuleInstalled("vote"))
358 {
359 $db_res = CForumMessage::GetList(array(), array("FORUM_ID"=>$ID, "PARAM1" => "VT", "!PARAM2" => 0));
360 if ($db_res && $res = $db_res->Fetch()):
361 CModule::IncludeModule("vote");
362 do {
363 CVote::Delete($res["PARAM2"]);
364 } while ($res = $db_res->Fetch());
365 endif;
366 }
367 if (!$DB->Query("DELETE FROM b_forum_subscribe WHERE FORUM_ID=".$ID, true))
368 {
369 $DB->Rollback();
370 return false;
371 }
372 if (!$DB->Query("DELETE FROM b_forum_message WHERE FORUM_ID=".$ID, true))
373 {
374 $DB->Rollback();
375 return false;
376 }
377 if (!$DB->Query("DELETE FROM b_forum_topic WHERE FORUM_ID=".$ID, true))
378 {
379 $DB->Rollback();
380 return false;
381 }
382 if (!$DB->Query("DELETE FROM b_forum_perms WHERE FORUM_ID=".$ID, true))
383 {
384 $DB->Rollback();
385 return false;
386 }
387 if (!$DB->Query("DELETE FROM b_forum2site WHERE FORUM_ID=".$ID, true))
388 {
389 $DB->Rollback();
390 return false;
391 }
392 if (!$DB->Query("DELETE FROM b_forum WHERE ID=".$ID, true))
393 {
394 $DB->Rollback();
395 return false;
396 }
397
398 // Update USER statistic
399 foreach($arProcAuth as $i => $procAuth)
400 CForumUser::SetStat($procAuth);
401
402 $DB->Commit();
403/***************** Event OnAfterForumDelete ************************/
404 foreach (GetModuleEvents("forum", "OnAfterForumDelete", true) as $arEvent)
405 ExecuteModuleEventEx($arEvent, array($ID));
406/***************** /Event ******************************************/
407 return true;
408 }
409
410 //---------------> Array of sites (langs) where forum is available
411 public static function GetSites($ID)
412 {
413 global $DB, $CACHE_MANAGER;
414 $ID = intval($ID);
415 $cache_id = "b_forum2site_".$ID;
416 if ($ID <= 0):
417 return false;
418 elseif (!isset($GLOBALS["FORUM_CACHE"]["FORUM"][$ID]) || !is_array($GLOBALS["FORUM_CACHE"]["FORUM"][$ID])):
419 $GLOBALS["FORUM_CACHE"]["FORUM"][$ID] = array();
420 endif;
421
422 if (!array_key_exists("SITES", $GLOBALS["FORUM_CACHE"]["FORUM"][$ID]))
423 {
424 if (CACHED_b_forum2site !== false && $CACHE_MANAGER->Read(CACHED_b_forum2site, $cache_id, "b_forum2site"))
425 {
426 $GLOBALS["FORUM_CACHE"]["FORUM"][$ID]["SITES"] = $CACHE_MANAGER->Get($cache_id);
427 }
428 else
429 {
430 $strSql = "SELECT FS.FORUM_ID, FS.SITE_ID, FS.PATH2FORUM_MESSAGE FROM b_forum2site FS WHERE FS.FORUM_ID = ".$ID;
431 $db_res = $DB->Query($strSql);
432 $arRes = array();
433 while ($res = $db_res->Fetch())
434 $arRes[$res["SITE_ID"]] = $res["PATH2FORUM_MESSAGE"];
435 $GLOBALS["FORUM_CACHE"]["FORUM"][$ID]["SITES"] = $arRes;
436 if (CACHED_b_forum2site !== false)
437 $CACHE_MANAGER->Set($cache_id, $GLOBALS["FORUM_CACHE"]["FORUM"][$ID]["SITES"]);
438 }
439 }
440 return $GLOBALS["FORUM_CACHE"]["FORUM"][$ID]["SITES"];
441 }
442
443 //---------------> Forum permissions
444 public static function GetPermissionUserDefault($ID)
445 {
446 $arFields = array(2);
447 if (COption::GetOptionString("main", "new_user_registration", "") == "Y")
448 {
449 $def_group = COption::GetOptionString("main", "new_user_registration_def_group", "");
450 if($def_group != "")
451 {
452 $arFields = explode(",", $def_group);
453 $arFields[] = 2;
454 }
455 }
457 if ($res >= "E")
458 return "E";
459 else
460 return "A";
461 }
462
463 public static function GetAccessPermissions($ID, $TYPE = "ONE")
464 {
465 $res = [];
466 if (($forum = Forum\Forum::getById($ID)) !== null)
467 {
468 $res = $forum->getPermissions();
469 }
470 if ($TYPE === "ONE")
471 {
472 $result = [];
473 foreach ($res as $key => $val)
474 {
475 $result[] = [$key, $val];
476 }
477 return $result;
478 }
479 return $res;
480 }
481
482 public static function GetAccessPermsList($arOrder = array("ID"=>"ASC"), $arFilter = array())
483 {
484 global $DB;
485 $arSqlSearch = array();
486 $strSqlSearch = "";
487 $arSqlOrder = array();
488 $strSqlOrder = "";
489 $arFilter = (is_array($arFilter) ? $arFilter : array());
490
491 foreach ($arFilter as $key => $val)
492 {
494 $key = mb_strtoupper($key_res["FIELD"]);
495 $strNegative = $key_res["NEGATIVE"];
496 $strOperation = $key_res["OPERATION"];
497
498 switch ($key)
499 {
500 case "ID":
501 case "FORUM_ID":
502 case "GROUP_ID":
503 if (intval($val)<=0)
504 $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FP.".$key." IS NULL OR FP.".$key."<=0)";
505 else
506 $arSqlSearch[] = ($strNegative=="Y"?" FP.".$key." IS NULL OR NOT ":"")."FP.".$key." ".$strOperation." ".intval($val)." ";
507 break;
508 case "PERMISSION":
509 if ($val == '')
510 $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FP.".$key." IS NULL OR ".($DB->type == "MSSQL" ? "LEN" : "LENGTH")."(FP.".$key.")<=0)";
511 else
512 $arSqlSearch[] = ($strNegative=="Y"?" FP.".$key." IS NULL OR NOT ":"")."FP.".$key." ".$strOperation." '".$DB->ForSql($val)."' ";
513 break;
514 }
515 }
516 if (count($arSqlSearch) > 0)
517 $strSqlSearch = " AND (".implode(" AND ", $arSqlSearch).") ";
518
519 foreach ($arOrder as $by=>$order)
520 {
521 $by = mb_strtoupper($by);
522 $order = mb_strtoupper($order);
523 if ($order!="ASC") $order = "DESC";
524
525 if ($by == "FORUM_ID") $arSqlOrder[] = " FP.FORUM_ID ".$order." ";
526 elseif ($by == "GROUP_ID") $arSqlOrder[] = " FP.GROUP_ID ".$order." ";
527 elseif ($by == "PERMISSION") $arSqlOrder[] = " FP.PERMISSION ".$order." ";
528 else
529 {
530 $arSqlOrder[] = " FP.ID ".$order." ";
531 $by = "ID";
532 }
533 }
534 DelDuplicateSort($arSqlOrder);
535 if (count($arSqlOrder) > 0)
536 $strSqlOrder = " ORDER BY ".implode(", ", $arSqlOrder);
537
538 $strSql =
539 "SELECT FP.ID, FP.FORUM_ID, FP.GROUP_ID, FP.PERMISSION
540 FROM b_forum_perms FP
541 WHERE 1 = 1
542 ".$strSqlSearch."
543 ".$strSqlOrder;
544
545 $db_res = $DB->Query($strSql);
546 return $db_res;
547 }
548
549 public static function SetAccessPermissions($ID, $arGROUP_ID)
550 {
551 if (($forum = Forum\Forum::getById($ID)) !== null)
552 {
553 unset($GLOBALS["FORUM_CACHE"]["FORUM"][$ID]["PERMISSION"]);
554 unset($GLOBALS["FORUM_CACHE"]["FORUM"][$ID]["PERMISSIONS"]);
555 if (CACHED_b_forum_perms !== false)
556 {
557 $GLOBALS["CACHE_MANAGER"]->CleanDir("b_forum_perms");
558 }
559 $forum->setPermission($arGROUP_ID);
560 }
561 return true;
562 }
563
564 public static function GetUserPermission($ID, $arUserGroups)
565 {
567 if (($forum = Forum\Forum::getById($ID)) !== null)
568 {
569 if (is_array($arUserGroups))
570 {
571 $result = $forum->getPermissionForUserGroups($arUserGroups);
572 }
573 else if (($user = Forum\User::getById($arUserGroups)) !== null)
574 {
575 $result = $forum->getPermissionForUser($user);
576 }
577 }
578 return $result;
579 }
580
581 //---------------> Forum Utils
582 public static function GetFilterOperation($key)
583 {
584 $strNegative = "N";
585 if (mb_substr($key, 0, 1) == "!")
586 {
587 $key = mb_substr($key, 1);
588 $strNegative = "Y";
589 }
590
591 if (mb_substr($key, 0, 2) == ">=")
592 {
593 $key = mb_substr($key, 2);
594 $strOperation = ">=";
595 }
596 elseif (mb_substr($key, 0, 1) == ">")
597 {
598 $key = mb_substr($key, 1);
599 $strOperation = ">";
600 }
601 elseif (mb_substr($key, 0, 2) == "<=")
602 {
603 $key = mb_substr($key, 2);
604 $strOperation = "<=";
605 }
606 elseif (mb_substr($key, 0, 1) == "<")
607 {
608 $key = mb_substr($key, 1);
609 $strOperation = "<";
610 }
611 elseif (mb_substr($key, 0, 1) == "@")
612 {
613 $key = mb_substr($key, 1);
614 $strOperation = "IN";
615 }
616 elseif (mb_substr($key, 0, 1) == "%")
617 {
618 $key = mb_substr($key, 1);
619 $strOperation = "LIKE";
620 }
621 else
622 {
623 $strOperation = "=";
624 }
625
626 return array("FIELD"=>$key, "NEGATIVE"=>$strNegative, "OPERATION"=>$strOperation);
627 }
628
629 public static function prepareField($operation, $type, $vals)
630 {
631 $val = '';
632 if ($operation == "IN")
633 {
634 if (is_string($vals))
635 $vals = explode(",", $vals);
636 else if (!is_array($vals))
637 $vals = array($vals);
638 if ($type == "int")
639 {
640 array_walk(
641 $vals,
642 function (&$item) {
643 $item = (int)$item;
644 }
645 );
646 $vals = array_unique($vals);
647 $val = implode(",", $vals);
648 }
649 elseif ($type == "double")
650 {
651 array_walk(
652 $vals,
653 function (&$item) {
654 $item = (float)$item;
655 }
656 );
657 $vals = array_unique($vals);
658 $val = implode(",", $vals);
659 }
660 elseif ($type == "datetime")
661 {
662 array_walk(
663 $vals,
664 function (&$item) {
665 $item = $GLOBALS["DB"]->CharToDateFunction($item, "FULL");
666 }
667 );
668 $vals = array_unique($vals);
669 $val = implode(",", $vals);
670 }
671 elseif ($type == "date")
672 {
673 array_walk(
674 $vals,
675 function (&$item) {
676 $item = $GLOBALS["DB"]->CharToDateFunction($item, "SHORT");
677 }
678 );
679 $vals = array_unique($vals);
680 $val = implode(",", $vals);
681 }
682 else
683 {
684 array_walk(
685 $vals,
686 function (&$item) {
687 $item = "'".$GLOBALS["DB"]->ForSql($item)."'";
688 }
689 );
690 $vals = array_unique($vals);
691 $val = implode(",", $vals);
692 }
693 }
694 else if ($type === "int")
695 {
696 $val = intval($vals);
697 $val = ($val > 0 ? $val : '');
698 }
699 elseif ($type === "double")
700 {
701 $val = doubleval(str_replace(",", ".", $vals));
702 $val = ($val > 0 ? $val : '');
703 }
704 elseif ($type === "datetime")
705 {
706 $val = $GLOBALS["DB"]->CharToDateFunction($vals, "FULL");
707 }
708 elseif ($type === "date")
709 {
710 $val = $GLOBALS["DB"]->CharToDateFunction($vals, "SHORT");
711 }
712 else if ($type == "string" || $type == "char")
713 {
714 $val = $GLOBALS["DB"]->ForSql($vals);
715 }
716
717 return $val;
718 }
719
720 public static function GetSelectFields($arAddParams = array())
721 {
722 global $DB;
723 $arAddParams = (is_array($arAddParams) ? $arAddParams : array());
724 $arAddParams["sPrefix"] = $DB->ForSql(empty($arAddParams["sPrefix"]) ? "F." : $arAddParams["sPrefix"]);
725 $arAddParams["sTablePrefix"] = $DB->ForSql(empty($arAddParams["sTablePrefix"]) ? "F." : $arAddParams["sTablePrefix"]);
726 $arAddParams["sReturnResult"] = ($arAddParams["sReturnResult"] == "string" ? "string" : "array");
727
728 $res = array(
729 $arAddParams["sPrefix"]."ID" => $arAddParams["sTablePrefix"]."ID",
730 $arAddParams["sPrefix"]."NAME" => $arAddParams["sTablePrefix"]."NAME",
731 $arAddParams["sPrefix"]."DESCRIPTION" => $arAddParams["sTablePrefix"]."DESCRIPTION",
732 $arAddParams["sPrefix"]."SORT" => $arAddParams["sTablePrefix"]."SORT",
733 $arAddParams["sPrefix"]."ACTIVE" => $arAddParams["sTablePrefix"]."ACTIVE",
734 $arAddParams["sPrefix"]."MODERATION" => $arAddParams["sTablePrefix"]."MODERATION",
735 $arAddParams["sPrefix"]."DEDUPLICATION" => $arAddParams["sTablePrefix"]."DEDUPLICATION",
736 $arAddParams["sPrefix"]."INDEXATION" => $arAddParams["sTablePrefix"]."INDEXATION",
737 $arAddParams["sPrefix"]."ALLOW_MOVE_TOPIC" => $arAddParams["sTablePrefix"]."ALLOW_MOVE_TOPIC",
738 $arAddParams["sPrefix"]."TOPICS" => $arAddParams["sTablePrefix"]."TOPICS",
739 $arAddParams["sPrefix"]."POSTS" => $arAddParams["sTablePrefix"]."POSTS",
740 $arAddParams["sPrefix"]."LAST_POSTER_ID" => $arAddParams["sTablePrefix"]."LAST_POSTER_ID",
741 $arAddParams["sPrefix"]."LAST_POSTER_NAME" => $arAddParams["sTablePrefix"]."LAST_POSTER_NAME",
742 ($arAddParams["sPrefix"] == $arAddParams["sTablePrefix"] ? "" : $arAddParams["sPrefix"]).
743 "LAST_POST_DATE" => $DB->DateToCharFunction($arAddParams["sTablePrefix"]."LAST_POST_DATE", "FULL"),
744 $arAddParams["sPrefix"]."LAST_MESSAGE_ID" => $arAddParams["sTablePrefix"]."LAST_MESSAGE_ID",
745 ($arAddParams["sPrefix"] == $arAddParams["sTablePrefix"] ? "" : $arAddParams["sPrefix"]).
746 "MID" => $arAddParams["sTablePrefix"]."LAST_MESSAGE_ID ",
747 $arAddParams["sPrefix"]."LAST_MESSAGE_ID" => $arAddParams["sTablePrefix"]."LAST_MESSAGE_ID",
748
749 $arAddParams["sPrefix"]."POSTS_UNAPPROVED" => $arAddParams["sTablePrefix"]."POSTS_UNAPPROVED",
750 $arAddParams["sPrefix"]."ABS_LAST_POSTER_ID" => $arAddParams["sTablePrefix"]."ABS_LAST_POSTER_ID",
751 $arAddParams["sPrefix"]."ABS_LAST_POSTER_NAME" => $arAddParams["sTablePrefix"]."ABS_LAST_POSTER_NAME",
752 ($arAddParams["sPrefix"] == $arAddParams["sTablePrefix"] ? "" : $arAddParams["sPrefix"]).
753 "ABS_LAST_POST_DATE" => $DB->DateToCharFunction($arAddParams["sTablePrefix"]."ABS_LAST_POST_DATE", "FULL"),
754 $arAddParams["sPrefix"]."ABS_LAST_MESSAGE_ID" => $arAddParams["sTablePrefix"]."ABS_LAST_MESSAGE_ID",
755
756 $arAddParams["sPrefix"]."ORDER_BY" => $arAddParams["sTablePrefix"]."ORDER_BY",
757 $arAddParams["sPrefix"]."ORDER_DIRECTION" => $arAddParams["sTablePrefix"]."ORDER_DIRECTION",
758 $arAddParams["sPrefix"]."ALLOW_HTML" => $arAddParams["sTablePrefix"]."ALLOW_HTML",
759 $arAddParams["sPrefix"]."ALLOW_ANCHOR" => $arAddParams["sTablePrefix"]."ALLOW_ANCHOR",
760 $arAddParams["sPrefix"]."ALLOW_BIU" => $arAddParams["sTablePrefix"]."ALLOW_BIU",
761 $arAddParams["sPrefix"]."ALLOW_IMG" => $arAddParams["sTablePrefix"]."ALLOW_IMG",
762 $arAddParams["sPrefix"]."ALLOW_VIDEO" => $arAddParams["sTablePrefix"]."ALLOW_VIDEO",
763 $arAddParams["sPrefix"]."ALLOW_LIST" => $arAddParams["sTablePrefix"]."ALLOW_LIST",
764 $arAddParams["sPrefix"]."ALLOW_TABLE" => $arAddParams["sTablePrefix"]."ALLOW_TABLE",
765 $arAddParams["sPrefix"]."ALLOW_ALIGN" => $arAddParams["sTablePrefix"]."ALLOW_ALIGN",
766 $arAddParams["sPrefix"]."ALLOW_QUOTE" => $arAddParams["sTablePrefix"]."ALLOW_QUOTE",
767 $arAddParams["sPrefix"]."ALLOW_CODE" => $arAddParams["sTablePrefix"]."ALLOW_CODE",
768 $arAddParams["sPrefix"]."ALLOW_FONT" => $arAddParams["sTablePrefix"]."ALLOW_FONT",
769 $arAddParams["sPrefix"]."ALLOW_SMILES" => $arAddParams["sTablePrefix"]."ALLOW_SMILES",
770 $arAddParams["sPrefix"]."ALLOW_UPLOAD" => $arAddParams["sTablePrefix"]."ALLOW_UPLOAD",
771 $arAddParams["sPrefix"]."ALLOW_TOPIC_TITLED" => $arAddParams["sTablePrefix"]."ALLOW_TOPIC_TITLED",
772 $arAddParams["sPrefix"]."ALLOW_SIGNATURE" => $arAddParams["sTablePrefix"]."ALLOW_SIGNATURE",
773 $arAddParams["sPrefix"]."EVENT1" => $arAddParams["sTablePrefix"]."EVENT1",
774 $arAddParams["sPrefix"]."EVENT2" => $arAddParams["sTablePrefix"]."EVENT2",
775 $arAddParams["sPrefix"]."EVENT3" => $arAddParams["sTablePrefix"]."EVENT3",
776 $arAddParams["sPrefix"]."ALLOW_NL2BR" => $arAddParams["sTablePrefix"]."ALLOW_NL2BR",
777 $arAddParams["sPrefix"]."ALLOW_UPLOAD_EXT" => $arAddParams["sTablePrefix"]."ALLOW_UPLOAD_EXT",
778 $arAddParams["sPrefix"]."FORUM_GROUP_ID" => $arAddParams["sTablePrefix"]."FORUM_GROUP_ID",
779 $arAddParams["sPrefix"]."ASK_GUEST_EMAIL" => $arAddParams["sTablePrefix"]."ASK_GUEST_EMAIL",
780 $arAddParams["sPrefix"]."USE_CAPTCHA" => $arAddParams["sTablePrefix"]."USE_CAPTCHA",
781 $arAddParams["sPrefix"]."HTML" => $arAddParams["sTablePrefix"]."HTML");
782
783 if ($arAddParams["sReturnResult"] == "string")
784 {
785 $arRes = array();
786 foreach ($res as $key => $val)
787 {
788 $arRes[] = $val.($key != $val ? " AS ".$key : "");
789 }
790 $res = implode(", ", $arRes);
791 }
792 return $res;
793 }
794
795 //---------------> Forum list
796 public static function GetList($arOrder = Array("SORT"=>"ASC"), $arFilter = Array(), $arAddParams = array())
797 {
798 global $DB;
799 $arSqlSearch = Array();
800 $arSqlSearchFrom = Array();
801 $strSqlSelect = "";
802 $strSqlSearchFrom = "";
803 $strSqlSearch = "";
804 $arSqlOrder = Array();
805 $strSqlOrder = "";
806 $arFilter = (is_array($arFilter) ? $arFilter : array());
807
808 foreach ($arFilter as $key => $val)
809 {
811 $key = mb_strtoupper($key_res["FIELD"]);
812 $strNegative = $key_res["NEGATIVE"];
813 $strOperation = $key_res["OPERATION"];
814
815 switch ($key)
816 {
817 case "LID":
818 case "SITE_ID":
819 $val = trim($val);
820 if ($val <> '')
821 {
822 $arSqlSearch[] = "F.ID = F2S.FORUM_ID AND ".($strNegative=="Y"?" NOT ":"")."(F2S.SITE_ID ".$strOperation." '".$DB->ForSql($val)."' )";
823 $arSqlSearchFrom[] = "b_forum2site F2S";
824 }
825 break;
826 case "INDEXATION":
827 case "DEDUPLICATION":
828 case "ACTIVE":
829 case "XML_ID":
830 if ($val == '')
831 $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(F.".$key." IS NULL OR ".($DB->type == "MSSQL" ? "LEN" : "LENGTH")."(F.".$key.")<=0)";
832 else
833 $arSqlSearch[] = ($strNegative=="Y"?" F.".$key." IS NULL OR NOT ":"")."(F.".$key." ".$strOperation." '".$DB->ForSql($val)."' )";
834 break;
835 case "ID":
836 case "FORUM_GROUP_ID":
837 case "TOPICS":
838 case "POSTS":
839 case "POSTS_UNAPPROVED":
840 if ($strOperation == "IN")
841 {
842 if (is_array($val))
843 {
844 $val_int = array();
845 foreach ($val as $v)
846 $val_int[] = intval($v);
847 $val = implode(", ", $val_int);
848 }
849 else
850 {
851 $val = intval($val);
852 }
853 $val = trim($val);
854 }
855 if (($strOperation == "IN" && $val == '') || intval($val) <= 0)
856 $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(F.".$key." IS NULL OR F.".$key."<=0)";
857 elseif ($strOperation == "IN")
858 $arSqlSearch[] = ($strNegative=="Y"?" NOT ":"")."(F.".$key." IN (".$DB->ForSql($val)."))";
859 else
860 $arSqlSearch[] = ($strNegative=="Y"?" F.".$key." IS NULL OR NOT ":"")."(F.".$key." ".$strOperation." ".intval($val)." )";
861 break;
862 case "TEXT":
863 $arSqlSearch[] = " (".GetFilterQuery("F.NAME,F.DESCRIPTION", $DB->ForSql($val), "Y").") ";
864 break;
865 case "PERMS":
866 if (is_array($val) && count($val)>1)
867 {
868 $val[1] = mb_strtoupper(mb_substr($val[1], 0, 1));
869 if (mb_strpos("AEIMQUY", $val[1]) !== false)
870 {
871 $arSqlSearch[] = "F.ID = FP.FORUM_ID AND FP.GROUP_ID IN (".intval($val[0]).") AND FP.PERMISSION > '".$DB->ForSql($val[1])."' ";
872 $arSqlSearchFrom[] = "b_forum_perms FP";
873 }
874 }
875 break;
876 }
877 }
878
879 if (count($arSqlSearch) > 0)
880 $strSqlSearch = " AND (".implode(") AND (", $arSqlSearch).") ";
881 if (count($arSqlSearchFrom) > 0)
882 $strSqlSearchFrom = ", ".implode(", ", $arSqlSearchFrom);
883
884 foreach ($arOrder as $by=>$order)
885 {
886 $by = mb_strtoupper($by);
887 $order = mb_strtoupper($order);
888 if ($order!="ASC") $order = "DESC";
889 if ($by == "ID") $arSqlOrder[] = " F.ID ".$order." ";
890 elseif ($by == "NAME") $arSqlOrder[] = " F.NAME ".$order." ";
891 elseif ($by == "ACTIVE") $arSqlOrder[] = " F.ACTIVE ".$order." ";
892 elseif ($by == "MODERATION") $arSqlOrder[] = " F.MODERATION ".$order." ";
893 elseif ($by == "FORUM_GROUP_ID") $arSqlOrder[] = " F.FORUM_GROUP_ID ".$order." ";
894 elseif ($by == "TOPICS") $arSqlOrder[] = " F.TOPICS ".$order." ";
895 elseif ($by == "POSTS") $arSqlOrder[] = " F.POSTS ".$order." ";
896 elseif ($by == "POSTS_UNAPPROVED") $arSqlOrder[] = " F.POSTS_UNAPPROVED ".$order." ";
897 elseif ($by == "LAST_POST_DATE") $arSqlOrder[] = " F.LAST_POST_DATE ".$order." ";
898 else
899 {
900 $arSqlOrder[] = " F.SORT ".$order." ";
901 $by = "SORT";
902 }
903 }
904 DelDuplicateSort($arSqlOrder);
905 if (count($arSqlOrder) > 0)
906 $strSqlOrder = " ORDER BY ".implode(", ", $arSqlOrder);
907
908 $strSql =
909 "SELECT F_FORUM.*, F.NAME, F.DESCRIPTION, F.ACTIVE, F.MODERATION, F.INDEXATION, F.DEDUPLICATION, F.ALLOW_MOVE_TOPIC, '' as LID,
910 F.TOPICS, F.POSTS, F.LAST_POSTER_ID, F.LAST_POSTER_NAME,
911 ".$DB->DateToCharFunction("F.LAST_POST_DATE", "FULL")." as LAST_POST_DATE,
912 F.LAST_MESSAGE_ID, F.LAST_MESSAGE_ID as MID,
913 F.POSTS_UNAPPROVED, F.ABS_LAST_POSTER_ID, F.ABS_LAST_POSTER_NAME,
914 ".$DB->DateToCharFunction("F.ABS_LAST_POST_DATE", "FULL")." as ABS_LAST_POST_DATE,
915 F.ABS_LAST_MESSAGE_ID, F.SORT, F.ORDER_BY,
916 F.ORDER_DIRECTION, F.ALLOW_HTML, F.ALLOW_ANCHOR, F.ALLOW_BIU,
917 F.ALLOW_IMG, F.ALLOW_VIDEO, F.ALLOW_TABLE, F.ALLOW_LIST, F.ALLOW_QUOTE, F.ALLOW_CODE,
918 F.ALLOW_ALIGN, F.ALLOW_FONT, F.ALLOW_SMILES, F.ALLOW_UPLOAD, F.EVENT1, F.EVENT2,
919 F.EVENT3, F.ALLOW_NL2BR, '' as PATH2FORUM_MESSAGE, F.ALLOW_UPLOAD_EXT, F.ALLOW_TOPIC_TITLED,
920 F.ALLOW_SIGNATURE,
921 F.FORUM_GROUP_ID, F.ASK_GUEST_EMAIL, F.USE_CAPTCHA, F.XML_ID
922 FROM
923 (
924 SELECT F.ID ".$strSqlSelect."
925 FROM b_forum F
926 ".$strSqlSearchFrom."
927 WHERE (1=1 ".$strSqlSearch.")
928 GROUP BY F.ID
929 ) F_FORUM
930 INNER JOIN b_forum F ON (F_FORUM.ID = F.ID)
931 ".$strSqlOrder;
932 $db_res = $DB->Query($strSql);
933 return $db_res;
934 }
935
936 public static function GetListEx($arOrder = Array("SORT"=>"ASC"), $arFilter = Array(), $bCount = false, $iNum = 0, $arAddParams = array())
937 {
938 global $DB;
939 $arSqlSearch = array();
940 $orSqlSearch = array();
941 $arSqlSelect = array();
942 $arSqlFrom = array();
943 $arSqlGroup = array();
944 $arSqlOrder = array();
945 $strSqlSearch = "";
946 $strSqlSelect = "";
947 $strSqlSearchOR = "";
948 $strSqlFrom = "";
949 $strSqlGroup = "";
950 $strSqlOrder = "";
951 $arFilter = (is_array($arFilter) ? $arFilter : array());
952
953 foreach ($arFilter as $key => $val)
954 {
956 $key = mb_strtoupper($key_res["FIELD"]);
957 $strNegative = $key_res["NEGATIVE"];
958 $strOperation = $key_res["OPERATION"];
959
960 switch ($key)
961 {
962 case "LID":
963 case "SITE_ID":
964 if ($val == ''):
965 break;
966 endif;
967 $arSqlSelect["PATH2FORUM_MESSAGE"] = "F2S.PATH2FORUM_MESSAGE";
968 $arSqlGroup["PATH2FORUM_MESSAGE"] = "F2S.PATH2FORUM_MESSAGE";
969 $arSqlFrom["F2S"] = "
970 INNER JOIN b_forum2site F2S ON (F2S.FORUM_ID=F.ID)";
971 $arSqlSearch[] = ($strNegative=="Y"?" NOT ":"")."(F2S.SITE_ID ".$strOperation." '".$DB->ForSql($val)."')";
972 break;
973 case "INDEXATION":
974 case "DEDUPLICATION":
975 case "ACTIVE":
976 case "XML_ID":
977 case "ALLOW_MOVE_TOPIC":
978 case "ALLOW_SIGNATURE":
979 if ($val == '')
980 $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(F.".$key." IS NULL OR ".($DB->type == "MSSQL" ? "LEN" : "LENGTH")."(F.".$key.") <= 0)";
981 else
982 $arSqlSearch[] = ($strNegative=="Y"?" F.".$key." IS NULL OR NOT ":"")."(F.".$key." ".$strOperation." '".$DB->ForSql($val)."')";
983 break;
984 case "ID":
985 case "FORUM_GROUP_ID":
986 case "TOPICS":
987 case "POSTS":
988 $val = array_map("intval", (is_array($val) ? $val : explode(",", $val)));
989 if (array_sum($val) <= 0)
990 $arSqlSearch[] = ($strNegative == "Y" ? "NOT" : "") . "(F.".$key." IS NULL OR F.".$key."<=0)";
991 elseif ($strOperation == "IN" || count($val) > 1)
992 $arSqlSearch[] = ($strNegative=="Y"?" NOT ":"")."(F.".$key." IN (".$DB->ForSql(implode(",", $val))."))";
993 else
994 $arSqlSearch[] = ($strNegative=="Y"?" F.".$key." IS NULL OR NOT ":"")."(F.".$key." ".$strOperation." ".reset($val)." )";
995 break;
996 case "TEXT":
997 $arSqlSearch[] = " (".GetFilterQuery("F.NAME,F.DESCRIPTION", $DB->ForSql($val), "Y").") ";
998 break;
999 case "PERMS":
1000 $v = (is_array($val) && isset($val[0]) && !empty($val[0]) ? array_map("intval", is_array($val[0]) ? $val[0] : explode(",", $val[0])) : array());
1001 if (empty($v))
1002 break;
1003 $val[0] = $DB->ForSql(implode(", ", $v));
1004 $arSqlFrom["FP"] = "
1005 INNER JOIN b_forum_perms FP ON (F.ID = FP.FORUM_ID)";
1006 if (mb_strtoupper($val[1]) == "ALLOW_MOVE_TOPIC")
1007 $arSqlSearch[] = "FP.GROUP_ID IN (".$val[0].") AND ((FP.PERMISSION > 'M') OR (F.ALLOW_MOVE_TOPIC = 'Y'))";
1008 else
1009 $arSqlSearch[] = "FP.GROUP_ID IN (".$val[0].") AND FP.PERMISSION > '".$DB->ForSql($val[1])."' ";
1010 break;
1011 case "APPROVED":
1012 if ($val == ''):
1013 break;
1014 endif;
1015 $arSqlFrom["FMM"] = "
1016 LEFT JOIN b_forum_message FMM ON (FMM.FORUM_ID=F.ID AND (FMM.APPROVED ".$strOperation." '".$DB->ForSql($val)."'))";
1017 $arSqlSelect["FMM"] = "count(FMM.ID) MCNT";
1018 break;
1019 case "RENEW":
1020 $val = intval($val);
1021 if ($val <= 0):
1022 break;
1023 endif;
1024
1025 $perms = "NOT_CHECK";
1026 $arUserGroups = $GLOBALS["USER"]->GetGroups();
1027 if (is_set($arFilter, "PERMS")):
1028 $perms = "NORMAL";
1029 $arUserGroups = $arFilter["PERMS"][0];
1030 elseif (is_set($arFilter, "APPROVED") && $arFilter["APPROVED"] == "Y"):
1031 $perms = "ONLY_APPROVED";
1032 endif;
1033
1034 $arSqlSelect["TCRENEW"] = "MAX(BFF.TCRENEW) AS TCRENEW";
1035 $arSqlFrom["RENEW"] = "
1036 LEFT JOIN (
1037 SELECT BF.ID AS RENEW_FORUM_ID, COUNT(FT_RENEW.ID) TCRENEW
1038 FROM b_forum BF
1039 ".
1040 ($perms == "NORMAL" ? "
1041 LEFT JOIN
1042 (
1043 SELECT FPP.FORUM_ID, MAX(FPP.PERMISSION) AS PERMISSION
1044 FROM b_forum_perms FPP
1045 WHERE FPP.GROUP_ID IN (".$arUserGroups.")
1046 GROUP BY FPP.FORUM_ID
1047 ) FP ON (FP.FORUM_ID = BF.ID)" :
1048 ""
1049 ).
1050 "
1051 LEFT JOIN b_forum_user_forum FUF ON (FUF.USER_ID=".$val." AND FUF.FORUM_ID = BF.ID)
1052 LEFT JOIN b_forum_user_forum FUF_ALL ON (FUF_ALL.USER_ID=".$val." AND FUF_ALL.FORUM_ID = 0)
1053 LEFT JOIN b_forum_topic FT_RENEW ON (BF.ID = FT_RENEW.FORUM_ID AND FT_RENEW.STATE != 'L' AND (FUF_ALL.LAST_VISIT IS NULL OR FT_RENEW.ABS_LAST_POST_DATE > FUF_ALL.LAST_VISIT))
1054 LEFT JOIN b_forum_user_topic FUT_RENEW ON (FUT_RENEW.FORUM_ID = BF.ID AND FUT_RENEW.TOPIC_ID = FT_RENEW.ID AND FUT_RENEW.USER_ID=".$val.")
1055 WHERE
1056 (
1057 FUT_RENEW.LAST_VISIT IS NULL
1058 AND
1059 (
1060 (FUF_ALL.LAST_VISIT IS NULL AND FUF.LAST_VISIT IS NULL)
1061 OR
1062 (
1063 FUF.LAST_VISIT IS NOT NULL
1064 AND
1065 ".
1066 ( $perms == "NORMAL" ? "
1067 (FP.PERMISSION >= 'Q' AND FUF.LAST_VISIT < FT_RENEW.ABS_LAST_POST_DATE)
1068 OR
1069 (FT_RENEW.APPROVED = 'Y' AND FUF.LAST_VISIT < FT_RENEW.LAST_POST_DATE)
1070 " :
1071 ( $perms == "NOT_CHECK" ? "
1072 (FUF.LAST_VISIT < FT_RENEW.ABS_LAST_POST_DATE OR FUF.LAST_VISIT < FT_RENEW.LAST_POST_DATE)
1073 " :
1074 "
1075 (FT_RENEW.APPROVED = 'Y' AND FUF.LAST_VISIT < FT_RENEW.LAST_POST_DATE)
1076 "
1077 )
1078 )
1079 ."
1080 )
1081 OR
1082 (
1083 FUF.LAST_VISIT IS NULL AND FUF_ALL.LAST_VISIT IS NOT NULL
1084 AND
1085 (
1086 ".
1087 ( $perms == "NORMAL" ? "
1088 (FP.PERMISSION >= 'Q' AND FUF_ALL.LAST_VISIT < FT_RENEW.ABS_LAST_POST_DATE)
1089 OR
1090 (FT_RENEW.APPROVED = 'Y' AND FUF_ALL.LAST_VISIT < FT_RENEW.LAST_POST_DATE)
1091 " :
1092 ( $perms == "NOT_CHECK" ? "
1093 (FUF_ALL.LAST_VISIT < FT_RENEW.ABS_LAST_POST_DATE OR FUF_ALL.LAST_VISIT < FT_RENEW.LAST_POST_DATE)
1094 " :
1095 "
1096 (FT_RENEW.APPROVED = 'Y' AND FUF_ALL.LAST_VISIT < FT_RENEW.LAST_POST_DATE)
1097 "
1098 )
1099 )
1100 ."
1101 )
1102 )
1103 )
1104 )
1105 OR
1106 (
1107 FUT_RENEW.LAST_VISIT IS NOT NULL
1108 AND
1109 ".
1110 ( $perms == "NORMAL" ? "
1111 (FP.PERMISSION >= 'Q' AND FUT_RENEW.LAST_VISIT < FT_RENEW.ABS_LAST_POST_DATE)
1112 OR
1113 (FT_RENEW.APPROVED = 'Y' AND FUT_RENEW.LAST_VISIT < FT_RENEW.LAST_POST_DATE)
1114 " :
1115 ( $perms == "NOT_CHECK" ? "
1116 (FUT_RENEW.LAST_VISIT < FT_RENEW.ABS_LAST_POST_DATE OR FUT_RENEW.LAST_VISIT < FT_RENEW.LAST_POST_DATE)
1117 " :
1118 "
1119 (FT_RENEW.APPROVED = 'Y' AND FUT_RENEW.LAST_VISIT < FT_RENEW.LAST_POST_DATE)
1120 "
1121 )
1122 )
1123 ."
1124 )
1125 GROUP BY BF.ID".
1126 ( $perms == "NORMAL" ? ", FP.PERMISSION" : "")."
1127 ) BFF ON (BFF.RENEW_FORUM_ID = F.ID)
1128 ";
1129 break;
1130 }
1131 }
1132
1133 if (count($arSqlSearch) > 0)
1134 $strSqlSearch = " AND (".implode(") AND (", $arSqlSearch).") ";
1135 if (count($orSqlSearch) > 0)
1136 $strSqlSearchOR = " OR (".implode(") AND (", $orSqlSearch).") ";
1137 if (count($arSqlSelect) > 0)
1138 $strSqlSelect = ", ".implode(", ", $arSqlSelect);
1139 if (count($arSqlFrom) > 0)
1140 $strSqlFrom = " ".implode(" ", $arSqlFrom);
1141 if (count($arSqlGroup) > 0)
1142 $strSqlGroup = ",".implode(",", $arSqlGroup);
1143 foreach ($arOrder as $by=>$order)
1144 {
1145 $by = mb_strtoupper($by);
1146 $order = mb_strtoupper($order);
1147 if ($order!="ASC") $order = "DESC".($DB->type=="ORACLE"?" NULLS LAST":"");
1148 else $order = "ASC".($DB->type=="ORACLE"?" NULLS FIRST":"");
1149
1150 if ($by == "ID") $arSqlOrder["F_FORUM.ID"] = " F_FORUM.ID ".$order." ";
1151 elseif ($by == "NAME") $arSqlOrder["F.NAME"] = " F.NAME ".$order." ";
1152 elseif ($by == "ACTIVE") $arSqlOrder["F.ACTIVE"] = " F.ACTIVE ".$order." ";
1153 elseif ($by == "MODERATION") $arSqlOrder["F.MODERATION"] = " F.MODERATION ".$order." ";
1154 elseif ($by == "FORUM_GROUP_ID") $arSqlOrder["F.FORUM_GROUP_ID"] = " F.FORUM_GROUP_ID ".$order." ";
1155 elseif ($by == "FORUM_GROUP_SORT") $arSqlOrder["FG.SORT"] = " FG.SORT ".$order." ";
1156 elseif ($by == "FORUM_GROUP_LEFT_MARGIN") $arSqlOrder["FG.LEFT_MARGIN"] = " FG.LEFT_MARGIN ".$order." ";
1157 elseif ($by == "TOPICS") $arSqlOrder["F.TOPICS"] = " F.TOPICS ".$order." ";
1158 elseif ($by == "POSTS") $arSqlOrder["F.POSTS"] = " F.POSTS ".$order." ";
1159 elseif ($by == "POSTS_UNAPPROVED") $arSqlOrder["F.POSTS_UNAPPROVED"] = " F.POSTS_UNAPPROVED ".$order." ";
1160 elseif ($by == "LAST_POST_DATE") $arSqlOrder["F.LAST_POST_DATE"] = " F.LAST_POST_DATE ".$order." ";
1161 elseif ($by == "ABS_LAST_POST_DATE") $arSqlOrder["F.ABS_LAST_POST_DATE"] = " F.ABS_LAST_POST_DATE ".$order." ";
1162 else
1163 {
1164 $arSqlOrder["F.SORT"] = " F.SORT ".$order." ";
1165 $by = "SORT";
1166 }
1167 }
1168 if (count($arSqlOrder) > 0)
1169 $strSqlOrder = " ORDER BY ".implode(", ", $arSqlOrder);
1170
1171 if ($bCount || (isset($arAddParams['bDescPageNumbering']) && empty($arAddParams['nTopCount'])))
1172 {
1173 $arCountSqlFrom = $arSqlFrom;
1174 if (isset($arSqlFrom['RENEW']) && (mb_strpos($strSqlSearch, "RENEW.") === false))
1175 unset($arCountSqlFrom['RENEW']);
1176 $strSqlCountFrom = implode(" ", $arCountSqlFrom);
1177
1178 $strSql =
1179 "SELECT COUNT(FORUMCOUNT.ID) as CNT FROM (".
1180 "SELECT F.ID ".
1181 " FROM b_forum F ".
1182 $strSqlCountFrom ." ".
1183 " WHERE (1=1 ".$strSqlSearch.") ".
1184 $strSqlSearchOR.
1185 " GROUP BY F.ID".
1186 ") FORUMCOUNT";
1187
1188 $db_res = $DB->Query($strSql);
1189 $iCnt = 0;
1190 if ($ar_res = $db_res->Fetch())
1191 {
1192 $iCnt = intval($ar_res["CNT"]);
1193 }
1194 if ($bCount)
1195 return $iCnt;
1196 }
1197
1198 if (!$iNum && isset($arAddParams['bDescPageNumbering']) && empty($arAddParams["nTopCount"]) && isset($arAddParams['nav_result']))
1199 {
1200 if (!$arAddParams['nav_result'])
1201 {
1202 $strSubSql =
1203 "SELECT F_FORUM.* ".
1204 "FROM ".
1205 "(SELECT F.ID, FG.SORT ".$strSqlSelect. " ".
1206 "FROM b_forum F ".
1207 $strSqlFrom." ".
1208 "LEFT JOIN b_forum_group FG ON F.FORUM_GROUP_ID = FG.ID ".
1209 "WHERE (1=1 ".$strSqlSearch.") ".
1210 $strSqlSearchOR." ".
1211 "GROUP BY F.ID, FG.SORT".$strSqlGroup. ") F_FORUM ".
1212 "INNER JOIN b_forum F ON (F_FORUM.ID = F.ID) ".
1213 str_replace("FG.SORT", "F_FORUM.SORT", $strSqlOrder);
1214 $db_res = new CDBResult();
1215 $db_res->NavQuery($strSubSql, $iCnt, $arAddParams);
1216 return $db_res;
1217 }
1218 else
1219 {
1220 $db_res = $arAddParams['nav_result'];
1221 }
1222
1223 $arForumID = array();
1224 while($ar_res = $db_res->Fetch())
1225 {
1226 $arForumID[] = $ar_res['ID'];
1227 }
1228 $sForumID = implode(', ', $arForumID);
1229 $strSqlSearch = "(".($sForumID != "" ? "F.ID IN (".$sForumID.") " : "1=1 ").$strSqlSearch.")";
1230 }
1231 else
1232 {
1233 $strSqlSearch = "(1=1 ".$strSqlSearch.")";
1234 }
1235
1236 $arSQL = array("select" => "", "join" => "");
1237 if (!empty($arAddParams["sNameTemplate"]))
1238 {
1239 $arSQL = array_merge_recursive(
1241 $arAddParams, array(
1242 "sUserTablePrefix" => "U_LAST.",
1243 "sForumUserTablePrefix" => "FU_LAST.",
1244 "sFieldName" => "LAST_POSTER_NAME_FRMT",
1245 "sUserIDFieldName" => "F.LAST_POSTER_ID"))),
1247 $arAddParams, array(
1248 "sUserTablePrefix" => "U_ABS_LAST.",
1249 "sForumUserTablePrefix" => "FU_ABS_LAST.",
1250 "sFieldName" => "ABS_LAST_POSTER_NAME_FRMT",
1251 "sUserIDFieldName" => "F.ABS_LAST_POSTER_ID"))));
1252 $arSQL["select"] = ",\n\t".implode(",\n\t", $arSQL["select"]);
1253 $arSQL["join"] = "\n".implode("\n", $arSQL["join"]);
1254 }
1255
1256 $strSql =
1257 "SELECT F_FORUM.*, F.FORUM_GROUP_ID, F.NAME, F.DESCRIPTION, F.SORT, F.ACTIVE,
1258 F.ALLOW_HTML, F.ALLOW_ANCHOR, F.ALLOW_BIU, F.ALLOW_IMG, F.ALLOW_VIDEO,
1259 F.ALLOW_LIST, F.ALLOW_QUOTE, F.ALLOW_CODE, F.ALLOW_FONT, F.ALLOW_SMILES,
1260 F.ALLOW_ALIGN, F.ALLOW_UPLOAD, F.ALLOW_UPLOAD_EXT, F.ALLOW_MOVE_TOPIC,
1261 F.ALLOW_NL2BR, F.ALLOW_TABLE, F.ALLOW_TOPIC_TITLED, F.ALLOW_SIGNATURE,
1262 ".(mb_strpos($strSqlSelect, "PATH2FORUM_MESSAGE") === false ? "'' as PATH2FORUM_MESSAGE," : "")."
1263 F.ASK_GUEST_EMAIL, F.USE_CAPTCHA, F.MODERATION, F.INDEXATION, F.DEDUPLICATION,
1264 F.ORDER_BY, F.ORDER_DIRECTION,
1265 '' as LID, '' as DIR,
1266 F.TOPICS, F.XML_ID,
1267 F.POSTS, F.LAST_POSTER_ID, F.LAST_POSTER_NAME,
1268 ".$DB->DateToCharFunction("F.LAST_POST_DATE", "FULL")." as LAST_POST_DATE,
1269 F.LAST_MESSAGE_ID, FM.TOPIC_ID as TID, F.LAST_MESSAGE_ID as MID,
1270 F.POSTS_UNAPPROVED, F.ABS_LAST_POSTER_ID, F.ABS_LAST_POSTER_NAME,
1271 ".$DB->DateToCharFunction("F.ABS_LAST_POST_DATE", "FULL")." as ABS_LAST_POST_DATE,
1272 F.ABS_LAST_MESSAGE_ID, FM_ABS.TOPIC_ID as ABS_TID,
1273 F.EVENT1, F.EVENT2, F.EVENT3,
1274 FT.TITLE, FT.SOCNET_GROUP_ID, FT.OWNER_ID,
1275 ".CForumNew::Concat("-", array("FT.ID", "FT.TITLE_SEO"))." AS TITLE_SEO,
1276 FT.HTML AS TOPIC_HTML, FM.PARAM1, FM.PARAM2,
1277 FT_ABS.TITLE as ABS_TITLE, FT_ABS.SOCNET_GROUP_ID as ABS_SOCNET_GROUP_ID, FT_ABS.OWNER_ID as ABS_OWNER_ID,
1278 ".CForumNew::Concat("-", array("FT_ABS.ID", "FT_ABS.TITLE_SEO"))." AS ABS_TITLE_SEO,
1279 FT_ABS.HTML AS ABS_TOPIC_HTML, FM_ABS.PARAM1 as ABS_PARAM1, FM_ABS.PARAM2 as ABS_PARAM2,
1280 F.HTML".$arSQL["select"]."
1281 FROM
1282 (
1283 SELECT F.ID ".$strSqlSelect."
1284 FROM b_forum F
1285 ".$strSqlFrom."
1286 WHERE ".$strSqlSearch."
1287 ".$strSqlSearchOR."
1288 GROUP BY F.ID".$strSqlGroup."
1289 ) F_FORUM
1290 INNER JOIN b_forum F ON (F_FORUM.ID = F.ID)".
1291 $arSQL["join"]."
1292 LEFT JOIN b_forum_group FG ON F.FORUM_GROUP_ID = FG.ID
1293 LEFT JOIN b_forum_message FM ON F.LAST_MESSAGE_ID = FM.ID
1294 LEFT JOIN b_forum_topic FT ON FM.TOPIC_ID = FT.ID
1295 LEFT JOIN b_forum_message FM_ABS ON F.ABS_LAST_MESSAGE_ID = FM_ABS.ID
1296 LEFT JOIN b_forum_topic FT_ABS ON FM_ABS.TOPIC_ID = FT_ABS.ID
1297 ".$strSqlOrder;
1298
1299 $iNum = intval($iNum ?: ($arAddParams["nTopCount"] ?? 0));
1300 if ($iNum > 0)
1301 {
1302 $strSql .= " LIMIT 0,".$iNum;
1303 }
1304
1305 $db_res = $DB->Query($strSql);
1306
1307 if (is_set($arAddParams, 'NoFilter') && $arAddParams['NoFilter'] == true)
1308 return $db_res;
1309 return new _CForumDBResult($db_res, $arAddParams);
1310 }
1311
1312 public static function GetForumRenew($data)
1313 {
1314 global $DB, $USER;
1315
1316 $userId = false;
1317 if (array_key_exists("USER_ID", $data) && $data["USER_ID"] > 0)
1318 {
1319 $userId = intval($data["USER_ID"]);
1320 }
1321 else if ($USER->IsAuthorized())
1322 {
1323 $userId = $USER->GetID();
1324 }
1325
1326 $forums = array_key_exists("FORUM_ID", $data) ? $data["FORUM_ID"] : [];
1327 $forums = is_array($forums) ? $forums : [$forums];
1328 array_map("intval", $forums);
1329
1330 if ($userId === false || sizeof($forums) <= 0)
1331 {
1332 return false;
1333 }
1334
1335 $sWhere = "(1=1)";
1336 if (sizeof($forums) > 0)
1337 {
1338 $sWhere = '(BF.ID IN ('.implode(", ", $forums).'))';
1339 }
1340
1341 $strSql = <<<SQL
1342 SELECT BF.ID AS FORUM_ID, COUNT(FT_RENEW.ID) AS TCRENEW
1343 FROM b_forum BF
1344 LEFT JOIN b_forum_user_forum FUF ON (FUF.USER_ID = {$userId} AND FUF.FORUM_ID = BF.ID)
1345 LEFT JOIN b_forum_user_forum FUF_ALL ON (FUF_ALL.USER_ID = {$userId} AND FUF_ALL.FORUM_ID = 0)
1346 LEFT JOIN b_forum_topic FT_RENEW ON
1347 (
1348 BF.ID = FT_RENEW.FORUM_ID AND FT_RENEW.STATE != 'L' AND
1349 (FUF_ALL.LAST_VISIT IS NULL OR FT_RENEW.ABS_LAST_POST_DATE > FUF_ALL.LAST_VISIT)
1350 )
1351 LEFT JOIN b_forum_user_topic FUT_RENEW ON (
1352 FUT_RENEW.FORUM_ID = BF.ID AND FUT_RENEW.TOPIC_ID = FT_RENEW.ID AND FUT_RENEW.USER_ID = {$userId})
1353 WHERE(
1354 {$sWhere}
1355 AND
1356 (
1357 FUT_RENEW.LAST_VISIT IS NULL
1358 AND
1359 (
1360 (FUF_ALL.LAST_VISIT IS NULL AND FUF.LAST_VISIT IS NULL)
1361 OR
1362 (
1363 FUF.LAST_VISIT IS NOT NULL
1364 AND
1365 (FUF.LAST_VISIT < FT_RENEW.ABS_LAST_POST_DATE OR FUF.LAST_VISIT < FT_RENEW.LAST_POST_DATE)
1366 )
1367 OR
1368 (
1369 FUF.LAST_VISIT IS NULL
1370 AND
1371 FUF_ALL.LAST_VISIT IS NOT NULL
1372 AND
1373 (
1374 (
1375 FUF_ALL.LAST_VISIT < FT_RENEW.ABS_LAST_POST_DATE
1376 OR
1377 FUF_ALL.LAST_VISIT < FT_RENEW.LAST_POST_DATE
1378 )
1379 )
1380 )
1381 )
1382 )
1383 OR (
1384 FUT_RENEW.LAST_VISIT IS NOT NULL
1385 AND
1386 (
1387 FUT_RENEW.LAST_VISIT < FT_RENEW.ABS_LAST_POST_DATE
1388 OR
1389 FUT_RENEW.LAST_VISIT < FT_RENEW.LAST_POST_DATE
1390 )
1391 )
1392 )
1393 GROUP BY BF.ID
1394SQL;
1395 $db_res = $DB->Query($strSql);
1396 return $db_res;
1397 }
1398
1399 public static function GetByID($ID)
1400 {
1401 global $DB, $CACHE_MANAGER;
1402 $ID = intval($ID);
1403 $cache_id = "b_forum_".$ID;
1404 if ($ID <= 0):
1405 return false;
1406 elseif (!isset($GLOBALS["FORUM_CACHE"]["FORUM"][$ID]) || !is_array($GLOBALS["FORUM_CACHE"]["FORUM"][$ID])):
1407 $GLOBALS["FORUM_CACHE"]["FORUM"][$ID] = array();
1408 endif;
1409
1410 if (!array_key_exists("MAIN", $GLOBALS["FORUM_CACHE"]["FORUM"][$ID]))
1411 {
1412 if (CACHED_b_forum !== false && $CACHE_MANAGER->Read(CACHED_b_forum, $cache_id, "b_forum"))
1413 {
1414 $GLOBALS["FORUM_CACHE"]["FORUM"][$ID]["MAIN"] = $CACHE_MANAGER->Get($cache_id);
1415 }
1416 else
1417 {
1418 $strSql = "SELECT F.ID, F.NAME, F.DESCRIPTION, F.ACTIVE, F.MODERATION, F.INDEXATION,
1419 F.ALLOW_MOVE_TOPIC, F.DEDUPLICATION,
1420 '' as LID, F.TOPICS, F.POSTS, F.LAST_POSTER_ID, F.LAST_POSTER_NAME,
1421 ".$DB->DateToCharFunction("F.LAST_POST_DATE", "FULL")." as LAST_POST_DATE,
1422 F.LAST_MESSAGE_ID, F.LAST_MESSAGE_ID as MID,
1423 F.POSTS_UNAPPROVED, F.ABS_LAST_POSTER_ID, F.ABS_LAST_POSTER_NAME,
1424 ".$DB->DateToCharFunction("F.ABS_LAST_POST_DATE", "FULL")." as ABS_LAST_POST_DATE,
1425 F.ABS_LAST_MESSAGE_ID, F.SORT, F.ORDER_BY,
1426 F.ORDER_DIRECTION, F.ALLOW_HTML, F.ALLOW_ANCHOR, F.ALLOW_BIU, F.ALLOW_TOPIC_TITLED,
1427 F.ALLOW_IMG, F.ALLOW_VIDEO, F.ALLOW_LIST, F.ALLOW_QUOTE, F.ALLOW_CODE, F.ALLOW_TABLE,
1428 F.ALLOW_ALIGN, F.ALLOW_FONT, F.ALLOW_SMILES, F.ALLOW_UPLOAD, F.EVENT1, F.EVENT2,
1429 F.EVENT3, F.ALLOW_NL2BR, '' as PATH2FORUM_MESSAGE, F.ALLOW_UPLOAD_EXT, F.ALLOW_SIGNATURE,
1430 F.FORUM_GROUP_ID, F.ASK_GUEST_EMAIL, F.USE_CAPTCHA, F.XML_ID
1431 FROM b_forum F
1432 WHERE F.ID = ".$ID;
1433 $db_res = $DB->Query($strSql);
1434
1435 $GLOBALS["FORUM_CACHE"]["FORUM"][$ID]["MAIN"] = $db_res->GetNext();
1436 if (CACHED_b_forum !== false)
1437 $CACHE_MANAGER->Set($cache_id, $GLOBALS["FORUM_CACHE"]["FORUM"][$ID]["MAIN"]);
1438 }
1439 }
1440 return $GLOBALS["FORUM_CACHE"]["FORUM"][$ID]["MAIN"];
1441 }
1442
1443 public static function GetByIDEx($ID, $SITE_ID = false, $arAddParams = array())
1444 {
1445 global $DB, $CACHE_MANAGER;
1446 $ID = intval($ID);
1447 if ($ID <= 0)
1448 {
1449 return false;
1450 }
1451
1452 $SITE_ID = $SITE_ID ?? false;
1453 $key = (empty($SITE_ID) ? "EX" : "EX_PATH_".mb_strtoupper($SITE_ID));
1454
1455 if (!isset($GLOBALS["FORUM_CACHE"]["FORUM"][$ID]))
1456 {
1457 $GLOBALS["FORUM_CACHE"]["FORUM"][$ID] = array();
1458 }
1459
1460 if (!array_key_exists($key, $GLOBALS["FORUM_CACHE"]["FORUM"][$ID]))
1461 {
1462 $cache_id = "b_forum_".$ID.mb_strtolower($key);
1463 if (CACHED_b_forum !== false && $CACHE_MANAGER->Read(CACHED_b_forum, $cache_id, "b_forum"))
1464 {
1465 $GLOBALS["FORUM_CACHE"]["FORUM"][$ID][$key] = $CACHE_MANAGER->Get($cache_id);
1466 }
1467 else
1468 {
1469 $arSQL = array("select" => "", "join" => "");
1470 if (!empty($arAddParams["sNameTemplate"]))
1471 {
1472 $arSQL = array_merge_recursive(
1474 $arAddParams, array(
1475 "sUserTablePrefix" => "U_LAST.",
1476 "sForumUserTablePrefix" => "FU_LAST.",
1477 "sFieldName" => "LAST_POSTER_NAME_FRMT",
1478 "sUserIDFieldName" => "F.LAST_POSTER_ID"))),
1480 $arAddParams, array(
1481 "sUserTablePrefix" => "U_ABS_LAST.",
1482 "sForumUserTablePrefix" => "FU_ABS_LAST.",
1483 "sFieldName" => "ABS_LAST_POSTER_NAME_FRMT",
1484 "sUserIDFieldName" => "F.ABS_LAST_POSTER_ID"))));
1485 $arSQL["select"] = ",\n\t".implode(",\n\t", $arSQL["select"]);
1486 $arSQL["join"] = "\n".implode("\n", $arSQL["join"]);
1487 }
1488 $strSql = "SELECT F.ID, F.NAME, F.DESCRIPTION, F.ACTIVE, F.MODERATION, F.INDEXATION, F.DEDUPLICATION,
1489 F.ALLOW_MOVE_TOPIC, '' as LID, F.TOPICS, F.POSTS, F.LAST_POSTER_ID, F.LAST_POSTER_NAME,
1490 ".$DB->DateToCharFunction("F.LAST_POST_DATE", "FULL")." as LAST_POST_DATE,
1491 F.LAST_MESSAGE_ID, FM.TOPIC_ID as TID, F.LAST_MESSAGE_ID as MID,
1492 F.POSTS_UNAPPROVED, F.ABS_LAST_POSTER_ID, F.ABS_LAST_POSTER_NAME,
1493 ".$DB->DateToCharFunction("F.ABS_LAST_POST_DATE", "FULL")." as ABS_LAST_POST_DATE,
1494 F.ABS_LAST_MESSAGE_ID, FT.TITLE, F.SORT, '' as DIR, F.ORDER_BY, F.ORDER_DIRECTION,
1495 F.ALLOW_HTML, F.ALLOW_ANCHOR, F.ALLOW_BIU, F.ALLOW_TABLE, F.ALLOW_ALIGN, F.ALLOW_SIGNATURE,
1496 F.ALLOW_IMG, F.ALLOW_VIDEO, F.ALLOW_LIST, F.ALLOW_QUOTE, F.ALLOW_CODE, F.ALLOW_TOPIC_TITLED,
1497 F.ALLOW_FONT, F.ALLOW_SMILES, F.ALLOW_UPLOAD, F.EVENT1, F.EVENT2,
1498 F.EVENT3, F.ALLOW_NL2BR, ".(!$SITE_ID ? "''" : "FS.PATH2FORUM_MESSAGE")." as PATH2FORUM_MESSAGE, F.ALLOW_UPLOAD_EXT,
1499 F.FORUM_GROUP_ID, F.ASK_GUEST_EMAIL, F.USE_CAPTCHA, F.HTML, FT.HTML AS TOPIC_HTML, F.XML_ID".$arSQL["select"]."
1500 FROM b_forum F
1501 LEFT JOIN b_forum_group FG ON (F.FORUM_GROUP_ID = FG.ID) ".
1502 (!$SITE_ID ? "" : "
1503 LEFT JOIN b_forum2site FS ON (F.ID = FS.FORUM_ID AND FS.SITE_ID = '".$DB->ForSql($SITE_ID)."') ").
1504 $arSQL["join"]."
1505 LEFT JOIN b_forum_message FM ON (F.LAST_MESSAGE_ID = FM.ID)
1506 LEFT JOIN b_forum_topic FT ON (FM.TOPIC_ID = FT.ID)
1507 WHERE (F.ID=".$ID.")";
1508 $db_res = $DB->Query($strSql);
1509 $db_res = new _CForumDBResult($db_res, $arAddParams);
1510 $GLOBALS["FORUM_CACHE"]["FORUM"][$ID][$key] = $db_res->Fetch();
1511 if (CACHED_b_forum !== false)
1512 $CACHE_MANAGER->Set($cache_id, $GLOBALS["FORUM_CACHE"]["FORUM"][$ID][$key]);
1513 }
1514 }
1515 return $GLOBALS["FORUM_CACHE"]["FORUM"][$ID][$key];
1516 }
1517
1518 //---------------> Forum labels
1519 public static function InitReadLabels($ID, $arUserGroups) // out-of-date function
1520 {
1521 $ID = intval($ID);
1522 if ($ID <= 0)
1523 return false;
1524
1525 $arForumCookie = array();
1526 $iCurFirstReadForum = 0;
1527
1528 $read_forum_cookie = COption::GetOptionString("main", "cookie_name", "BITRIX_SM")."_FORUM_0";
1529 if (isset($_COOKIE[$read_forum_cookie]) && $_COOKIE[$read_forum_cookie] <> '')
1530 {
1531 $arForumCookie = explode("/", $_COOKIE[$read_forum_cookie]);
1532 $i = 0;
1533 while ($i < count($arForumCookie))
1534 {
1535 if (intval($arForumCookie[$i]) == $ID)
1536 {
1537 $iCurFirstReadForum = intval($arForumCookie[$i+1]);
1538 break;
1539 }
1540 $i += 2;
1541 }
1542 }
1543
1544 $read_forum_cookie1 = COption::GetOptionString("main", "cookie_name", "BITRIX_SM")."_FORUM_".$ID;
1545 if (isset($_COOKIE[$read_forum_cookie1]) && intval($_COOKIE[$read_forum_cookie1]) > 0)
1546 {
1547 if ($iCurFirstReadForum < intval($_COOKIE[$read_forum_cookie1]))
1548 {
1549 $iCurFirstReadForum = intval($_COOKIE[$read_forum_cookie1]);
1550 }
1551 }
1552
1553 if ($_SESSION["first_read_forum_".$ID] == '' || intval($_SESSION["first_read_forum_".$ID])<0)
1554 {
1555 $_SESSION["first_read_forum_".$ID] = $iCurFirstReadForum;
1556 }
1557
1558 if (is_null($_SESSION["read_forum_".$ID]) || $_SESSION["read_forum_".$ID] == '')
1559 {
1560 $_SESSION["read_forum_".$ID] = "0";
1561 }
1562
1563 $iLastPostID = 0;
1564 $strPerms = CForumNew::GetUserPermission($ID, $arUserGroups);
1565 if ($strPerms > "Q"):
1566 $db_res = CForumMessage::GetList(array("ID"=>"DESC"), array("FORUM_ID" => $ID, "APPROVED" => "N"), false, 1);
1567 if ($db_res && $res = $db_res->Fetch()):
1568 $iLastPostID = intval($res["ID"]);
1569 endif;
1570 endif;
1571 if ($iLastPostID <= 0):
1573 $iLastPostID = intval($res["LAST_MESSAGE_ID"]);
1574 endif;
1575
1576 if ($iLastPostID > 0)
1577 {
1578 $i = 0;
1579 $arCookieVal = array();
1580 while ($i < count($arForumCookie))
1581 {
1582 if (intval($arForumCookie[$i]) != $ID)
1583 {
1584 $arCookieVal[] = intval($arForumCookie[$i])."/".intval($arForumCookie[$i + 1]);
1585 }
1586 $i += 2;
1587 }
1588 $arCookieVal[] = $ID."/".$iLastPostID;
1589
1590 //$GLOBALS["APPLICATION"]->set_cookie($read_forum_cookie, $strCookieVal, false, "/", false, false, "Y", "");
1591 $GLOBALS["APPLICATION"]->set_cookie("FORUM_0", implode("/", $arCookieVal), false, "/", false, false, "Y", false);
1592 }
1593 return true;
1594 }
1595
1596 public static function SetLabelsBeRead($ID, $arUserGroups) // out-of-date function
1597 {
1598 $ID = intval($ID);
1599 $_SESSION["read_forum_".$ID] = "0";
1600 $strPerms = CForumNew::GetUserPermission($ID, $arUserGroups);
1601 $iCurFirstReadForum = 0;
1602 if ($strPerms > "Q"):
1603 $db_res = CForumMessage::GetList(array("ID"=>"DESC"), array("FORUM_ID" => $ID, "APPROVED" => "N"), false, 1);
1604 if ($db_res && $res = $db_res->Fetch()):
1605 $iCurFirstReadForum = intval($res["ID"]);
1606 endif;
1607 endif;
1609 $iCurFirstReadForum = intval($res["LAST_MESSAGE_ID"]);
1610 $_SESSION["first_read_forum_".$ID] = $iCurFirstReadForum;
1611
1612 $arForumCookie = array();
1613 $read_forum_cookie = COption::GetOptionString("main", "cookie_name", "BITRIX_SM")."_FORUM_0";
1614 if (isset($_COOKIE[$read_forum_cookie]) && $_COOKIE[$read_forum_cookie] <> '')
1615 {
1616 $arForumCookie = explode("/", $_COOKIE[$read_forum_cookie]);
1617 }
1618
1619 $i = 0;
1620 $arCookieVal = array();
1621 while ($i < count($arForumCookie))
1622 {
1623 if (intval($arForumCookie[$i])!=$ID)
1624 {
1625 $arCookieVal[] = intval($arForumCookie[$i])."/".intval($arForumCookie[$i+1]);
1626 }
1627 $i += 2;
1628 }
1629 $arCookieVal[] = $ID."/".$iCurFirstReadForum;
1630
1631 $_COOKIE[$read_forum_cookie] = implode("/", $arCookieVal);
1632// $GLOBALS["APPLICATION"]->set_cookie($read_forum_cookie, $strCookieVal, false, "/", false, false, "Y", "");
1633 $GLOBALS["APPLICATION"]->set_cookie("FORUM_0", implode("/", $arCookieVal), false, "/", false, false, "Y", false);
1634 return true;
1635 }
1636
1637 //---------------> Forum utils
1638 public static function SetStat($ID = 0, $arParams = array())
1639 {
1640 $enableCalculateStatistics = COption::GetOptionString('forum', 'enable_calculate_statistics', 'Y');
1641 if ($enableCalculateStatistics === 'N')
1642 {
1643 return;
1644 }
1645 global $DB;
1646 $ID = intval($ID);
1647 if ($ID <= 0):
1648 return false;
1649 endif;
1650 $arParams = (is_array($arParams) ? $arParams : array());
1651 $arMessage = !empty($arParams['MESSAGE']['FORUM_ID']) && $arParams['MESSAGE']['FORUM_ID'] == $ID
1652 ? $arParams['MESSAGE'] : []
1653 ;
1654
1655 $arForum = CForumNew::GetByID($ID);
1656
1657 $arParams["ACTION"] = isset($arParams["ACTION"]) && ($arParams["ACTION"] == "DECREMENT" || $arParams["ACTION"] == "UPDATE") ? $arParams["ACTION"] : "INCREMENT";
1658 $arParams["POSTS"] = intval(isset($arParams["POSTS"]) && $arParams["POSTS"] > 0 ? $arParams["POSTS"] : 1);
1659
1660 $arFields = array();
1661
1662 if (empty($arMessage))
1663 {
1664 // full recount
1665 }
1666 elseif ($arParams["ACTION"] == "INCREMENT")
1667 {
1668 if ($arMessage["ID"] > $arForum["ABS_LAST_MESSAGE_ID"]):
1669 $arFields["ABS_LAST_POSTER_ID"] = ((intval($arMessage["AUTHOR_ID"])>0) ? $arMessage["AUTHOR_ID"] : false);
1670 $arFields["ABS_LAST_POSTER_NAME"] = $arMessage["AUTHOR_NAME"];
1671 $arFields["ABS_LAST_POST_DATE"] = $arMessage["POST_DATE"];
1672 $arFields["ABS_LAST_MESSAGE_ID"] = $arMessage["ID"];
1673 if ($arMessage["APPROVED"] == "Y"):
1674 $arFields["LAST_POSTER_ID"] = $arFields["ABS_LAST_POSTER_ID"];
1675 $arFields["LAST_POSTER_NAME"] = $arFields["ABS_LAST_POSTER_NAME"];
1676 $arFields["LAST_POST_DATE"] = $arFields["ABS_LAST_POST_DATE"];
1677 $arFields["LAST_MESSAGE_ID"] = $arFields["ABS_LAST_MESSAGE_ID"];
1678 endif;
1679 endif;
1680
1681 if ($arMessage["APPROVED"] == "Y"):
1682 $arFields["=POSTS"] = "POSTS+1";
1683 if ($arMessage["NEW_TOPIC"] == "Y"):
1684 $arFields["=TOPICS"] = "TOPICS+1";
1685 endif;
1686 else:
1687 $arFields["=POSTS_UNAPPROVED"] = "POSTS_UNAPPROVED+1";
1688 endif;
1689 }
1690 elseif ($arMessage["ID"] > $arForum["ABS_LAST_MESSAGE_ID"])
1691 {
1692 // full recount
1693 }
1694 elseif ($arParams["ACTION"] == "DECREMENT" &&
1695 ($arMessage["ID"] == $arForum["ABS_LAST_MESSAGE_ID"] || $arMessage["ID"] == $arForum["LAST_MESSAGE_ID"]) &&
1696 !IsModuleInstalled('bitrix24'))
1697 {
1698 // full recount
1699 }
1700 elseif ($arParams["ACTION"] == "DECREMENT")
1701 {
1702 if ($arMessage["APPROVED"] == "Y"):
1703 $arFields["=POSTS"] = "POSTS-1";
1704 if ($arMessage["NEW_TOPIC"] == "Y"):
1705 $arFields["=TOPICS"] = "TOPICS-1";
1706 endif;
1707 else:
1708 $arFields["=POSTS_UNAPPROVED"] = "POSTS_UNAPPROVED-1";
1709 endif;
1710 }
1711 elseif ($arParams["ACTION"] == "UPDATE")
1712 {
1713 if ($arMessage["APPROVED"] == "Y"):
1714 if ($arMessage["ID"] > $arForum["LAST_MESSAGE_ID"]):
1715 $arFields["LAST_POSTER_ID"] = ((intval($arMessage["AUTHOR_ID"])>0) ? $arMessage["AUTHOR_ID"] : false);
1716 $arFields["LAST_POSTER_NAME"] = $arMessage["AUTHOR_NAME"];
1717 $arFields["LAST_POST_DATE"] = $arMessage["POST_DATE"];
1718 $arFields["LAST_MESSAGE_ID"] = $arMessage["ID"];
1719 endif;
1720 $arFields["=POSTS"] = "POSTS+1";
1721 $arFields["=POSTS_UNAPPROVED"] = "POSTS_UNAPPROVED-1";
1722 if ($arMessage["NEW_TOPIC"] == "Y"):
1723 $arFields["=TOPICS"] = "TOPICS+1";
1724 endif;
1725 elseif ($arMessage["ID"] != $arForum["LAST_MESSAGE_ID"]):
1726 $arFields["=POSTS"] = "POSTS-1";
1727 $arFields["=POSTS_UNAPPROVED"] = "POSTS_UNAPPROVED+1";
1728 if ($arMessage["NEW_TOPIC"] == "Y"):
1729 $arFields["=TOPICS"] = "TOPICS-1";
1730 endif;
1731 endif;
1732 }
1733
1734 if (empty($arFields))
1735 {
1736 $res = CForumMessage::GetList(array(), array("FORUM_ID" => $ID), "cnt_not_approved");
1737 $res = (is_array($res) ? $res : array());
1738 $res["CNT"] = intval($res["CNT"]) - intval($res["CNT_NOT_APPROVED"]);
1739 $res["CNT"] = ($res["CNT"] > 0 ? $res["CNT"] : 0);
1740
1741 $arFields = array(
1742 "TOPICS" => CForumTopic::GetList(array(), array("FORUM_ID" => $ID, "APPROVED" => "Y"), true),
1743 "POSTS" => $res["CNT"],
1744 "LAST_POSTER_ID" => false,
1745 "LAST_POSTER_NAME" => false,
1746 "LAST_POST_DATE" => false,
1747 "LAST_MESSAGE_ID" => intval($res["LAST_MESSAGE_ID"]),
1748 "POSTS_UNAPPROVED" => intval($res["CNT_NOT_APPROVED"]),
1749 "ABS_LAST_POSTER_ID" => false,
1750 "ABS_LAST_POSTER_NAME" => false,
1751 "ABS_LAST_POST_DATE" => false,
1752 "ABS_LAST_MESSAGE_ID" => intval($res["ABS_LAST_MESSAGE_ID"]));
1753 if ($arFields["ABS_LAST_MESSAGE_ID"] > 0):
1754 $res = CForumMessage::GetByID($arFields["ABS_LAST_MESSAGE_ID"], array("FILTER" => "N"));
1755 $arFields["ABS_LAST_POSTER_ID"] = (intval($res["AUTHOR_ID"]) > 0 ? $res["AUTHOR_ID"] : false);
1756 $arFields["ABS_LAST_POSTER_NAME"] = $res["AUTHOR_NAME"];
1757 $arFields["ABS_LAST_POST_DATE"] = $res["POST_DATE"];
1758 if (intval($arFields["LAST_MESSAGE_ID"]) > 0):
1759 if ($arFields["LAST_MESSAGE_ID"] < $arFields["ABS_LAST_MESSAGE_ID"]):
1760 $res = CForumMessage::GetByID($arFields["LAST_MESSAGE_ID"], array("FILTER" => "N"));
1761 endif;
1762 $arFields["LAST_POSTER_ID"] = (intval($res["AUTHOR_ID"]) > 0 ? $res["AUTHOR_ID"] : false);
1763 $arFields["LAST_POSTER_NAME"] = $res["AUTHOR_NAME"];
1764 $arFields["LAST_POST_DATE"] = $res["POST_DATE"];
1765 endif;
1766 endif;
1767 }
1768
1769 if (!CForumNew::CheckFields("UPDATE", $arFields))
1770 return false;
1771
1772 $strUpdate = $DB->PrepareUpdate("b_forum", $arFields);
1773 if (!empty($arFields)):
1774 $res = array();
1775 foreach ($arFields as $key => $val):
1776 if (mb_substr($key, 0, 1) == "="):
1777 $key = mb_substr($key, 1);
1778 if (!empty($key)):
1779 $res[] = $key."=".(empty($val) ? $key."+1" : $val);
1780 endif;
1781 endif;
1782 endforeach;
1783 if (!empty($res)):
1784 $strUpdate = (empty($strUpdate) ? "" : $strUpdate.",");
1785 $strUpdate .= implode(", ", $res);
1786 endif;
1787 endif;
1788
1789 if (empty($strUpdate))
1790 return false;
1791 $strSql = "UPDATE b_forum SET ".$strUpdate." WHERE ID=".$ID;
1792 return $DB->Query($strSql);
1793 }
1794
1801 public static function PreparePath2Message($strPath, $arVals = array())
1802 {
1803 if (!is_array($arVals))
1804 {
1805 $arVals = array();
1806 }
1807
1808 $pattern = array(
1809 '#MESSAGE_ID#' => $arVals['MESSAGE_ID'] ?? null,
1810 '#MID#' => $arVals['MESSAGE_ID'] ?? null,
1811 '#TOPIC_ID#' => $arVals['TOPIC_ID'] ?? null,
1812 '#TID#' => $arVals['TOPIC_ID'] ?? null,
1813 '#TITLE_SEO#' => $arVals['TITLE_SEO'] ?? null,
1814 '#FORUM_ID#' => $arVals['FORUM_ID'] ?? null,
1815 '#FID#' => $arVals['FORUM_ID'] ?? null,
1816 '#PARAM1#' => $arVals['PARAM1'] ?? null,
1817 '#PARAM2#' => $arVals['PARAM2'] ?? null,
1818 '#SOCNET_GROUP_ID#' => $arVals['SOCNET_GROUP_ID'] ?? null,
1819 '#OWNER_ID#' => $arVals['OWNER_ID'] ?? null
1820 );
1821 if ($strPath === NULL)
1822 {
1823 return array_keys($pattern);
1824 }
1825 $strPath = trim($strPath);
1826 if ($strPath == '')
1827 {
1828 return '';
1829 }
1830 $strPath = preg_replace('/([^:])(\/{2,})/', '$1/', $strPath);
1831 $strPath = str_replace(
1832 array_keys($pattern),
1833 array_values($pattern),
1834 $strPath
1835 );
1836 return $strPath;
1837 }
1838
1839 //---------------> Forum actions
1840 public static function OnGroupDelete($GROUP_ID)
1841 {
1842 global $DB;
1843 return $DB->Query("DELETE FROM b_forum_perms WHERE GROUP_ID=".intval($GROUP_ID), true);
1844 }
1845
1846 public static function OnBeforeLangDelete($lang)
1847 {
1848 global $DB;
1849 $r = CForumNew::GetList(array(), array("LID"=>$lang));
1850 return ($r->Fetch()?false:true);
1851 }
1852
1853 public static function OnPanelCreate() // out-of-date function
1854 {
1855 return false;
1856 }
1857
1858 public static function OnReindex($NS = array(), $oCallback = NULL, $callback_method = "")
1859 {
1860 return CForumNew::reindex($NS, $oCallback, $callback_method);
1861 }
1862
1863 public static function ShowPanel($FID, $TID=0, $bGetIcons=false)
1864 {
1865 global $APPLICATION, $USER;
1866
1867 if(!(($USER->IsAuthorized() || $APPLICATION->ShowPanel===true) && $APPLICATION->ShowPanel!==false))
1868 return;
1869 if (!CModule::IncludeModule("forum"))
1870 return;
1871 $arButtons = array();
1872
1873 $module_permission = $APPLICATION->GetGroupRight("forum");
1874 if ($module_permission > "D")
1875 {
1876 $arButtons[] = array(
1877 "TEXT" => GetMessage("F_FORUMS_LIST"),
1878 "IMAGE" => "/bitrix/images/forum/toolbar_button1.gif",
1879 "ACTION" => "jsUtils.Redirect(arguments, '/bitrix/admin/forum_admin.php')");
1880
1881 if ($module_permission >= "W" && intval($FID) > 0 &&
1882 CForumNew::CanUserUpdateForum($FID, $USER->GetUserGroupArray(), $USER->GetID()))
1883 {
1884 $arButtons[] = array(
1885 "TEXT" => GetMessage("F_FORUM_EDIT"),
1886 "IMAGE" => "/bitrix/images/forum/toolbar_button2.gif",
1887 "ACTION" => "jsUtils.Redirect(arguments, '/bitrix/admin/forum_edit.php?ID=".intval($FID)."')");
1888 }
1889 }
1890 if (!empty($arButtons))
1891 {
1892 $arButton = array(
1893 "SRC" => "/bitrix/images/forum/toolbar_button1.gif",
1894 "ALT" => GetMessage("F_FORUM_TITLE"),
1895 "TEXT" => GetMessage("F_FORUM"),
1896 "MAIN_SORT" => 300,
1897 "MENU" => $arButtons,
1898 "MODE" => 'configure');
1899 $APPLICATION->AddPanelButton($arButton);
1900 }
1901 }
1902
1903 public static function ClearHTML($ID)
1904 {
1905 global $DB;
1906 $ID = intval($ID);
1907 $strSql = "UPDATE b_forum_message SET POST_MESSAGE_HTML='', POST_MESSAGE_FILTER='', HTML = '' WHERE FORUM_ID=".$ID;
1908 $DB->Query($strSql);
1909 return true;
1910
1911 }
1912}
1913
1914/**********************************************************************/
1915/************** FORUM GROUP *******************************************/
1916/**********************************************************************/
1918{
1919 //---------------> User insert, update, delete
1920 public static function CanUserAddGroup($arUserGroups)
1921 {
1922 return CForumUser::IsAdmin($arUserGroups);
1923 }
1924
1925 public static function CanUserUpdateGroup($ID, $arUserGroups)
1926 {
1927 return CForumUser::IsAdmin($arUserGroups);
1928 }
1929
1930 public static function CanUserDeleteGroup($ID, $arUserGroups)
1931 {
1932 return CForumUser::IsAdmin($arUserGroups);
1933 }
1934
1935 public static function CheckFields($ACTION, &$arFields, $ID = false)
1936 {
1937 $aMsg = array();
1938
1939 if (is_set($arFields, "LANG") || $ACTION=="ADD")
1940 {
1941 $res = (is_array($arFields["LANG"]) ? $arFields["LANG"] : array());
1942 foreach ($res as $i => $val)
1943 {
1944 if (empty($res[$i]["LID"]) || empty($res[$i]["NAME"]))
1945 {
1946 unset($res[$i]);
1947 }
1948 }
1949 $db_lang = CLanguage::GetList("sort", "asc", ["ACTIVE" => "Y"]);
1950 while ($arLang = $db_lang->Fetch())
1951 {
1952 $bFound = false;
1953 foreach ($res as $i => $val)
1954 {
1955 if (($res[$i]["LID"]==$arLang["LID"]) && (trim($res[$i]["NAME"]) !== ""))
1956 $bFound = true;
1957 }
1958 if (!$bFound)
1959 {
1960 $aMsg[] = array(
1961 "id"=>'FORUM_GROUP[LANG]['.$arLang["LID"].'][NAME]',
1962 "text" => GetMessage("FG_ERROR_EMPTY_LID",
1963 array("#LID#" => $arLang["LID"], "#LID_NAME#" => $arLang["NAME"])));
1964 }
1965 }
1966 }
1967
1968 if ((is_set($arFields, "SORT") || $ACTION=="ADD") && intval($arFields["SORT"])<=0) $arFields["SORT"] = 150;
1969 if ((is_set($arFields, "PARENT_ID") || $ACTION=="ADD")) $arFields["PARENT_ID"] = (intval($arFields["PARENT_ID"]) > 0 ? intval($arFields["PARENT_ID"]) : false);
1970 if ($arFields["PARENT_ID"])
1971 {
1972 if ($ACTION != "ADD" && $ID == $arFields["PARENT_ID"])
1973 {
1974 $aMsg[] = array(
1975 "id" => 'FORUM_GROUP[PARENT_ID]',
1976 "text" => GetMessage("FG_ERROR_SELF_PARENT_ID"));
1977 }
1978 else
1979 {
1980 $res = CForumGroup::GetByID($arFields["PARENT_ID"]);
1981 if (!$res)
1982 {
1983 $aMsg[] = array(
1984 "id" => 'FORUM_GROUP[PARENT_ID]',
1985 "text" => GetMessage("FG_ERROR_EMPTY_PARENT_ID"));
1986 }
1987 elseif ($ACTION != "ADD")
1988 {
1989 $res1 = CForumGroup::GetByID($ID);
1990 if ($res1["LEFT_MARGIN"] < $res["LEFT_MARGIN"] && $res["RIGHT_MARGIN"] < $res1["RIGHT_MARGIN"])
1991 $aMsg[] = array(
1992 "id" => 'FORUM_GROUP[PARENT_ID]',
1993 "text" => GetMessage("FG_ERROR_PARENT_ID_IS_CHILD"));
1994 }
1995 }
1996 }
1997 if(!empty($aMsg))
1998 {
1999 $e = new CAdminException(array_reverse($aMsg));
2000 $GLOBALS["APPLICATION"]->ThrowException($e);
2001 return false;
2002 }
2003 return true;
2004 }
2005
2006 public static function Delete($ID)
2007 {
2008 global $DB;
2009 $ID = intval($ID);
2010 $aMsg = array();
2011 $res = CForumGroup::GetByIDEx($ID, LANGUAGE_ID);
2012 if (!$res)
2013 return true;
2014
2015 $db_res = CForumGroup::GetList(array(), array("PARENT_ID" => $ID));
2016 if ($db_res->Fetch())
2017 $aMsg[] = array(
2018 "id" => 'FORUM_GROUP_GROUPS',
2019 "text" => str_replace(array("#GROUP_NAME#", "#GROUP_ID#"), array($res["NAME"], $ID), GetMessage("FG_ERROR_CONTENT_GROUP")));
2020 $db_res = CForumNew::GetList(array(), array("FORUM_GROUP_ID" => $ID));
2021 if ($db_res->Fetch())
2022 $aMsg[] = array(
2023 "id" => 'FORUM_GROUP_FORUMS',
2024 "text" => str_replace(array("#GROUP_NAME#", "#GROUP_ID#"), array($res["NAME"], $ID), GetMessage("FG_ERROR_CONTENT_FORUM")));
2025 if(!empty($aMsg))
2026 {
2027 $e = new CAdminException(array_reverse($aMsg));
2028 $GLOBALS["APPLICATION"]->ThrowException($e);
2029 return false;
2030 }
2031 if(CACHED_b_forum_group !== false)
2032 $GLOBALS["CACHE_MANAGER"]->CleanDir("b_forum_group");
2033 $DB->Query("DELETE FROM b_forum_group_lang WHERE FORUM_GROUP_ID = ".$ID, true);
2034 $DB->Query("DELETE FROM b_forum_group WHERE ID = ".$ID, true);
2036
2037 return true;
2038 }
2039
2040 public static function GetList($arOrder = array("SORT"=>"ASC"), $arFilter = array())
2041 {
2042 global $DB;
2043 $arSqlSearch = Array();
2044 $strSqlSearch = "";
2045 $arSqlOrder = Array();
2046 $strSqlOrder = "";
2047 $arFilter = (is_array($arFilter) ? $arFilter : array());
2048
2049 foreach ($arFilter as $key => $val)
2050 {
2052 $key = mb_strtoupper($key_res["FIELD"]);
2053 $strNegative = $key_res["NEGATIVE"];
2054 $strOperation = $key_res["OPERATION"];
2055
2056 switch ($key)
2057 {
2058 case "ID":
2059 case "SORT":
2060 case "PARENT_ID":
2061 case "LEFT_MARGIN":
2062 case "RIGHT_MARGIN":
2063 case "DEPTH_LEVEL":
2064 if (intval($val)<=0)
2065 $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FR.".$key." IS NULL OR FR.".$key."<=0)";
2066 else
2067 $arSqlSearch[] = ($strNegative=="Y"?" FR.".$key." IS NULL OR NOT ":"")."(FR.".$key." ".$strOperation." ".intval($val)." )";
2068 break;
2069 }
2070 }
2071 if (!empty($arSqlSearch))
2072 $strSqlSearch = "WHERE (".implode(") AND (", $arSqlSearch).") ";
2073
2074 foreach ($arOrder as $by=>$order)
2075 {
2076 $by = mb_strtoupper($by);
2077 $order = mb_strtoupper($order);
2078 if ($order!="ASC") $order = "DESC";
2079
2080 if ($by == "ID") $arSqlOrder[] = " FR.ID ".$order." ";
2081 elseif ($by == "LEFT_MARGIN") $arSqlOrder[] = " FR.LEFT_MARGIN ".$order." ";
2082 else
2083 {
2084 $arSqlOrder[] = " FR.SORT ".$order." ";
2085 $by = "SORT";
2086 }
2087 }
2088 DelDuplicateSort($arSqlOrder);
2089 if (!empty($arSqlOrder))
2090 $strSqlOrder = " ORDER BY ".implode(", ", $arSqlOrder);
2091
2092 $strSql =
2093 "SELECT FR.ID, FR.SORT, FR.PARENT_ID, FR.LEFT_MARGIN, FR.RIGHT_MARGIN, FR.DEPTH_LEVEL ".
2094 "FROM b_forum_group FR ".
2095 $strSqlSearch." ".
2096 $strSqlOrder." ";
2097
2098 $db_res = $DB->Query($strSql);
2099 return $db_res;
2100 }
2101
2102 public static function GetListEx($arOrder = array("SORT"=>"ASC"), $arFilter = array())
2103 {
2104 global $DB;
2105 $arSqlSearch = Array();
2106 $strSqlSearch = "";
2107 $arSqlOrder = Array();
2108 $strSqlOrder = "";
2109 $arFilter = (is_array($arFilter) ? $arFilter : array());
2110
2111 foreach ($arFilter as $key => $val)
2112 {
2114 $key = mb_strtoupper($key_res["FIELD"]);
2115 $strNegative = $key_res["NEGATIVE"];
2116 $strOperation = $key_res["OPERATION"];
2117
2118 switch ($key)
2119 {
2120 case "ID":
2121 case "SORT":
2122 case "PARENT_ID":
2123 case "LEFT_MARGIN":
2124 case "RIGHT_MARGIN":
2125 case "DEPTH_LEVEL":
2126 if (intval($val)<=0)
2127 $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FR.".$key." IS NULL OR FR.".$key."<=0)";
2128 else
2129 $arSqlSearch[] = ($strNegative=="Y"?" FR.".$key." IS NULL OR NOT ":"")."(FR.".$key." ".$strOperation." ".intval($val)." )";
2130 break;
2131 case "LID":
2132 if ($val == '')
2133 $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FRL.LID IS NULL OR ".($DB->type == "MSSQL" ? "LEN" : "LENGTH")."(FRL.LID)<=0)";
2134 else
2135 $arSqlSearch[] = ($strNegative=="Y"?" FRL.LID IS NULL OR NOT ":"")."(FRL.LID ".$strOperation." '".$DB->ForSql($val)."' )";
2136 break;
2137 }
2138 }
2139 if (!empty($arSqlSearch))
2140 $strSqlSearch = " WHERE (".implode(") AND (", $arSqlSearch).") ";
2141
2142 foreach ($arOrder as $by=>$order)
2143 {
2144 $by = mb_strtoupper($by);
2145 $order = mb_strtoupper($order);
2146 if ($order!="ASC") $order = "DESC";
2147
2148 if ($by == "ID") $arSqlOrder[] = " FR.ID ".$order." ";
2149 elseif ($by == "LID") $arSqlOrder[] = " FRL.LID ".$order." ";
2150 elseif ($by == "NAME") $arSqlOrder[] = " FRL.NAME ".$order." ";
2151 elseif ($by == "LEFT_MARGIN") $arSqlOrder[] = " FR.LEFT_MARGIN ".$order." ";
2152 else
2153 {
2154 $arSqlOrder[] = " FR.SORT ".$order." ";
2155 $by = "SORT";
2156 }
2157 }
2158 DelDuplicateSort($arSqlOrder);
2159
2160 if (!empty($arSqlOrder))
2161 $strSqlOrder = "ORDER BY ".implode(", ", $arSqlOrder);
2162
2163 $strSql =
2164 "SELECT FR.ID, FR.SORT, FR.PARENT_ID, FR.LEFT_MARGIN, FR.RIGHT_MARGIN, FR.DEPTH_LEVEL, FRL.LID, FRL.NAME, FRL.DESCRIPTION ".
2165 "FROM b_forum_group FR ".
2166 " LEFT JOIN b_forum_group_lang FRL ON FR.ID = FRL.FORUM_GROUP_ID ".
2167 $strSqlSearch." ".
2168 $strSqlOrder." ";
2169
2170 $db_res = $DB->Query($strSql);
2171 return $db_res;
2172 }
2173
2174 public static function GetByID($ID)
2175 {
2176 global $DB;
2177 $ID = intval($ID);
2178 $strSql =
2179 "SELECT FR.ID, FR.SORT, FR.PARENT_ID, FR.LEFT_MARGIN, FR.RIGHT_MARGIN, FR.DEPTH_LEVEL FROM b_forum_group FR WHERE FR.ID = ".$ID."";
2180 $db_res = $DB->Query($strSql);
2181
2182 if ($res = $db_res->Fetch())
2183 {
2184 return $res;
2185 }
2186 return false;
2187 }
2188
2189 public static function GetByIDEx($ID, $LANGUAGE_ID)
2190 {
2191 global $DB, $CACHE_MANAGER;
2192 $ID = intval($ID);
2193 $LANGUAGE_ID = (!empty($LANGUAGE_ID) ? $LANGUAGE_ID : LANGUAGE_ID);
2194 $key = $ID."_".$LANGUAGE_ID;
2195 $cache_id = "b_forum_group".$key;
2196 if ($ID <= 0):
2197 return false;
2198 elseif (!isset($GLOBALS["FORUM_CACHE"]["GROUP"]) || !is_array($GLOBALS["FORUM_CACHE"]["GROUP"])):
2199 $GLOBALS["FORUM_CACHE"]["GROUP"] = array();
2200 endif;
2201
2202 if (!array_key_exists($key, $GLOBALS["FORUM_CACHE"]["GROUP"]))
2203 {
2204 if (CACHED_b_forum_group !== false && $CACHE_MANAGER->Read(CACHED_b_forum_group, $cache_id, "b_forum_group"))
2205 {
2206 $GLOBALS["FORUM_CACHE"]["GROUP"][$key] = $CACHE_MANAGER->Get($cache_id);
2207 }
2208 else
2209 {
2210 $strSql = "SELECT FR.ID, FRL.LID, FRL.NAME, FR.SORT, FRL.DESCRIPTION,
2211 FR.PARENT_ID, FR.LEFT_MARGIN, FR.RIGHT_MARGIN, FR.DEPTH_LEVEL ".
2212 "FROM b_forum_group FR ".
2213 " LEFT JOIN b_forum_group_lang FRL ON (FR.ID = FRL.FORUM_GROUP_ID AND FRL.LID = '".$DB->ForSql($LANGUAGE_ID)."') ".
2214 "WHERE FR.ID = ".$ID."";
2215 $db_res = $DB->Query($strSql);
2216 $GLOBALS["FORUM_CACHE"]["GROUP"][$key] = $db_res->Fetch();
2217 if (CACHED_b_forum_group !== false)
2218 $CACHE_MANAGER->Set($cache_id, $GLOBALS["FORUM_CACHE"]["GROUP"][$key]);
2219 }
2220 }
2221 return $GLOBALS["FORUM_CACHE"]["GROUP"][$key];
2222 }
2223
2224 public static function GetLangByID($FORUM_GROUP_ID, $strLang)
2225 {
2226 global $DB;
2227 $FORUM_GROUP_ID = intval($FORUM_GROUP_ID);
2228
2229 $strSql =
2230 "SELECT FRL.ID, FRL.FORUM_GROUP_ID, FRL.LID, FRL.NAME, FRL.DESCRIPTION ".
2231 "FROM b_forum_group_lang FRL ".
2232 "WHERE FRL.FORUM_GROUP_ID = ".$FORUM_GROUP_ID." ".
2233 " AND FRL.LID = '".$DB->ForSql($strLang)."' ";
2234 $db_res = $DB->Query($strSql);
2235
2236 if ($res = $db_res->Fetch())
2237 {
2238 return $res;
2239 }
2240 return false;
2241 }
2242
2243 public static function GetByLang($LANGUAGE_ID)
2244 {
2245 global $CACHE_MANAGER;
2246 $LANGUAGE_ID = (!empty($LANGUAGE_ID) ? $LANGUAGE_ID : LANGUAGE_ID);
2247 $cache_id = "b_forum_group".$LANGUAGE_ID;
2248
2249 if (!isset($GLOBALS["FORUM_CACHE"]["GROUPS"])):
2250 $GLOBALS["FORUM_CACHE"]["GROUPS"] = array();
2251 endif;
2252
2253 if (!array_key_exists($LANGUAGE_ID, $GLOBALS["FORUM_CACHE"]["GROUPS"]))
2254 {
2255 if (CACHED_b_forum_group !== false && $CACHE_MANAGER->Read(CACHED_b_forum_group, $cache_id, "b_forum_group"))
2256 {
2257 $GLOBALS["FORUM_CACHE"]["GROUPS"][$LANGUAGE_ID] = $CACHE_MANAGER->Get($cache_id);
2258 }
2259 else
2260 {
2261 $arRes = array();
2262 $db_res = CForumGroup::GetListEx(array("LEFT_MARGIN" => "ASC", "SORT" => "ASC"), array("LID" => $LANGUAGE_ID));
2263 while ($res = $db_res->GetNext())
2264 $arRes[intval($res["ID"])] = $res;
2265 $GLOBALS["FORUM_CACHE"]["GROUPS"][$LANGUAGE_ID] = $arRes;
2266 if (CACHED_b_forum_group !== false)
2267 $CACHE_MANAGER->Set($cache_id, $GLOBALS["FORUM_CACHE"]["GROUPS"][$LANGUAGE_ID]);
2268 }
2269 }
2270 return $GLOBALS["FORUM_CACHE"]["GROUPS"][$LANGUAGE_ID];
2271 }
2272
2273 public static function Resort($ID=0, $cnt=0, $depth=0)
2274 {
2275 global $DB;
2276 $ID = intval($ID);
2277 if($ID > 0)
2278 $DB->Query("UPDATE b_forum_group SET RIGHT_MARGIN=".intval($cnt).", LEFT_MARGIN=".intval($cnt)." WHERE ID=".intval($ID));
2279
2280 $strSql = "SELECT FG.ID, FG.PARENT_ID FROM b_forum_group FG WHERE ".($ID>0?"FG.PARENT_ID=".$ID:"FG.PARENT_ID IS NULL")." ORDER BY FG.SORT ASC";
2281 $cnt++;
2282 $db_res = $DB->Query($strSql);
2283 while ($res = $db_res->Fetch())
2284 $cnt = CAllForumGroup::ReSort($res["ID"], $cnt, $depth+1);
2285 if($ID == 0)
2286 return true;
2287 $DB->Query("UPDATE b_forum_group SET RIGHT_MARGIN=".intval($cnt).", DEPTH_LEVEL=".intval($depth)." WHERE ID=".intval($ID));
2288 return $cnt+1;
2289 }
2290}
2291
2292/**********************************************************************/
2293/************** FORUM SMILE *******************************************/
2294/**********************************************************************/
2296{
2297 static $smiles = array();
2298 static $sets = array();
2299
2300 public static function Add()
2301 {
2302 return false;
2303 }
2304
2305 public static function CheckFields()
2306 {
2307 return false;
2308 }
2309
2310 public static function Update()
2311 {
2312 return false;
2313 }
2314
2315 public static function Delete()
2316 {
2317 return false;
2318 }
2319
2320 public static function GetList()
2321 {
2322 global $DB;
2323 return $DB->Query("");
2324 }
2325
2326 public static function GetListEx()
2327 {
2328 global $DB;
2329 return $DB->Query("");
2330 }
2331
2332 public static function GetByID()
2333 {
2334 return false;
2335 }
2336
2337 public static function GetByIDEx($ID, $strLang)
2338 {
2339 return false;
2340 }
2341
2342 public static function GetLangByID($SMILE_ID, $strLang)
2343 {
2344 return false;
2345 }
2346
2353 public static function GetByType($type, $lang)
2354 {
2355 if (COption::GetOptionInt("forum", "smile_native_gallery_id", 0) <= 0)
2356 return self::getSmiles($type, $lang);
2357 $type = ($type == "I" ? CSmile::TYPE_ICON : CSmile::TYPE_SMILE);
2358 $key = "old_".$type."_".$lang;
2359 if (!array_key_exists($key, self::$smiles))
2360 {
2361 $smiles = CSmile::getByGalleryId($type, COption::GetOptionInt("forum", "smile_native_gallery_id", 0), $lang);
2362 $result = array();
2363 foreach ($smiles as $smile)
2364 {
2365 if ($smile['HIDDEN'] == 'Y')
2366 continue;
2367
2368 $result[] = array(
2369 'ID' => $smile['ID'],
2370 'TYPE' => $type,
2371 'TYPING' => $smile['TYPING'],
2372 'IMAGE' => $smile["IMAGE"],
2373 'DESCRIPTION' => '',
2374 'CLICKABLE' => 'Y',
2375 'SORT' => $smile['SORT'],
2376 'IMAGE_WIDTH' => $smile['IMAGE_WIDTH'],
2377 'IMAGE_HEIGHT' => $smile['IMAGE_HEIGHT'],
2378 'SET_ID' => $smile['SET_ID'],
2379 'NAME' => $smile['NAME'],
2380 'WIDTH' => $smile['IMAGE_WIDTH'],
2381 'HEIGHT' => $smile['IMAGE_HEIGHT'],
2382 );
2383 }
2384 self::$smiles[$key] = $result;
2385 }
2386 return self::$smiles[$key];
2387 }
2388
2389 public static function getSmiles($type, $lang)
2390 {
2391 $type = ($type == "I" ? CSmile::TYPE_ICON : CSmile::TYPE_SMILE);
2392 $key = "new_".$type."_".$lang;
2393 if (!array_key_exists($key, self::$smiles))
2394 {
2395 $smiles = CSmile::getByGalleryId($type, COption::GetOptionInt("forum", "smile_gallery_id", 0), $lang);
2396 $result = array();
2397 foreach ($smiles as $smile)
2398 {
2399 if ($smile['HIDDEN'] == 'Y')
2400 continue;
2401
2402 $result[] = array(
2403 'SET_ID' => $smile['SET_ID'],
2404 'NAME' => $smile['NAME'],
2405 'IMAGE' => ($smile['TYPE'] == CSmile::TYPE_SMILE ? CSmile::PATH_TO_SMILE : CSmile::PATH_TO_ICON).$smile["SET_ID"]."/".$smile["IMAGE"],
2406 'TYPING' => $smile['TYPING'],
2407 'WIDTH' => $smile['IMAGE_WIDTH'],
2408 'HEIGHT' => $smile['IMAGE_HEIGHT'],
2409 );
2410 }
2411 self::$smiles[$key] = $result;
2412 }
2413 return self::$smiles[$key];
2414 }
2415
2416 public static function getSetsByType($type, $lang)
2417 {
2418 $type = ($type == CSmile::TYPE_ICON ? CSmile::TYPE_ICON : CSmile::TYPE_SMILE);
2419 $key = $type."_".$lang;
2420 if (!array_key_exists($key, self::$sets))
2421 {
2423 $smilesSet = CSmileSet::getListCache();
2424 $result = array();
2425 foreach ($smiles as $smile)
2426 {
2427 if (!array_key_exists($smile["SET_ID"], $result))
2428 {
2429 $result[$smile["SET_ID"]] = $smilesSet[$smile["SET_ID"]];
2430 }
2431 }
2432 self::$sets[$key] = $result;
2433 }
2434 return self::$sets[$key];
2435 }
2436}
2437
2439{
2441 public function __construct($res, $params = array())
2442 {
2443 $this->sNameTemplate = (!empty($params["sNameTemplate"]) ? $params["sNameTemplate"] : '');
2444 parent::__construct($res);
2445 }
2446 function Fetch()
2447 {
2448 global $DB;
2449 if($res = parent::Fetch())
2450 {
2451 if (COption::GetOptionString("forum", "FILTER", "Y") == "Y")
2452 {
2453 if (trim($res["HTML"]) <> '')
2454 {
2455 $arr = unserialize($res["HTML"], ["allowed_classes" => false]);
2456 if (is_array($arr) && count($arr) > 0):
2457 $res["LAST_POSTER_NAME"] = $arr["LAST_POSTER_NAME"];
2458 endif;
2459 }
2460 if (trim($res["TOPIC_HTML"] ?? '') <> '')
2461 {
2462 $arr = unserialize($res["TOPIC_HTML"], ["allowed_classes" => false]);
2463 if (is_array($arr) && is_set($arr, "TITLE"))
2464 $res["TITLE"] = $arr["TITLE"];
2465 }
2466 if (trim($res["ABS_TOPIC_HTML"] ?? '') <> '')
2467 {
2468 $arr = unserialize($res["ABS_TOPIC_HTML"], ["allowed_classes" => false]);
2469 if (is_array($arr))
2470 {
2471 if (is_set($arr, "TITLE"))
2472 $res["ABS_TITLE"] = $arr["TITLE"];
2473 if (is_set($arr, "ABS_LAST_POSTER_NAME"))
2474 $res["ABS_LAST_POSTER_NAME"] = $arr["ABS_LAST_POSTER_NAME"];
2475 }
2476 }
2477 }
2478
2479 if (!empty($this->sNameTemplate))
2480 {
2481 $arTmp = array();
2482 foreach (array("LAST_POSTER_ID" => "LAST_POSTER_NAME", "ABS_LAST_POSTER_ID" => "ABS_LAST_POSTER_NAME") as $id => $name)
2483 {
2484 $tmp = "";
2485 if (!empty($res[$id]))
2486 {
2487 if (in_array($res[$id], $arTmp))
2488 {
2489 $tmp = $arTmp[$res[$id]];
2490 }
2491 else
2492 {
2493 $arTmp[$res[$id]] = $tmp = (!empty($res[$name."_FRMT"]) ? $res[$name."_FRMT"] :
2494 CForumUser::GetFormattedNameByUserID($res[$id], $this->sNameTemplate));
2495 }
2496 }
2497 $res[$name] = (!empty($tmp) ? $tmp : $res[$name]);
2498 }
2499 }
2500 }
2501 return $res;
2502 }
2503}
$arParams
Определения access_dialog.php:21
$type
Определения options.php:106
$dbSites
Определения options.php:14
$db_res
Определения options_user_settings.php:8
$ar_res
Определения options_user_settings_set.php:16
global $APPLICATION
Определения include.php:80
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
Определения check_mail.php:18
Определения forum_new.php:2439
$sNameTemplate
Определения forum_new.php:2440
__construct($res, $params=array())
Определения forum_new.php:2441
Fetch()
Определения forum_new.php:2446
const ACCESS_DENIED
Определения permission.php:67
static getById($id)
Определения datamanager.php:364
$DB
Определения dbresult.php:40
static Filter($message)
Определения filter_dictionary.php:590
Определения forum_new.php:1918
static GetByIDEx($ID, $LANGUAGE_ID)
Определения forum_new.php:2189
static Resort($ID=0, $cnt=0, $depth=0)
Определения forum_new.php:2273
static Delete($ID)
Определения forum_new.php:2006
static GetByLang($LANGUAGE_ID)
Определения forum_new.php:2243
static GetLangByID($FORUM_GROUP_ID, $strLang)
Определения forum_new.php:2224
static GetByID($ID)
Определения forum_new.php:2174
static CheckFields($ACTION, &$arFields, $ID=false)
Определения forum_new.php:1935
static CanUserUpdateGroup($ID, $arUserGroups)
Определения forum_new.php:1925
static CanUserDeleteGroup($ID, $arUserGroups)
Определения forum_new.php:1930
static GetListEx($arOrder=array("SORT"=>"ASC"), $arFilter=array())
Определения forum_new.php:2102
static CanUserAddGroup($arUserGroups)
Определения forum_new.php:1920
static GetList($arOrder=array("SORT"=>"ASC"), $arFilter=array())
Определения forum_new.php:2040
static GetByID($ID, $arAddParams=array())
Определения message.php:591
Определения forum_new.php:15
static GetList($arOrder=Array("SORT"=>"ASC"), $arFilter=Array(), $arAddParams=array())
Определения forum_new.php:796
static GetFilterOperation($key)
Определения forum_new.php:582
static GetByIDEx($ID, $SITE_ID=false, $arAddParams=array())
Определения forum_new.php:1443
static CanUserUpdateForum($FID, $arUserGroups, $iUserID=0, $ExternalPermission=false)
Определения forum_new.php:40
static CanUserEditForum($FID, $arUserGroups, $iUserID=0, $ExternalPermission=false)
Определения forum_new.php:89
static ShowPanel($FID, $TID=0, $bGetIcons=false)
Определения forum_new.php:1863
static GetSites($ID)
Определения forum_new.php:411
static Delete($ID)
Определения forum_new.php:308
static OnPanelCreate()
Определения forum_new.php:1853
static GetUserPermission($ID, $arUserGroups)
Определения forum_new.php:564
static CanUserModerateForum($FID, $arUserGroups, $iUserID=0, $ExternalPermission=false)
Определения forum_new.php:67
static prepareField($operation, $type, $vals)
Определения forum_new.php:629
static GetByID($ID)
Определения forum_new.php:1399
static InitReadLabels($ID, $arUserGroups)
Определения forum_new.php:1519
static GetAccessPermissions($ID, $TYPE="ONE")
Определения forum_new.php:463
static CanUserAddForum($arUserGroups, $iUserID=0)
Определения forum_new.php:34
static PreparePath2Message($strPath, $arVals=array())
Определения forum_new.php:1801
static GetPermissionUserDefault($ID)
Определения forum_new.php:444
static Update($ID, $arFields, $bReindex=true)
Определения forum_new.php:210
static CanUserViewForum($FID, $arUserGroups, $ExternalPermission=false)
Определения forum_new.php:17
static CheckFields($ACTION, &$arFields)
Определения forum_new.php:110
static GetListEx($arOrder=Array("SORT"=>"ASC"), $arFilter=Array(), $bCount=false, $iNum=0, $arAddParams=array())
Определения forum_new.php:936
static ClearHTML($ID)
Определения forum_new.php:1903
static GetSelectFields($arAddParams=array())
Определения forum_new.php:720
static GetAccessPermsList($arOrder=array("ID"=>"ASC"), $arFilter=array())
Определения forum_new.php:482
static CanUserDeleteForum($FID, $arUserGroups, $iUserID=0, $ExternalPermission=false)
Определения forum_new.php:53
static GetForumRenew($data)
Определения forum_new.php:1312
static OnReindex($NS=array(), $oCallback=NULL, $callback_method="")
Определения forum_new.php:1858
static SetLabelsBeRead($ID, $arUserGroups)
Определения forum_new.php:1596
static SetStat($ID=0, $arParams=array())
Определения forum_new.php:1638
static OnBeforeLangDelete($lang)
Определения forum_new.php:1846
static SetAccessPermissions($ID, $arGROUP_ID)
Определения forum_new.php:549
static OnGroupDelete($GROUP_ID)
Определения forum_new.php:1840
static IsAdmin($userId=false, $arGroups=false)
Определения user.php:11
static IsLocked($userID)
Определения user.php:82
static SetStat($userId=0, $params=[])
Определения user.php:830
static GetFormattedNameByUserID($userID, $template="", $arUser=array())
Определения user.php:737
static GetList($by="sort", $order="asc", $arFilter=[])
Определения language.php:12
static ChangePermission($MODULE_ID, $arGroups, $ITEM_ID=false, $PARAM1=false, $PARAM2=false, $SITE_ID=false, $PARAMS=false)
Определения search.php:3097
static DeleteIndex($MODULE_ID, $ITEM_ID=false, $PARAM1=false, $PARAM2=false, $SITE_ID=false)
Определения search.php:2922
static Delete($ID)
Определения vote.php:245
Определения dbresult.php:88
static GetList($arOrder=Array("ID"=>"ASC"), $arFilter=Array(), $bCount=false, $iNum=0, $arAddParams=array())
Определения message.php:193
static reindex(&$NS, $oCallback=NULL, $callback_method="")
Определения forum_new.php:53
static Concat($glue="", $pieces=array())
Определения forum_new.php:247
Определения forum_new.php:2296
static GetListEx()
Определения forum_new.php:2326
static GetList()
Определения forum_new.php:2320
static Delete()
Определения forum_new.php:2315
static CheckFields()
Определения forum_new.php:2305
static GetByID()
Определения forum_new.php:2332
static Update()
Определения forum_new.php:2310
static $smiles
Определения forum_new.php:2297
static $sets
Определения forum_new.php:2298
static getSmiles($type, $lang)
Определения forum_new.php:2389
static GetByIDEx($ID, $strLang)
Определения forum_new.php:2337
static Add()
Определения forum_new.php:2300
static GetLangByID($SMILE_ID, $strLang)
Определения forum_new.php:2342
static GetByType($type, $lang)
Определения forum_new.php:2353
static getSetsByType($type, $lang)
Определения forum_new.php:2416
static GetList($arOrder=Array("SORT"=>"ASC"), $arFilter=Array(), $bCount=false, $iNum=0, $arAddParams=array())
Определения topic.php:6
static GetFormattedNameFieldsForSelect($arParams=array(), $bReturnAll=true)
Определения user.php:655
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
$arr
Определения file_new.php:624
</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
$result
Определения get_property_values.php:14
$bFound
Определения get_search.php:40
if($ajaxMode) $ID
Определения get_user.php:27
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
if(!defined('SITE_ID')) $lang
Определения include.php:91
$siteId
Определения ajax.php:8
if(!defined('NOT_CHECK_PERMISSIONS')) $NS
Определения backup.php:24
ExecuteModuleEventEx($arEvent, $arParams=[])
Определения tools.php:5214
IsModuleInstalled($module_id)
Определения tools.php:5301
DelDuplicateSort(&$arSort)
Определения tools.php:2055
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
Определения tools.php:5177
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
Определения tools.php:3778
is_set($a, $k=false)
Определения tools.php:2133
GetMessage($name, $aReplace=null)
Определения tools.php:3397
$name
Определения menu_edit.php:35
$user
Определения mysql_to_pgsql.php:33
$GLOBALS['____1690880296']
Определения license.php:1
$order
Определения payment.php:8
if(intval($iTestTransaction) > 0) $arTmp
Определения payment.php:22
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
$TYPE
Определения rss.php:27
$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
if(!Loader::includeModule('sale')) $pattern
Определения index.php:20
$arRes
Определения options.php:104
$arFilter
Определения user_search.php:106
$SITE_ID
Определения yandex_run.php:607