1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
message.php
См. документацию.
1<?php
2##############################################
3# Bitrix Site Manager Forum #
4# Copyright (c) 2002-2007 Bitrix #
5# https://www.bitrixsoft.com #
6# mailto:admin@bitrixsoft.com #
7##############################################
9
11{
12 //---------------> Message add, update, delete
13 public static function CanUserAddMessage($TID, $arUserGroups, $iUserID = 0, $ExternalPermission = false)
14 {
15 $TID = intval($TID);
16 $arTopic = ($TID > 0 ? CForumTopic::GetByID($TID) : false);
17 if ($arTopic)
18 {
19 if (!CForumUser::IsLocked($iUserID)):
20 $strPerms = ($ExternalPermission == false ? CForumNew::GetUserPermission($arTopic["FORUM_ID"], $arUserGroups) : $ExternalPermission);
21 else:
22 $strPerms = CForumNew::GetPermissionUserDefault($arTopic["FORUM_ID"], $arUserGroups);
23 endif;
24 if ($strPerms >= "Y")
25 return true;
26 elseif ($strPerms < "I")
27 return false;
28 $arForum = CForumNew::GetByID($arTopic["FORUM_ID"]);
29 if ($arForum["ACTIVE"] != "Y")
30 return False;
31 return ($strPerms < "U" && ($arTopic["STATE"] != "Y") ? false : true);
32 }
33 return False;
34 }
35
36 public static function CanUserUpdateMessage($MID, $arUserGroups, $iUserID = 0, $ExternalPermission = false)
37 {
38 $MID = intval($MID);
39 $arMessage = CForumMessage::GetByIDEx($MID, array("GET_FORUM_INFO" => "Y", "GET_TOPIC_INFO" => "Y", "FILTER" => "N"));
40 $arTopic = $arMessage["TOPIC_INFO"];
41 $arForum = $arMessage["FORUM_INFO"];
42 if ($arMessage)
43 {
44 if (!CForumUser::IsLocked($iUserID)):
45 $strPerms = ($ExternalPermission == false ? CForumNew::GetUserPermission($arTopic["FORUM_ID"], $arUserGroups) : $ExternalPermission);
46 else:
47 $strPerms = CForumNew::GetPermissionUserDefault($arTopic["FORUM_ID"], $arUserGroups);
48 endif;
49 if ($strPerms >= "Y")
50 return true;
51 if ($strPerms < "I" || $arForum["ACTIVE"] !="Y")
52 return false;
53 elseif ($strPerms >= "U")
54 return true;
55 if ($arTopic["STATE"] != "Y")
56 return false;
57 $iUserID = intval($iUserID);
58 if ($iUserID <= 0 || intval($arMessage["AUTHOR_ID"]) != $iUserID)
59 return false;
60 if (COption::GetOptionString("forum", "USER_EDIT_OWN_POST", "Y") == "Y")
61 return true;
62 $iCnt = CForumMessage::GetList(array("ID" => "ASC"), array("TOPIC_ID"=>$arTopic["ID"], ">ID"=>$MID), True);
63 if (intval($iCnt) <= 0)
64 return true;
65 }
66 return false;
67 }
68
69 public static function CanUserDeleteMessage($MID, $arUserGroups, $iUserID = 0, $ExternalPermission = false)
70 {
71 $MID = intval($MID);
72 $arMessage = CForumMessage::GetByIDEx($MID, array("GET_FORUM_INFO" => "Y", "GET_TOPIC_INFO" => "N", "FILTER" => "N"));
73 $arForum = $arMessage["FORUM_INFO"] ?? null;
74 if ($arMessage)
75 {
76 $FID = intval($arMessage["FORUM_ID"]);
77 if (!CForumUser::IsLocked($iUserID)):
78 $strPerms = ($ExternalPermission == false ? CForumNew::GetUserPermission($arForum["ID"], $arUserGroups) : $ExternalPermission);
79 else:
80 $strPerms = CForumNew::GetPermissionUserDefault($arForum["ID"], $arUserGroups);
81 endif;
82 if ($strPerms >= "Y")
83 return true;
84 elseif ($arForum["ACTIVE"] != "Y")
85 return false;
86 return ($strPerms >= "U" ? true : false);
87 }
88 return false;
89 }
90
91 public static function CheckFields($ACTION, &$arFields, $ID = 0, $arParams = array())
92 {
93 $aMsg = array();
94 $ID = intval($ID);
95
96 $arMessage = $arFields;
97
98 if ($ACTION != "ADD" && $ID > 0 && (!is_set($arFields, "AUTHOR_NAME") || !is_set($arFields, "TOPIC_ID") || !is_set($arFields, "FORUM_ID")))
99 {
100 $arMessage = CForumMessage::GetByID($ID, array("FILTER" => "N"));
101 }
102
103 $bDeduplication = true;
104 if ((is_set($arFields, "FORUM_ID") || $ACTION=="ADD") && intval($arFields["FORUM_ID"])<=0)
105 {
106 $aMsg[] = array(
107 "id"=>'empty_forum_id',
108 "text" => GetMessage("F_ERR_EMPTY_FORUM_ID"));
109 }
110 else
111 {
112 $forumID = (($ACTION == 'ADD') ? intval($arFields["FORUM_ID"]) : intval($arMessage["FORUM_ID"]));
113 $arForum = CForumNew::GetByID($forumID);
114 if (!is_array($arForum))
115 {
116 $aMsg[] = array(
117 "id"=>'invalid_forum_id',
118 "text" => GetMessage("F_ERR_INVALID_FORUM_ID"));
119 }
120 else
121 {
122 if (
123 isset($arFields['AUX'])
124 && $arFields['AUX'] == 'Y'
125 )
126 {
127 $bDeduplication = false;
128 }
129 else
130 {
131 $bDeduplication = ($arForum['DEDUPLICATION'] === 'Y');
132 }
133 }
134 }
135
136 if ((is_set($arFields, "TOPIC_ID") || $ACTION=="ADD") && intval($arFields["TOPIC_ID"])<=0)
137 {
138 $aMsg[] = array(
139 "id"=>'empty_topic_id',
140 "text" => GetMessage("F_ERR_EMPTY_TOPIC_ID"));
141 }
142 if ((is_set($arFields, "AUTHOR_NAME") || $ACTION=="ADD") && $arFields["AUTHOR_NAME"] == '')
143 {
144 $aMsg[] = array(
145 "id"=>'empty_author_name',
146 "text" => GetMessage("F_ERR_EMPTY_AUTHOR_NAME"));
147 }
148
149 if ((is_set($arFields, "POST_MESSAGE") || $ACTION=="ADD") && $arFields["POST_MESSAGE"] == '' &&
150 (!is_set($arFields, 'FILES') || sizeof($arFields['FILES']) < 1))
151 {
152 $aMsg[] = array(
153 "id"=>'empty_post_message',
154 "text" => GetMessage("F_ERR_EMPTY_POST_MESSAGE"));
155 }
156 elseif (is_set($arFields, "POST_MESSAGE") && (!isset($arFields["NEW_TOPIC"]) || $arFields["NEW_TOPIC"] != "Y"))
157 {
158 $arFields["POST_MESSAGE_CHECK"] = md5($arFields["POST_MESSAGE"] . (is_set($arFields, 'FILES')?serialize($arFields['FILES']):''));
159
160 if ($bDeduplication)
161 {
162 $iCnt = CForumMessage::GetList(array(), array("TOPIC_ID" => $arMessage["TOPIC_ID"], "!ID" => $ID,
163 "AUTHOR_NAME" => $arMessage["AUTHOR_NAME"], "POST_MESSAGE_CHECK" => $arFields["POST_MESSAGE_CHECK"]), true);
164 if (intval($iCnt)>0)
165 {
166 $aMsg[] = array(
167 "id"=>'message_already_exists',
168 "text" => GetMessage("F_ERR_MESSAGE_ALREADY_EXISTS"));
169 }
170 }
171 }
172
173 if (!empty($arFields['POST_MESSAGE']))
174 {
175 $arFields["POST_MESSAGE"] = \Bitrix\Main\Text\Emoji::encode($arFields["POST_MESSAGE"]);
176 }
177
178 if (!is_set($arFields, "FILES"))
179 $arFields["FILES"] = array();
180 if (is_set($arFields, "ATTACH_IMG"))
181 {
182 if (!empty($arFields["ATTACH_IMG"]))
183 $arFields["FILES"][] = $arFields["ATTACH_IMG"];
184 unset($arFields["ATTACH_IMG"]);
185 }
186 if (!empty($arFields["FILES"]))
187 {
188 if ($ID > 0)
189 {
190 $arParams = !empty($arParams) ? $arParams : CForumMessage::GetByID($ID, array("FILTER" => "N"));
191 $arParams["MESSAGE_ID"] = $ID;
192 }
193 else
194 {
195 $arParams = array("FORUM_ID" => $arMessage["FORUM_ID"], "MESSAGE_ID" => 0, "USER_ID" => $arFields["AUTHOR_ID"]);
196 }
197 if (!CForumFiles::CheckFields($arFields["FILES"], $arParams))
198 {
199 $res = $GLOBALS["APPLICATION"]->GetException();
200 $aMsg[] = array(
201 "id" => 'attach_error',
202 "text" => $res->GetString());
203 }
204 }
205 else
206 {
207 unset($arFields["FILES"]);
208 }
209
210 if (isset($arFields["TOPIC_ID"]) && intval($arFields["TOPIC_ID"]) > 0)
211 {
212 $res = CForumTopic::GetById($arFields["TOPIC_ID"]);
213 if (!$res)
214 {
215 $aMsg[] = array(
216 "id" => 'topic_is_not_exists',
217 "text" => GetMessage("F_ERR_TOPIC_IS_NOT_EXISTS"));
218 }
219 elseif ($res["STATE"] == "L")
220 {
221 $aMsg[] = array(
222 "id" => 'topic_is_link',
223 "text" => GetMessage("F_ERR_TOPIC_IS_LINK"));
224 }
225 }
226
228 if(!empty($aMsg))
229 {
230 $e = new CAdminException(array_reverse($aMsg));
231 $APPLICATION->ThrowException($e);
232 return false;
233 }
234 else if(!$USER_FIELD_MANAGER->CheckFields("FORUM_MESSAGE", $ID, $arFields, (array_key_exists("USER_ID", $arFields) ? $arFields["USER_ID"] : false)))
235 return false;
236
237 if (is_set($arFields, "AUTHOR_ID") || $ACTION=="ADD") $arFields["AUTHOR_ID"] = !isset($arFields["AUTHOR_ID"]) || intval($arFields["AUTHOR_ID"]) <= 0 ? false : $arFields["AUTHOR_ID"];
238 if (is_set($arFields, "USE_SMILES") || $ACTION=="ADD") $arFields["USE_SMILES"] = (isset($arFields["USE_SMILES"]) && $arFields["USE_SMILES"] == "N" ? "N" : "Y");
239 if (is_set($arFields, "NEW_TOPIC") || $ACTION=="ADD") $arFields["NEW_TOPIC"] = (isset($arFields["NEW_TOPIC"]) && $arFields["NEW_TOPIC"] == "Y" ? "Y" : "N");
240 if (is_set($arFields, "APPROVED") || $ACTION=="ADD") $arFields["APPROVED"] = (isset($arFields["APPROVED"]) && $arFields["APPROVED"] == "N" ? "N" : "Y");
241 if (is_set($arFields, "SOURCE_ID") || $ACTION=="ADD") $arFields["SOURCE_ID"] = (isset($arFields["SOURCE_ID"]) && $arFields["SOURCE_ID"] == "EMAIL" ? "EMAIL" : "WEB");
242
243 return True;
244 }
245
246 public static function Update($ID, $arFields, $skip_counts = false, $strUploadDir = false)
247 {
248 global $DB, $USER_FIELD_MANAGER;
249 $ID = intval($ID);
250 $strSql = "";
251 $strUploadDir = ($strUploadDir === false ? "forum" : $strUploadDir);
252
253 if ($ID <= 0 || !CForumMessage::CheckFields("UPDATE", $arFields, $ID) || empty($arFields))
254 return false;
255
256// if (!$skip_counts || IsModuleInstalled("search") || is_array($arFields["ATTACH_IMG"]) || is_array($arFields["FILES"]))
257// {
258 $arMessage_prev = CForumMessage::GetByID($ID, array("FILTER" => "N"));
259// }
260
261 if (is_set($arFields, "POST_MESSAGE") || is_set($arFields, "FORUM_ID"))
262 {
263 $arFields["POST_MESSAGE_HTML"] = '';
264 $arFields["POST_MESSAGE_FILTER"] = '';
265 }
266 $arr = array(
267 "AUTHOR_NAME" => $arMessage_prev["AUTHOR_NAME"],
268 "AUTHOR_EMAIL" => $arMessage_prev["AUTHOR_EMAIL"],
269 "EDITOR_NAME" => $arMessage_prev["EDITOR_NAME"],
270 "EDITOR_EMAIL" => $arMessage_prev["EDITOR_EMAIL"],
271 "EDIT_REASON" => $arMessage_prev["EDIT_REASON"]);
272 $bUpdateHTML = false;
273 foreach ($arr as $key => $val):
274 if (is_set($arFields, $key) && $val != $arFields[$key]):
275 $bUpdateHTML = true;
276 break;
277 endif;
279 if ($bUpdateHTML):
280 $arFields["HTML"] = '';
281 endif;
282
283 if (is_set($arFields, "POST_DATE") && (trim($arFields["POST_DATE"]) == ''))
284 {
285 $strSql = ", POST_DATE=".$DB->GetNowFunction();
286 unset($arFields["POST_DATE"]);
287 }
288
289 if (!is_set($arFields, "EDIT_DATE"))
290 {
291 $strSql .= ", EDIT_DATE=".$DB->GetNowFunction();
292 }
293 else
294 {
295 if (trim($arFields["EDIT_DATE"]) == '')
296 {
297 $strSql .= ", EDIT_DATE=".$DB->GetNowFunction();
298 unset($arFields["EDIT_DATE"]);
299 }
300 }
301/***************** Event onBeforeMessageUpdate *********************/
302 foreach (GetModuleEvents("forum", "onBeforeMessageUpdate", true) as $arEvent)
303 {
304 if (ExecuteModuleEventEx($arEvent, array(&$ID, &$arFields, &$strUploadDir)) === false)
305 return false;
306 }
307/***************** /Event ******************************************/
308/***************** Attach ******************************************/
309 $arFiles = array();
310 if (isset($arFields["ATTACH_IMG"]) && is_array($arFields["ATTACH_IMG"]))
311 $arFields["FILES"] = array($arFields["ATTACH_IMG"]);
312 unset($arFields["ATTACH_IMG"]);
313 if (isset($arFields["FILES"]) && is_array($arFields["FILES"]) && !empty($arFields["FILES"]))
314 {
315 $res = array("FORUM_ID" => $arMessage_prev["FORUM_ID"],
316 "TOPIC_ID" => $arMessage_prev["TOPIC_ID"],
317 "MESSAGE_ID" => $ID,
318 "USER_ID" => $arFields["EDITOR_ID"], "upload_dir" => $strUploadDir);
319 $arFiles = CForumFiles::Save($arFields["FILES"], $res, false);
320 $db_res = CForumFiles::GetList(array("ID" => "ASC"), array("MESSAGE_ID" => $ID));
321 if ($db_res && $res = $db_res->Fetch())
322 {
323 do
324 {
325 $arFiles[$res["FILE_ID"]] = $res;
326 } while ($db_res && $res = $db_res->Fetch());
327 }
328 if (!empty($arFiles))
329 {
330 $arFiles = array_keys($arFiles);
331 sort($arFiles);
332 $arFields["ATTACH_IMG"] = $arFiles[0];
333 }
334 else
335 {
336 $arFields["ATTACH_IMG"] = 0;
337 }
338 unset($arFields["FILES"]);
339 }
340/***************** Attach/******************************************/
341 if (empty($arFields) && empty($strSql))
342 return false;
343 $strUpdate = $DB->PrepareUpdate("b_forum_message", $arFields, $strUploadDir);
344 $strSql = "UPDATE b_forum_message SET ".$strUpdate.$strSql." WHERE ID = ".$ID;
345
346 $DB->QueryBind($strSql,
347 array("POST_MESSAGE" => $arFields["POST_MESSAGE"] ?? null,
348 "POST_MESSAGE_HTML" => $arFields["POST_MESSAGE_HTML"] ?? null,
349 "POST_MESSAGE_FILTER" => $arFields["POST_MESSAGE_FILTER"] ?? null,
350 "EDIT_REASON" => $arFields["EDIT_REASON"] ?? null,
351 "HTML" => $arFields["HTML"] ?? null));
352/***************** Attach ******************************************/
353 if (!empty($arFiles))
354 {
355 $res = array(
356 "FORUM_ID" => (is_set($arFields, "FORUM_ID") ? $arFields["FORUM_ID"] : $arMessage_prev["FORUM_ID"]),
357 "TOPIC_ID" => (is_set($arFields, "TOPIC_ID") ? $arFields["TOPIC_ID"] : $arMessage_prev["TOPIC_ID"]),
358 "MESSAGE_ID" => $ID);
359 CForumFiles::UpdateByID($arFiles, $res);
360 }
361/***************** Attach/******************************************/
362 $USER_FIELD_MANAGER->Update("FORUM_MESSAGE", $ID, $arFields, (array_key_exists("USER_ID", $arFields) ? $arFields["USER_ID"] : false));
363/***************** Event onAfterMessageUpdate **********************/
364 foreach (GetModuleEvents("forum", "onAfterMessageUpdate", true) as $arEvent)
365 ExecuteModuleEventEx($arEvent, array(&$ID, &$arFields, $arMessage_prev));
366/***************** /Event ******************************************/
367 unset($GLOBALS["FORUM_CACHE"]["MESSAGE"][$ID]);
368 unset($GLOBALS["FORUM_CACHE"]["MESSAGE_FILTER"][$ID]);
369
370 if (!$skip_counts || IsModuleInstalled("search"))
371 {
372 $arMessage = CForumMessage::GetByIDEx($ID, array("GET_TOPIC_INFO" => "Y", "GET_FORUM_INFO" => "Y", "FILTER" => "Y"));
373 if (!$skip_counts)
374 {
375 // author
376 if ($arMessage["AUTHOR_ID"] != $arMessage_prev["AUTHOR_ID"]):
377 CForumUser::SetStat($arMessage_prev["AUTHOR_ID"], array("MESSAGE" => $arMessage_prev, "ACTION" => "DECREMENT"));
378 CForumUser::SetStat($arMessage["AUTHOR_ID"], array("MESSAGE" => $arMessage, "ACTION" => "INCREMENT"));
379 endif;
380
381 // Topic
382 if ($arMessage["TOPIC_ID"] != $arMessage_prev["TOPIC_ID"]):
383 CForumTopic::SetStat($arMessage_prev["TOPIC_ID"]);
384 CForumTopic::SetStat($arMessage["TOPIC_ID"]);
385 endif;
386
387 // Forum
388 if ($arMessage["FORUM_ID"] != $arMessage_prev["FORUM_ID"]):
389 CForumNew::SetStat($arMessage_prev["FORUM_ID"], array("MESSAGE" => $arMessage_prev, "ACTION" => "DECREMENT"));
390 CForumNew::SetStat($arMessage["FORUM_ID"], array("MESSAGE" => $arMessage, "ACTION" => "INCREMENT"));
391 endif;
392
393 if ($arMessage["APPROVED"] != $arMessage_prev["APPROVED"]):
394 if ($arMessage["AUTHOR_ID"] == $arMessage_prev["AUTHOR_ID"]):
395 CForumUser::SetStat($arMessage["AUTHOR_ID"], array("MESSAGE" => $arMessage, "ACTION" => "UPDATE"));
396 endif;
397 if ($arMessage["TOPIC_ID"] == $arMessage_prev["TOPIC_ID"]):
398 CForumTopic::SetStat($arMessage["TOPIC_ID"]);
399 endif;
400 if ($arMessage["FORUM_ID"] == $arMessage_prev["FORUM_ID"]):
401 CForumNew::SetStat($arMessage["FORUM_ID"], array("MESSAGE" => $arMessage, "ACTION" => "UPDATE"));
402 endif;
403 $bUpdatedStatistic = true;
404 endif;
405 }
406 $arForum = CForumNew::GetByID($arMessage["FORUM_ID"]);
407 if (CModule::IncludeModule("search") && $arForum["INDEXATION"] == "Y")
408 {
409 // if message was removed from indexing forum to no-indexing forum we must delete index
410 if (isset($arMessage_prev["FORUM_INFO"]) && $arMessage_prev["FORUM_INFO"]["INDEXATION"] == "Y" &&
411 $arMessage["FORUM_INFO"]["INDEXATION"] != "Y")
412 {
413 \CSearch::DeleteIndex("forum", $ID);
414 }
415 elseif ($arMessage["FORUM_INFO"]["INDEXATION"] == "Y" &&
416 $arMessage_prev["APPROVED"] != "N" && $arMessage["APPROVED"] == "N")
417 {
418 \CSearch::DeleteIndex("forum", $ID);
419 }
420 elseif ($arMessage["APPROVED"] == "Y")
421 {
422 CForumMessage::Reindex($ID, $arMessage);
423 }
424 }
425 }
426 return $ID;
427 }
428
429 public static function Reindex($ID, &$arMessage = [])
430 {
431 if (!($ID > 0) || !CModule::IncludeModule("search"))
432 return array("FORUM_ID", "TOPIC_ID", "TITLE_SEO", "MESSAGE_ID", "SOCNET_GROUP_ID", "OWNER_ID", "PARAM1", "PARAM2");
433 if (!is_array($arMessage) || !array_key_exists("FORUM_INFO", $arMessage) || !array_key_exists("TOPIC_INFO", $arMessage))
434 $arMessage = CForumMessage::GetByIDEx($ID, array("GET_TOPIC_INFO" => "Y", "GET_FORUM_INFO" => "Y", "FILTER" => "Y"));
435
436 $arMessage["POST_MESSAGE"] = (COption::GetOptionString("forum", "FILTER", "Y") == "Y" ?
437 $arMessage["POST_MESSAGE_FILTER"] : $arMessage["POST_MESSAGE"]);
438
440 "PERMISSION" => array(),
441 "SITE" => CForumNew::GetSites($arMessage["FORUM_ID"]),
442 "DEFAULT_URL" => "/");
443
444 $arGroups = CForumNew::GetAccessPermissions($arMessage["FORUM_ID"]);
445 for ($i = 0; $i < count($arGroups); $i++)
446 {
447 if ($arGroups[$i][1] >= "E")
448 {
449 $arParams["PERMISSION"][] = $arGroups[$i][0];
450 if ($arGroups[$i][0] == 2)
451 break;
452 }
453 }
454
455 $arSearchInd = array(
456 "LID" => array(),
457 "LAST_MODIFIED" => $arMessage["POST_DATE"],
458 "PARAM1" => $arMessage["FORUM_ID"],
459 "PARAM2" => $arMessage["TOPIC_ID"],
460 "PERMISSIONS" => $arParams["PERMISSION"],
461 "TITLE" => $arMessage["TOPIC_INFO"]["TITLE"].($arMessage["NEW_TOPIC"] == "Y" && !empty($arMessage["TOPIC_INFO"]["DESCRIPTION"]) ?
462 ", ".$arMessage["TOPIC_INFO"]["DESCRIPTION"] : ""),
463 "TAGS" => (($arMessage["NEW_TOPIC"] == "Y") ? $arMessage["TOPIC_INFO"]["TAGS"] : ""),
464 "BODY" => GetMessage("AVTOR_PREF")." ".$arMessage["AUTHOR_NAME"].". ".(CSearch::KillTags(forumTextParser::clearAllTags($arMessage["POST_MESSAGE"]))),
465 "ENTITY_TYPE_ID" => $arMessage["NEW_TOPIC"] == "Y"? "FORUM_TOPIC": "FORUM_POST",
466 "ENTITY_ID" => $arMessage["NEW_TOPIC"] == "Y"? $arMessage["TOPIC_ID"]: $arMessage["ID"],
467 "USER_ID" => $arMessage["AUTHOR_ID"],
468 "URL" => "",
469 "INDEX_TITLE" => $arMessage["NEW_TOPIC"] == "Y",
470 );
471
472 // get mentions
473 $arMentionedUserID = CForumMessage::GetMentionedUserID($arMessage["POST_MESSAGE"]);
474 if (!empty($arMentionedUserID))
475 {
476 $arSearchInd["PARAMS"] = array(
477 "mentioned_user_id" => $arMentionedUserID
478 );
479 }
480
481 $urlPatterns = array(
482 "FORUM_ID" => $arMessage["FORUM_ID"],
483 "TOPIC_ID" => $arMessage["TOPIC_ID"],
484 "TITLE_SEO" => $arMessage["TOPIC_INFO"]["TITLE_SEO"],
485 "MESSAGE_ID" => $arMessage["ID"],
486 "SOCNET_GROUP_ID" => $arMessage["TOPIC_INFO"]["SOCNET_GROUP_ID"],
487 "OWNER_ID" => $arMessage["TOPIC_INFO"]["OWNER_ID"],
488 "PARAM1" => $arMessage["PARAM1"],
489 "PARAM2" => $arMessage["PARAM2"]);
490 foreach ($arParams["SITE"] as $key => $val)
491 {
492 $arSearchInd["LID"][$key] = CForumNew::PreparePath2Message($val, $urlPatterns);
493 if (empty($arSearchInd["URL"]) && !empty($arSearchInd["LID"][$key]))
494 $arSearchInd["URL"] = $arSearchInd["LID"][$key];
495 }
496
497 if (empty($arSearchInd["URL"]))
498 {
499 foreach ($arParams["SITE"] as $key => $val)
500 {
501 $db_lang = CLang::GetByID($key);
502 if ($db_lang && $ar_lang = $db_lang->Fetch())
503 {
504 $arParams["DEFAULT_URL"] = $ar_lang["DIR"];
505 break;
506 }
507 }
508 $arParams["DEFAULT_URL"] .= COption::GetOptionString("forum", "REL_FPATH", "").
509 "forum/read.php?FID=#FID#&TID=#TID#&MID=#MID##message#MID#";
510 $arSearchInd["URL"] = CForumNew::PreparePath2Message($arParams["DEFAULT_URL"], $urlPatterns);
511 }
512 CSearch::DeleteIndex("forum", $ID);
513 /***************** Events onMessageIsIndexed ***********************/
514 $index = true;
515 foreach(GetModuleEvents("forum", "onMessageIsIndexed", true) as $arEvent)
516 {
517 if (ExecuteModuleEventEx($arEvent, array($ID, $arMessage, &$arSearchInd)) === false)
518 {
519 $index = false;
520 break;
521 }
522 }
523 /***************** /Events *****************************************/
524 if ($index == true)
525 CSearch::Index("forum", $ID, $arSearchInd, true);
526 }
527
528 public static function Delete($ID)
529 {
530 global $DB, $USER_FIELD_MANAGER;
531 $ID = intval($ID);
532 $arMessage = array();
533 if ($ID > 0)
534 $arMessage = CForumMessage::GetByID($ID, array("FILTER" => "N"));
535 if (empty($arMessage))
536 return false;
537/***************** Event onBeforeMessageAdd ************************/
538 foreach (GetModuleEvents("forum", "onBeforeMessageDelete", true) as $arEvent)
539 {
540 if (ExecuteModuleEventEx($arEvent, array(&$ID, $arMessage)) === false)
541 return false;
542 }
543/***************** /Event ******************************************/
544 $AUTHOR_ID = intval($arMessage["AUTHOR_ID"]);
545 $TOPIC_ID = intval($arMessage["TOPIC_ID"]);
546 $FORUM_ID = intval($arMessage["FORUM_ID"]);
547
548 $DB->StartTransaction();
549 // delete votes
550 if ($arMessage["PARAM1"] == "VT" && intval($arMessage["PARAM2"]) > 0 && IsModuleInstalled("vote")):
551 CModule::IncludeModule("vote");
552 CVote::Delete($arMessage["PARAM2"]);
553 endif;
554 // delete files
555 CForumFiles::Delete(array("MESSAGE_ID" => $ID), array("DELETE_MESSAGE_FILE" => "Y"));
556 // delete message
557 $DB->Query("DELETE FROM b_forum_message WHERE ID=".$ID);
558 // after delete
559 $db_res = CForumMessage::GetList(array("ID" => "ASC"), array("TOPIC_ID" => $TOPIC_ID), false, 1);
560 $res = false;
561 if (!($db_res && $res = $db_res->Fetch())):
562 CForumTopic::Delete($TOPIC_ID);
563 else:
564 // if deleted message was first
565 if ($arMessage["NEW_TOPIC"] == "Y")
566 $DB->Update('b_forum_message', array('NEW_TOPIC' => '"Y"'), "WHERE ID=".$res["ID"]);
567 CForumTopic::SetStat($TOPIC_ID, array("DELETED_MESSAGE" => $arMessage));
568 endif;
569 $DB->Commit();
570
571 $USER_FIELD_MANAGER->Delete("FORUM_MESSAGE", $ID);
572
573 if ($AUTHOR_ID > 0):
574 CForumUser::SetStat($AUTHOR_ID);
575 endif;
576 CForumNew::SetStat($FORUM_ID, array("ACTION" => "DECREMENT", "MESSAGE" => $arMessage));
577/***************** Event onBeforeMessageAdd ************************/
578 foreach (GetModuleEvents("forum", "onAfterMessageDelete", true) as $arEvent)
579 ExecuteModuleEventEx($arEvent, array($ID, $arMessage));
580/***************** /Event ******************************************/
581 if (CModule::IncludeModule("search"))
582 {
583 CSearch::DeleteIndex("forum", $ID);
584 if (is_array($res) && !empty($res))
586 }
587 return true;
588 }
589
590 //---------------> Message list
591 public static function GetByID($ID, $arAddParams = array())
592 {
593 global $DB;
594 $ID = intval($ID);
595 if ($ID <= 0):
596 return false;
597 endif;
598
599 $arAddParams = (is_array($arAddParams) ? $arAddParams : []);
600 $arAddParams["FILTER"] = $arAddParams["FILTER"] ?? 'N';
601 $arAddParams["FILTER"] = ($arAddParams["FILTER"] == "Y" && COption::GetOptionString("forum", "FILTER", "Y") == "Y" ? "Y" : "N");
602 $arAddParams["getFiles"] = $arAddParams["getFiles"] ?? 'N';
603
604 if (!array_key_exists($ID, $GLOBALS["FORUM_CACHE"]["MESSAGE"]))
605 {
606 $strSql = "SELECT FM.*, ".$DB->DateToCharFunction("FM.POST_DATE", "FULL")." as POST_DATE,
607 ".$DB->DateToCharFunction("FM.EDIT_DATE", "FULL")." as EDIT_DATE
608 FROM b_forum_message FM
609 WHERE FM.ID = ".$ID;
610 $db_res = $DB->Query($strSql);
611 if ($db_res && $res = $db_res->Fetch())
612 {
613 $GLOBALS["FORUM_CACHE"]["MESSAGE"][$ID] = $res;
614 if ($arAddParams["FILTER"] != "Y"):
615 unset($res["HTML"]);
616 endif;
617 $db_res_filter = new CDBResult;
618 $db_res_filter->InitFromArray(array($res));
619 $db_res_filter = new _CMessageDBResult($db_res_filter, $arAddParams);
620 if ($res_filter = $db_res_filter->Fetch())
621 $GLOBALS["FORUM_CACHE"]["MESSAGE_FILTER"][$ID] = $res_filter;
622 }
623 }
624
625 if (isset($GLOBALS["FORUM_CACHE"]["MESSAGE"][$ID]))
626 {
627 $res = $GLOBALS["FORUM_CACHE"]["MESSAGE"][$ID];
628 if ($arAddParams["FILTER"] == "Y" && !empty($GLOBALS["FORUM_CACHE"]["MESSAGE_FILTER"][$ID]))
629 {
630 $res = $GLOBALS["FORUM_CACHE"]["MESSAGE_FILTER"][$ID];
631 }
632 if ($arAddParams["getFiles"] == "Y")
633 $res["FILES"] = CForumFiles::getByMessageID($ID);
634
635 return $res;
636 }
637
638 return null;
639 }
640
641 public static function GetByIDEx($ID, $arAddParams = array())
642 {
643 global $DB;
644 $ID = intval($ID);
645 $res = false;
646 if ($ID <= 0)
647 return false;
648
649 $arAddParams = (is_array($arAddParams) ? $arAddParams : array($arAddParams));
650 $arAddParams["GET_TOPIC_INFO"] = (isset($arAddParams["GET_TOPIC_INFO"]) && $arAddParams["GET_TOPIC_INFO"] == "Y" ? "Y" : "N");
651 $arAddParams["FILTER_TOPIC_INFO"] = (isset($arAddParams["FILTER_TOPIC_INFO"]) && $arAddParams["FILTER_TOPIC_INFO"] == "N" ? "N" : "Y");
652 $arAddParams["GET_FORUM_INFO"] = (isset($arAddParams["GET_FORUM_INFO"]) && $arAddParams["GET_FORUM_INFO"] == "Y" ? "Y" : "N");
653 $arAddParams["FILTER_FORUM_INFO"] = (isset($arAddParams["FILTER_FORUM_INFO"]) && $arAddParams["FILTER_FORUM_INFO"] == "N" ? "N" : "Y");
654 $arAddParams["FILTER_MESSAGE_INFO"] = (isset($arAddParams["FILTER_MESSAGE_INFO"]) && $arAddParams["FILTER_MESSAGE_INFO"] == "N" ? "N" : "Y");
655 if (COption::GetOptionString("forum", "FILTER", "Y") == "Y"):
656 $arAddParams["FILTER"] = (is_set($arAddParams, "FILTER") ? $arAddParams["FILTER"] : "P");
657 $arAddParams["FILTER"] = ($arAddParams["FILTER"] == "Y" || $arAddParams["FILTER"] == "P" ? $arAddParams["FILTER"] : "N");
658 else:
659 $arAddParams["FILTER"] = "N";
660 endif;
661 if ($arAddParams["FILTER"] == "N"):
662 $arAddParams["FILTER_TOPIC_INFO"] = "N";
663 $arAddParams["FILTER_FORUM_INFO"] = "N";
664 $arAddParams["FILTER_MESSAGE_INFO"] = "N";
665 elseif ($arAddParams["FILTER"] == "P"):
666 $arAddParams["FILTER_MESSAGE_INFO"] = "N";
667 endif;
668
669 $arSqlSelect = array();
670 $arSqlFrom = array();
671 if ($arAddParams["GET_TOPIC_INFO"] == "Y")
672 {
673 $arSqlSelect[] = CForumTopic::GetSelectFields(array("sPrefix" => "FT_", "sReturnResult" => "string"));
674 if ($arAddParams["FILTER_TOPIC_INFO"] != "N")
675 $arSqlSelect[] = "FT.HTML as FT_HTML";
676 $arSqlSelect[] = "FT.XML_ID as FT_XML_ID";
677 $arSqlFrom[] = "INNER JOIN b_forum_topic FT ON (FM.TOPIC_ID = FT.ID)";
678 }
679 if ($arAddParams["GET_FORUM_INFO"] == "Y")
680 {
681 $arSqlSelect[] = CForumNew::GetSelectFields(array("sPrefix" => "F_", "sReturnResult" => "string"));
682 if ($arAddParams["FILTER_FORUM_INFO"] != "N")
683 $arSqlSelect[] = "F.HTML as F_HTML";
684 $arSqlFrom[] = "INNER JOIN b_forum F ON (FM.FORUM_ID = F.ID)";
685 }
686
687 $strSql =
688 "SELECT FM.*, ".$DB->DateToCharFunction("FM.POST_DATE", "FULL")." as POST_DATE,
689 ".$DB->DateToCharFunction("FM.EDIT_DATE", "FULL")." as EDIT_DATE,
690 FU.SHOW_NAME, FU.DESCRIPTION, FU.NUM_POSTS, FU.POINTS as NUM_POINTS, FU.SIGNATURE, FU.AVATAR, FU.RANK_ID,
691 ".$DB->DateToCharFunction("FU.DATE_REG", "SHORT")." as DATE_REG,
692 U.EMAIL, U.PERSONAL_ICQ, U.LOGIN, U.NAME, U.SECOND_NAME, U.LAST_NAME, U.PERSONAL_PHOTO".
693 (!empty($arSqlSelect) ? ", ".implode(", ", $arSqlSelect) : "")."
694 FROM b_forum_message FM
695 LEFT JOIN b_forum_user FU ON (FM.AUTHOR_ID = FU.USER_ID)
696 LEFT JOIN b_user U ON (FM.AUTHOR_ID = U.ID)
697 ".implode(" ", $arSqlFrom)."
698 WHERE FM.ID = ".$ID."";
699 $db_res = $DB->Query($strSql);
700
701 if ($db_res && $res = $db_res->Fetch()):
702 if ($arAddParams["FILTER_MESSAGE_INFO"] == "N"):
703 unset($res["HTML"]);
704 endif;
705
706 if ($arAddParams["GET_TOPIC_INFO"] == "Y" && COption::GetOptionString("forum", "FILTER", "Y") == "Y"):
707 $arTopic = [];
708 foreach ($res as $key => $val):
709 if (strpos($key, "FT_") === 0)
710 $arTopic[mb_substr($key, 3)] = $val;
712 if (!empty($arTopic['ID'])):
713 $GLOBALS["FORUM_CACHE"]["TOPIC"][intval($arTopic['ID'])] = $arTopic;
714 $db_res_filter = new CDBResult;
715 $db_res_filter->InitFromArray(array($arTopic));
716 $db_res_filter = new _CTopicDBResult($db_res_filter);
717 if ($res_filter = $db_res_filter->Fetch())
718 $GLOBALS["FORUM_CACHE"]["TOPIC_FILTER"][$arTopic['ID']] = $res_filter;
719 endif;
720 endif;
721 $db_res = new CDBResult;
722 $db_res->InitFromArray(array($res));
723 $db_res = new _CMessageDBResult($db_res, $arAddParams);
724 $res = $db_res->Fetch();
725
726 if ($arAddParams["GET_TOPIC_INFO"] == "Y" || $arAddParams["GET_FORUM_INFO"] == "Y"):
727 $res["TOPIC_INFO"] = array();
728 $res["FORUM_INFO"] = array();
729 $res["MESSAGE_INFO"] = array();
730 foreach ($res as $key => $val):
731 if (mb_substr($key, 0, 3) == "FT_")
732 $res["TOPIC_INFO"][mb_substr($key, 3)] = $val;
733 elseif (mb_substr($key, 0, 2) == "F_")
734 $res["FORUM_INFO"][mb_substr($key, 2)] = $val;
735 else
736 $res["MESSAGE_INFO"][$key] = $val;
738 if (COption::GetOptionString("forum", "FILTER", "Y") != "Y" && !empty($res["TOPIC_INFO"])):
739 $GLOBALS["FORUM_CACHE"]["TOPIC"][intval($res["TOPIC_INFO"]["ID"])] = $res["TOPIC_INFO"];
740 endif;
741 if (!empty($res["FORUM_INFO"])):
742 $GLOBALS["FORUM_CACHE"]["FORUM"][intval($res["FORUM_INFO"]["ID"])] = $res["FORUM_INFO"];
743 endif;
744 endif;
745 if (isset($arAddParams["getFiles"]) && $arAddParams["getFiles"] == "Y" && !empty($res))
746 $res["FILES"] = CForumFiles::getByMessageID($ID);
747 return $res;
748 endif;
749 return false;
750 }
751
752 //---------------> Message utils
753 public static function GetMessagePage($ID, $messagePerPage, $arUserGroups, $TID = 0, $addParams = [])
754 {
755 $ID = intval($ID);
756 $TID = intval($TID);
757 $messagePerPage = intval($messagePerPage);
758
759 if ($messagePerPage <= 0 || $ID <= 0)
760 return 0;
761
762 $addParams = (is_array($addParams) ? $addParams : []);
763
765 if (!empty($addParams["PERMISSION_EXTERNAL"]))
766 {
767 $permission = $addParams["PERMISSION_EXTERNAL"];
768 }
769 else if ($message = CForumMessage::GetByID($ID, array("FILTER" => "N")))
770 {
771 $permission = CForumNew::GetUserPermission($message["FORUM_ID"], $arUserGroups);
772 }
773 else if ($TID > 0 && ($topic = \Bitrix\Forum\Topic::getById($TID)))
774 {
775 $permission = CForumNew::GetUserPermission($topic["FORUM_ID"], $arUserGroups);
776 }
777
778 $filter = (isset($addParams["FILTER"]) && is_array($addParams["FILTER"]) ? $addParams["FILTER"] : []);
779 if ($permission < "Q")
780 {
781 $filter["APPROVED"] = "Y";
782 }
783 if ($TID > 0)
784 {
785 $filter["TOPIC_ID"] = $TID;
786 }
787
788 $order = (isset($addParams["ORDER_DIRECTION"]) && $addParams["ORDER_DIRECTION"] == "DESC" ? "DESC" : "ASC");
789 if ($order == "DESC")
790 {
791 $filter[">ID"] = $ID;
792 }
793 else
794 {
795 $filter["<ID"] = $ID;
796 }
797
798 $iCnt = intval(intval(CForumMessage::GetList(array("ID" => $order), $filter, true)) / $messagePerPage);
799 return ++$iCnt;
800 }
801
802 public static function SendMailMessage($MID, $arFields = array(), $strLang = false, $mailTemplate = false)
803 {
804 global $USER;
805 $MID = intval($MID);
806 $arMessage = array(); $arTopic = array(); $arForum = array(); $arFiles = array();
807 $mailTemplate = ($mailTemplate === false ? "NEW_FORUM_MESSAGE" : $mailTemplate);
808 $event = new CEvent;
809 if ($MID > 0)
810 {
811 CTimeZone::Disable();
812 $arMessage = CForumMessage::GetByIDEx($MID, array("GET_TOPIC_INFO" => "Y", "GET_FORUM_INFO" => "Y", "FILTER" => "Y"));
813 CTimeZone::Enable();
814
815 $db_files = CForumFiles::GetList(array("MESSAGE_ID" => "ASC"), array("MESSAGE_ID" => $MID));
816 if ($db_files && $res = $db_files->Fetch())
817 {
818 do
819 {
820 $arFiles[$res["ID"]] = CFile::GetFileArray($res["FILE_ID"]);
821 } while ($res = $db_files->Fetch());
822 }
823 }
824 if (empty($arMessage))
825 return false;
826
827 $arTopic = $arMessage["TOPIC_INFO"];
828 $arForum = $arMessage["FORUM_INFO"];
829 $TID = intval($arMessage["TOPIC_ID"]);
830 $FID = intval($arMessage["FORUM_ID"]);
831
832 if (!is_set($arFields, "FORUM_ID")) $arFields["FORUM_ID"] = $arMessage["FORUM_ID"];
833 if (!is_set($arFields, "FORUM_NAME")) $arFields["FORUM_NAME"] = $arForum["NAME"];
834 if (!is_set($arFields, "TOPIC_ID")) $arFields["TOPIC_ID"] = $arMessage["TOPIC_ID"];
835 if (!is_set($arFields, "MESSAGE_ID")) $arFields["MESSAGE_ID"] = $arMessage["ID"];
836 if (!is_set($arFields, "TOPIC_TITLE")) $arFields["TOPIC_TITLE"] = $arTopic["TITLE"];
837
838 if (!is_set($arFields, "MESSAGE_DATE")) $arFields["MESSAGE_DATE"] = $arMessage["POST_DATE"];
839 if (!is_set($arFields, "AUTHOR")) $arFields["AUTHOR"] = $arMessage["AUTHOR_NAME"];
840 if (!is_set($arFields, "TAPPROVED")) $arFields["TAPPROVED"] = $arTopic["APPROVED"];
841 if (!is_set($arFields, "MAPPROVED")) $arFields["MAPPROVED"] = $arMessage["APPROVED"];
842 if (!is_set($arFields, "FROM_EMAIL")) $arFields["FROM_EMAIL"] = COption::GetOptionString("forum", "FORUM_FROM_EMAIL", "nomail@nomail.nomail");
843
844 //If the message is from socialnetwork, check if mail processor exists for this social network
845 if($arTopic["SOCNET_GROUP_ID"]>0)
846 {
847 if(CModule::IncludeModule("mail") && CModule::IncludeModule("socialnetwork"))
848 {
849 $arMailParams = CForumEMail::GetForumFilters($FID, $arTopic["SOCNET_GROUP_ID"]);
850 //If the processor exists:
851 if($arMailParams)
852 {
853 global $DB;
854 if($arMessage["XML_ID"]=='')
855 {
856 //check if MSG_ID field exists, generate it if not
857 $arMessage["XML_ID"] = "M".$MID.".".md5(uniqid())."@".($_SERVER["SERVER_NAME"]!=''?$_SERVER["SERVER_NAME"]:$_SERVER["SERVER_ADDR"]);
858 $DB->Query("UPDATE b_forum_message SET XML_ID='".$DB->ForSQL($arMessage["XML_ID"])."' WHERE ID=".$MID);
859 }
860
861 //get MSG_ID topics, it would be IN_REPLY_TO
862 if($arTopic["XML_ID"]=='')
863 {
864 $arTopic["XML_ID"] = "T".$TID.".".md5(uniqid())."@".($_SERVER["SERVER_NAME"]!=''?$_SERVER["SERVER_NAME"]:$_SERVER["SERVER_ADDR"]);
865 $DB->Query("UPDATE b_forum_topic SET XML_ID='".$DB->ForSQL($arTopic["XML_ID"])."' WHERE ID=".$TID);
866 }
867
868 //fill FROM_EMAIL from AUTHOR_NAME + FROM_EMAIL or AUTHOR_EMAIL or from 'b_user' by AUTHOR_ID depending on the settings of mail processor
869 if($arMailParams['USE_EMAIL'] == 'Y' && $arMessage["AUTHOR_EMAIL"]!='')
870 $arFields["FROM_EMAIL"] = '"'.$arMessage['AUTHOR_NAME'].'" <'.$arMessage['AUTHOR_EMAIL'].'>';
871 elseif($arMailParams['USE_EMAIL'] == 'Y' && $arMessage["EMAIL"]!='')
872 $arFields["FROM_EMAIL"] = '"'.$arMessage['AUTHOR_NAME'].'" <'.$arMessage['EMAIL'].'>';
873 else
874 $arFields["FROM_EMAIL"] = '"'.$arMessage['AUTHOR_NAME'].'" <'.$arMailParams['EMAIL'].'>';
875
876 if($arMessage["NEW_TOPIC"]=="Y")
877 {
878 $arFields["=Message-Id"] = $arFields["MSG_ID"] = "<".$arTopic["XML_ID"].">";
879 }
880 else
881 {
882 $arFields["TOPIC_TITLE"] = "Re".($arMessage["TOPIC_INFO"]["POSTS"]>1?"[".$arMessage["TOPIC_INFO"]["POSTS"]."]":"").": ".$arFields["TOPIC_TITLE"];
883 $arFields["=Message-Id"] = $arFields["MSG_ID"] = "<".$arMessage["XML_ID"].">";
884 $arFields["=In-Reply-To"] = $arFields["IN_REPLY_TO"] = "<".$arTopic["XML_ID"].">";
885 }
886 //fill REPLY_TO from the settings of the mail processor
887 $arFields["=Reply-To"] = $arFields["REPLY_TO"] = $arMailParams["EMAIL"];
888 $arFields["FORUM_EMAIL"] = $arMailParams["EMAIL"];
889
890 $arSocNetGroup = CSocNetGroup::GetById($arTopic["SOCNET_GROUP_ID"]);
891 $arFields["FORUM_NAME"] = $arSocNetGroup["NAME"];
892
893 if($arMailParams["SUBJECT_SUF"] != '')
894 $arFields["TOPIC_TITLE"] .= ' '.$arMailParams["SUBJECT_SUF"];
895 if($arMailParams["USE_SUBJECT"] == "Y")
896 $arFields["=Subject"] = $arFields["TOPIC_TITLE"];
897
898 $arFields["PATH2FORUM"] = CComponentEngine::MakePathFromTemplate($arMailParams["URL_TEMPLATES_MESSAGE"], array("FID" => $arMessage["FORUM_ID"], "TID" => $arMessage["TOPIC_ID"], "TITLE_SEO" => $arMessage["TOPIC_INFO"]["TITLE_SEO"], "MID" => $arMessage["ID"]));
899 }
900 else
901 return false;
902 }
903 else
904 return false;
905 }
906 else
907 {
908 $arForumSites = CForumNew::GetSites($FID);
909 foreach ($arForumSites as $site_id => $path):
910 $arForumSites[$site_id] = trim(CForumNew::PreparePath2Message($arForumSites[$site_id],
911 array("FORUM_ID" => $arMessage["FORUM_ID"], "TOPIC_ID" => $arMessage["TOPIC_ID"], "TITLE_SEO" => $arMessage["TOPIC_INFO"]["TITLE_SEO"], "MESSAGE_ID" => $arMessage["ID"],
912 "SOCNET_GROUP_ID" => $arTopic["SOCNET_GROUP_ID"], "OWNER_ID" => $arTopic["OWNER_ID"],
913 "PARAM1" => $arMessage["PARAM1"], "PARAM2" => $arMessage["PARAM2"])));
914 if (empty($arForumSites[$site_id])):
915 $db_lang = CSite::GetByID($site_id);
916 $arForumSites[$site_id] = "/";
917 if ($ar_lang = $db_lang->Fetch())
918 $arForumSites[$site_id] = $ar_lang["DIR"];
919 $arForumSites[$site_id] = COption::GetOptionString("forum", "REL_FPATH", "").
920 "forum/read.php?FID=#FID#&TID=#TID#&MID=#MID##message#MID#";
921 endif;
923 foreach(GetModuleEvents("forum", "onBeforeMailMessageSend", true) as $arEvent)
924 {
925 if (ExecuteModuleEventEx($arEvent, array(&$mailTemplate, &$arForumSites, &$arFields, $arForum, $arTopic, $arMessage)) === false)
926 return false;
927 }
928 }
929
930 /*
931 ??
932 ALTER TABLE dbo.B_FORUM_MESSAGE ADD
933 MSG_ID varchar(255) NULL,
934 MAIL_MESSAGE_ID int NULL
935
936 */
937
939 "FORUM_ID" => $FID,
940 "TOPIC_ID_OR_NULL" => $TID,
941 "ACTIVE" => "Y",
942 ">=PERMISSION" => (($arTopic["APPROVED"] != "Y" || $arMessage["APPROVED"] != "Y") ? "Q" : "E")
943 );
944 if ($arMessage["NEW_TOPIC"] != "Y")
945 $arFilter["NEW_TOPIC_ONLY"] = "N";
946 if ($mailTemplate == "NEW_FORUM_MESSAGE")
947 $arFilter["LAST_SEND_OR_NULL"] = $MID;
948
949 if($arTopic["SOCNET_GROUP_ID"]>0)
950 {
951 $mailTemplate = "FORUM_NEW_MESSAGE_MAIL";
952 $arFilter["SOCNET_GROUP_ID"] = $arTopic["SOCNET_GROUP_ID"];
953 }
954 else
955 $arFilter["SOCNET_GROUP_ID"] = false;
956
957 $db_res = CForumSubscribe::GetListEx(array("USER_ID" => "ASC"), $arFilter);
958 $arID = array(); $arSiteFields = array();
959 $currentUserID = false;
960 while ($res = $db_res->Fetch())
961 {
962 // SUBSC_GET_MY_MESSAGE - Send my messages to myself.
963 if ($res["SUBSC_GET_MY_MESSAGE"] == "N" && $res["USER_ID"] == $USER->GetId())
964 continue;
965
966 // SUBSC_GROUP_MESSAGE - Group messages.
967 if ($currentUserID == $res["USER_ID"])
968 continue;
969
970 // Check email
971 if (empty($res["EMAIL"]))
972 continue;
973
974 if($mailTemplate == "FORUM_NEW_MESSAGE_MAIL" && $res["USER_ID"] == $arMessage["AUTHOR_ID"])
975 continue;
976
977 $currentUserID = $res["USER_ID"];
978 $arFields_tmp = $arFields;
979
980 if (!is_set($arFields_tmp, "PATH2FORUM"))
981 {
982 $arFields_tmp["PATH2FORUM"] = $arForumSites[$res["SITE_ID"]];
983 }
984
985 if (!is_set($arFields_tmp, "MESSAGE_TEXT"))
986 {
987 if (!isset(${"parser_".$res["SITE_ID"]}))
988 ${"parser_".$res["SITE_ID"]} = new forumTextParser($res["SITE_ID"]);
989 if (empty($arSiteFields[$res["SITE_ID"]]))
990 {
991 $arSiteFields[$res["SITE_ID"]] = $event->GetSiteFieldsArray($res["SITE_ID"]);
992 $db_site = CSite::GetByID($res["SITE_ID"]);
993 if ($db_site && $arSite = $db_site->Fetch())
994 {
995 $arSiteFields[$res["SITE_ID"]] = array_merge($arSiteFields[$res["SITE_ID"]], $arSite,
996 array("LANG_MESS" => IncludeModuleLangFile(__FILE__, $arSiteFields[$res["SITE_ID"]]["LANGUAGE_ID"] ?? null, true)));
997 $arSiteFields[$res["SITE_ID"]]["ATTACHED_FILES"] = $arSiteFields[$res["SITE_ID"]]["LANG_MESS"]["F_ATTACHED_FILES"];
998 }
999 }
1000 if (!empty($arSiteFields[$res["SITE_ID"]]["SERVER_NAME"]))
1001 ${"parser_".$res["SITE_ID"]}->serverName = $arSiteFields[$res["SITE_ID"]]["SERVER_NAME"];
1002 ${"parser_".$res["SITE_ID"]}->arFiles = $arFiles;
1003
1004 $POST_MESSAGE_HTML = $arMessage["POST_MESSAGE"];
1005 if (COption::GetOptionString("forum", "FILTER", "Y") == "Y")
1006 $POST_MESSAGE_HTML = (empty($arMessage["POST_MESSAGE_FILTER"]) ? CFilterUnquotableWords::Filter($POST_MESSAGE_HTML) : $arMessage["POST_MESSAGE_FILTER"]);
1007 $arFields_tmp["MESSAGE_TEXT"] = ${"parser_".$res["SITE_ID"]}->convert4mail($POST_MESSAGE_HTML);
1008 $arFields_tmp["PARSED_FILES"] = ${"parser_".$res["SITE_ID"]}->arFilesIDParsed;
1009 $tmp = array_diff(array_keys($arFiles), ${"parser_".$res["SITE_ID"]}->arFilesIDParsed);
1010 if (!empty($tmp))
1011 {
1012 $str = "[FILE ID=".implode("]\n[FILE ID=", $tmp)."]";
1013 ${"parser_".$res["SITE_ID"]}->ParserFile($str, ${"parser_".$res["SITE_ID"]}, "mail");
1014 $arFields_tmp["MESSAGE_TEXT"] .= "\n\n".$arSiteFields[$res["SITE_ID"]]["ATTACHED_FILES"]."\n".$str;
1015 }
1016 }
1017
1018 $arFields_tmp["RECIPIENT"] = $res["EMAIL"];
1019 $event->Send($mailTemplate, $res["SITE_ID"], $arFields_tmp, "N");
1020 $arID[] = $res["ID"];
1021 if (count($arID) > 255)
1022 {
1023 CForumSubscribe::UpdateLastSend($MID, implode(",", $arID));
1024 $arID = array();
1025 }
1026 }
1027 if (count($arID) > 0)
1028 {
1029 CForumSubscribe::UpdateLastSend($MID, implode(",", $arID));
1030 }
1031 return true;
1032 }
1033
1034 public static function GetFirstUnreadEx($FID, $TID, $arUserGroups) // out-of-date function
1035 {
1036 $FID = intval($FID);
1037 $TID = intval($TID);
1038 if ($FID<=0) return false;
1039
1040 $f_PERMISSION = CForumNew::GetUserPermission($FID, $arUserGroups);
1041 return CForumMessage::GetFirstUnread($FID, $TID, $f_PERMISSION);
1042 }
1043
1044 public static function GetFirstUnread($FID, $TID, $PERMISSION) // out-of-date function
1045 {
1046 $FID = intval($FID);
1047 $TID = intval($TID);
1048 if ($FID<=0) return false;
1049 if ($PERMISSION == '') return false;
1050
1051 $MESSAGE_ID = 0;
1052 $TOPIC_ID = 0;
1053
1054 $read_forum_cookie = COption::GetOptionString("main", "cookie_name", "BITRIX_SM")."_FORUM_0";
1055 if ($_SESSION["first_read_forum_".$FID] == '' || intval($_SESSION["first_read_forum_".$FID])<0)
1056 {
1057 if (isset($_COOKIE[$read_forum_cookie]) && $_COOKIE[$read_forum_cookie] <> '')
1058 {
1059 $arForumCookie = explode("/", $_COOKIE[$read_forum_cookie]);
1060 $i = 0;
1061 while ($i < count($arForumCookie))
1062 {
1063 if (intval($arForumCookie[$i])==$FID)
1064 {
1065 $iCurFirstReadForum = intval($arForumCookie[$i+1]);
1066 break;
1067 }
1068 $i += 2;
1069 }
1070 }
1071
1072 $read_forum_cookie1 = COption::GetOptionString("main", "cookie_name", "BITRIX_SM")."_FORUM_".$FID;
1073 if (isset($_COOKIE[$read_forum_cookie1]) && intval($_COOKIE[$read_forum_cookie1])>0)
1074 {
1075 if ($iCurFirstReadForum<intval($_COOKIE[$read_forum_cookie1]))
1076 {
1077 $iCurFirstReadForum = intval($_COOKIE[$read_forum_cookie1]);
1078 }
1079 }
1080
1081 $_SESSION["first_read_forum_".$FID] = intval($iCurFirstReadForum);
1082 }
1083 if (is_null($_SESSION["read_forum_".$FID]) || $_SESSION["read_forum_".$FID] == '')
1084 {
1085 $_SESSION["read_forum_".$FID] = "0";
1086 }
1087
1088 $arFilter = array("FORUM_ID" => $FID);
1089 if (intval($_SESSION["first_read_forum_" . $FID])>0)
1090 $arFilter[">ID"] = intval($_SESSION["first_read_forum_" . $FID]);
1091 if ($_SESSION["read_forum_" . $FID]!="0")
1092 {
1093 $arFMIDsTmp = explode(",", $_SESSION["read_forum_" . $FID]);
1094 if (count($arFMIDsTmp)>950)
1095 {
1096 for ($i1 = 0; $i1<count($arFMIDsTmp); $i1++)
1097 {
1098 if (intval($_SESSION["first_read_forum_" . $FID]) < intval($arFMIDsTmp[$i1]))
1099 {
1100 $_SESSION["first_read_forum_" . $FID] = intval($arFMIDsTmp[$i1]);
1101 }
1102 }
1103 $_SESSION["read_forum_" . $FID] = "0";
1104 $arFilter[">ID"] = intval($_SESSION["first_read_forum_" . $FID]);
1105 }
1106 else
1107 {
1108 $arFilter["!@ID"] = $_SESSION["read_forum_" . $FID];
1109 }
1110 }
1111 if ($PERMISSION<="Q") $arFilter["APPROVED"] = "Y";
1112 if ($TID>0) $arFilter["TOPIC_ID"] = $TID;
1113
1114 //$db_res = CForumMessage::GetList(array("ID"=>"ASC"), $arFilter, false, 1);
1116
1117 if ($res = $db_res->Fetch())
1118 {
1119 $MESSAGE_ID = $res["ID"];
1120 $TOPIC_ID = $res["TOPIC_ID"];
1121 }
1122
1123 return array($TOPIC_ID, $MESSAGE_ID);
1124 }
1125
1126 public static function OnSocNetLogFormatEvent($arEvent, $arParams)
1127 {
1128 if ($arEvent["EVENT_ID"] == "forum")
1129 {
1130 $arTmp = explode("&", $arEvent["PARAMS"]);
1131 foreach ($arTmp as $strTmp)
1132 {
1133 list($key, $value) = explode("=", $strTmp, 2);
1134 if($key == "type")
1135 {
1136 $type = $value;
1137 break;
1138 }
1139 }
1140
1141 if ($type == "M")
1142 $arEvent["TITLE_TEMPLATE"] = "#USER_NAME# ".GetMessage("F_SONET_MESSAGE_TITLE");
1143 elseif ($type == "T")
1144 $arEvent["TITLE_TEMPLATE"] = "#USER_NAME# ".GetMessage("F_SONET_TOPIC_TITLE");
1145 }
1146
1147 return $arEvent;
1148 }
1149
1154 public static function setWebdavRights($arFilter, $rights)
1155 {
1156 if (IsModuleInstalled("webdav"))
1157 {
1158 $arFilter = (is_array($arFilter) ? $arFilter : array($arFilter));
1159 $arFilter[">UF_FORUM_MESSAGE_DOC"] = 0;
1160 $db_res = CForumMessage::GetList(array("ID" => "ASC"), $arFilter, false, 0, array("SELECT" => array("UF_FORUM_MESSAGE_DOC")));
1161 $arDocs = array();
1162 if ($db_res && ($res = $db_res->Fetch()))
1163 {
1164 do {
1165 if (!empty($res["UF_FORUM_MESSAGE_DOC"]) && is_array($res["UF_FORUM_MESSAGE_DOC"]))
1166 $arDocs = array_merge($arDocs, $res["UF_FORUM_MESSAGE_DOC"]);
1167 } while ($res = $db_res->Fetch());
1168 }
1169 if (!empty($arDocs) && CModule::IncludeModule("webdav"))
1170 {
1171 CWebDavIblock::appendRightsOnElements($arDocs, $rights);
1172 }
1173 }
1174 }
1175
1176 public static function GetMentionedUserID($strMessage)
1177 {
1178 $arMentionedUserID = array();
1179
1180 if ($strMessage <> '')
1181 {
1182 preg_match_all("/\[user\s*=\s*([^\]]*)\](.+?)\[\/user\]/isu", $strMessage, $arMention);
1183 if (!empty($arMention))
1184 {
1185 $arMentionedUserID = array_merge($arMentionedUserID, $arMention[1]);
1186 }
1187 }
1188
1189 return $arMentionedUserID;
1190 }
1191}
1192
1193class _CMessageDBResult extends CDBResult
1194{
1196 public function __construct($res, $params = array())
1197 {
1198 $this->sNameTemplate = (!empty($params["sNameTemplate"]) ? $params["sNameTemplate"] : '');
1199 $this->checkUserFields = false;
1200 $this->arUserFields = false;
1201 if (array_key_exists("SELECT", $params))
1202 {
1203 global $USER_FIELD_MANAGER;
1204 $this->arUserFields = $USER_FIELD_MANAGER->GetUserFields("FORUM_MESSAGE", 0, LANGUAGE_ID);
1205 $this->checkUserFields = (!empty($this->arUserFields));
1206 }
1207 parent::__construct($res);
1208 }
1209 function Fetch()
1210 {
1211 global $DB;
1212 $arFields = array();
1213 if($res = parent::Fetch())
1214 {
1215 if (COption::GetOptionString("forum", "MESSAGE_HTML", "N") == "Y" ||
1216 COption::GetOptionString("forum", "FILTER", "Y") == "Y")
1217 {
1218 $res["POST_MESSAGE_HTML"] = trim($res["POST_MESSAGE_HTML"]);
1219 $res["POST_MESSAGE_FILTER"] = trim($res["POST_MESSAGE_FILTER"]);
1220 if (empty($res["POST_MESSAGE_HTML"]) && COption::GetOptionString("forum", "MESSAGE_HTML", "N") == "Y" ||
1221 empty($res["POST_MESSAGE_FILTER"]) && COption::GetOptionString("forum", "FILTER", "Y") == "Y")
1222 {
1223 $arForum = CForumNew::GetByID($res["FORUM_ID"]);
1224 if ((COption::GetOptionString("forum", "FILTER", "Y") == "Y") && empty($res["POST_MESSAGE_FILTER"]))
1225 {
1226 $arFields["POST_MESSAGE_FILTER"] = CFilterUnquotableWords::Filter($res["POST_MESSAGE"]);
1227 $arFields["POST_MESSAGE_FILTER"] = (empty($arFields["POST_MESSAGE_FILTER"]) ? "*" : $arFields["POST_MESSAGE_FILTER"]);
1228 }
1229 if (COption::GetOptionString("forum", "MESSAGE_HTML", "N") == "Y" && empty($res["POST_MESSAGE_HTML"]))
1230 {
1231 /* Info about one file is saved in old table field ATTACH_IMG */
1232 $arFiles = false;
1233 if (intval($res["ATTACH_IMG"]) > 0)
1234 {
1235 $arFiles = array();
1236 $db_files = CForumFiles::GetList(array("MESSAGE_ID" => "ASC"), array("MESSAGE_ID" => $res["ID"]));
1237 if ($db_files && $res_file = $db_files->Fetch())
1238 {
1239 do
1240 {
1241 $res_file["SRC"] = CFile::GetFileSRC($res);
1242 $arFiles[$res_file["ID"]] = $res_file;
1243 } while ($res_file = $db_files->Fetch());
1244 }
1245 }
1246 $parser = new forumTextParser(LANGUAGE_ID);
1247 $allow = forumTextParser::GetFeatures($arForum);
1248 $allow['SMILES'] = ($res["USE_SMILES"] == "Y" ? $allow['SMILES'] : "N");
1249 $POST_MESSAGE_HTML = (is_set($arFields, "POST_MESSAGE_FILTER") ? $arFields["POST_MESSAGE_FILTER"] : $res["POST_MESSAGE"]);
1250 $arFields["POST_MESSAGE_HTML"] = $parser->convert($POST_MESSAGE_HTML, $allow, "html", $arFiles);
1251 }
1252 $strUpdate = $DB->PrepareUpdate("b_forum_message", $arFields);
1253 $strSql = "UPDATE b_forum_message SET ".$strUpdate." WHERE ID = ".intval($res["ID"]);
1254 if ($DB->QueryBind($strSql, $arFields))
1255 {
1256 foreach ($arFields as $key => $val)
1257 $res[$key] = $val;
1258 }
1259 }
1260 }
1261 if (COption::GetOptionString("forum", "FILTER", "Y") == "Y")
1262 {
1263 if (is_set($res, "HTML") || is_set($res, "FM_HTML"))
1264 {
1265 $arr = @unserialize(is_set($res, "HTML") ? $res["HTML"] : $res["FM_HTML"], ["allowed_classes" => false]);
1266 if (empty($arr) || !is_array($arr))
1267 {
1268 $arr = array(
1269 "AUTHOR_NAME" => $res["AUTHOR_NAME"],
1270 "AUTHOR_EMAIL" => $res["AUTHOR_EMAIL"],
1271 "EDITOR_NAME" => $res["EDITOR_NAME"],
1272 "EDITOR_EMAIL" => $res["EDITOR_EMAIL"],
1273 "EDIT_REASON" => $res["EDIT_REASON"]);
1274 foreach ($arr as $key => $val)
1275 {
1276 if (!empty($val)):
1278 $arr[$key] = (empty($val) ? "*" : $val);
1279 else:
1280 $arr[$key] = '';
1281 endif;
1282 }
1283 $arFields = array("HTML" => serialize($arr));
1284 $strUpdate = $DB->PrepareUpdate("b_forum_message", $arFields);
1285 $strSql = "UPDATE b_forum_message SET ".$strUpdate." WHERE ID = ".intval($res["ID"]);
1286 $DB->QueryBind($strSql, $arFields);
1287 }
1288 foreach ($arr as $key => $val)
1289 {
1290 $res["~".$key] = $res[$key];
1291 $res["".$key] = $val;
1292 }
1293 }
1294
1295 if (!empty($res["FT_HTML"]))
1296 {
1297 $arr = @unserialize($res["FT_HTML"], ["allowed_classes" => false]);
1298 if (is_array($arr) && !empty($arr["TITLE"]))
1299 {
1300 foreach ($arr as $key => $val)
1301 {
1302 if (isset($res["FT_".$key]))
1303 {
1304 $res["~FT_".$key] = $res["FT_".$key];
1305 $res["FT_".$key] = $val;
1306 }
1307 }
1308 }
1309 }
1310
1311 if (!empty($res["F_HTML"]))
1312 {
1313 $arr = @unserialize($res["F_HTML"], ["allowed_classes" => false]);
1314 if (is_array($arr))
1315 {
1316 foreach ($arr as $key => $val)
1317 {
1318 if (isset($res["F_".$key]))
1319 {
1320 $res["~F_".$key] = $res["F_".$key];
1321 $res["F_".$key] = $val;
1322 }
1323 }
1324 }
1325 if (!empty($res["FT_TITLE"]))
1326 $res["F_TITLE"] = $res["FT_TITLE"];
1327 }
1328 }
1329 if (!empty($this->sNameTemplate))
1330 {
1331 $arTmp = array();
1332 foreach (array(
1333 "AUTHOR_ID" => "AUTHOR_NAME",
1334 "EDITOR_ID" => "EDITOR_NAME",
1335 "USER_START_ID" => "USER_START_NAME") as $id => $name)
1336 {
1337 if (array_key_exists($id, $res))
1338 {
1339 $tmp = "";
1340 if (!empty($res[$id]))
1341 {
1342 if (in_array($res[$id], $arTmp))
1343 {
1344 $tmp = $arTmp[$res[$id]];
1345 }
1346 else
1347 {
1348 $arTmp[$res[$id]] = $tmp = (!empty($res[$name."_FRMT"]) ? $res[$name."_FRMT"] :
1349 CForumUser::GetFormattedNameByUserID($res[$id], $this->sNameTemplate, ($id == "AUTHOR_ID" ? $res : array())));
1350 }
1351 }
1352 $res[$name] = (!empty($tmp) ? $tmp : $res[$name]);
1353 unset($res[$name."_FRMT"]);
1354 }
1355 }
1356 }
1357
1358 if ($this->checkUserFields)
1359 {
1360 $arUF = array_intersect_key($res, $this->arUserFields);
1361 if (empty($arUF))
1362 $this->checkUserFields = false;
1363 else
1364 {
1365 foreach($arUF as $k => $v)
1366 {
1367 $res[$k] = $this->arUserFields[$k];
1368 $res[$k]["ENTITY_VALUE_ID"] = $res["ID"];
1369 $res[$k]["VALUE"] = $v;
1370
1371 if (method_exists($GLOBALS['USER_FIELD_MANAGER'], 'getCustomData'))
1372 {
1373 $res[$k]["CUSTOM_DATA"] = $GLOBALS['USER_FIELD_MANAGER']->getCustomData(
1374 $res[$k],
1375 (int)$res["ID"]
1376 );
1377 }
1378 }
1379 }
1380 }
1381 }
1382 return $res;
1383 }
1384}
1385
1387{
1388 public static function getByMessageID($ID)
1389 {
1390 $ID = intval($ID);
1391 $res = array();
1392 if ($ID > 0 )
1393 {
1394 if (!isset($GLOBALS["FORUM_CACHE"]["MESSAGE_FILES"]) || !is_array($GLOBALS["FORUM_CACHE"]["MESSAGE_FILES"]))
1395 $GLOBALS["FORUM_CACHE"]["MESSAGE_FILES"] = array();
1396
1397 if (!array_key_exists($ID, $GLOBALS["FORUM_CACHE"]["MESSAGE_FILES"]))
1398 {
1399 $GLOBALS["FORUM_CACHE"]["MESSAGE_FILES"][$ID] = array();
1400 $db_files = CForumFiles::GetList(array("MESSAGE_ID" => "ASC"), array("MESSAGE_ID" => $ID));
1401 if ($db_files && ($res_file = $db_files->Fetch()))
1402 {
1403 do {
1404 $GLOBALS["FORUM_CACHE"]["MESSAGE_FILES"][$ID][$res_file["FILE_ID"]] = $res_file;
1405 } while ($res_file = $db_files->Fetch());
1406 }
1407 }
1408 $res = $GLOBALS["FORUM_CACHE"]["MESSAGE_FILES"][$ID];
1409 }
1410 return $res;
1411 }
1412
1413 public static function CheckFields(&$arFields, &$arParams, $ACTION = "ADD", $extParams = array())
1414 {
1415 $aMsg = array();
1416 $arFiles = (!is_array($arFields) ? array($arFields) : $arFields);
1417 $arParams = (!is_array($arParams) ? array($arParams) : $arParams);
1418 $arParams["FORUM_ID"] = intval($arParams["FORUM_ID"]);
1419 if (isset($arParams["TOPIC_ID"]))
1420 $arParams["TOPIC_ID"] = intval($arParams["TOPIC_ID"]);
1421 $arParams["MESSAGE_ID"] = intval($arParams["MESSAGE_ID"]);
1422 $arParams["USER_ID"] = intval($arParams["USER_ID"]);
1423
1424 if (empty($arFiles))
1425 return true;
1426 elseif (!empty($arFiles["name"]))
1428 $ACTION = ($ACTION == "UPDATE" || "NOT_CHECK_DB" ? $ACTION : "ADD");
1429
1430 if ($arParams["FORUM_ID"] <= 0):
1431 $aMsg[] = array(
1432 "id" => 'bad_forum',
1433 "text" => GetMessage("F_ERR_EMPTY_FORUM_ID"));
1434 else:
1435 // Y - Image files F - Files of specified type A - All files
1436 $arForum = (!!$extParams["FORUM"] ? $extParams["FORUM"] : CForumNew::GetByID($arParams["FORUM_ID"]));
1437 if (empty($arForum))
1438 $aMsg[] = array(
1439 "id" => 'bad_forum',
1440 "text" => GetMessage("F_ERR_FORUM_IS_LOST"));
1441 elseif (!in_array($arForum["ALLOW_UPLOAD"], array("Y", "F", "A")))
1442 $aMsg[] = array(
1443 "id" => 'bad_forum_permission',
1444 "text" => GetMessage("F_ERR_UPOAD_IS_DENIED"));
1445 endif;
1446 if (empty($aMsg)):
1447 $arFilesExists = array();
1448 $iFileSize = intval(COption::GetOptionString("forum", "file_max_size", 5242880));
1449 foreach ($arFiles as $key => $val):
1450 $res = "";
1451 if ($val["name"] == '' && intval($val["FILE_ID"]) <= 0):
1452 unset($arFiles[$key]);
1453 continue;
1454 elseif ($val["name"] <> ''):
1455 if ($arForum["ALLOW_UPLOAD"] == "Y"):
1456 $res = CFile::CheckImageFile($val, $iFileSize, 0, 0);
1457 elseif ($arForum["ALLOW_UPLOAD"] == "F"):
1458 $res = CFile::CheckFile($val, $iFileSize, false, $arForum["ALLOW_UPLOAD_EXT"]);
1459 else:
1460 $res = CFile::CheckFile($val, $iFileSize, false, false);
1461 endif;
1462 if ($res <> '')
1463 {
1464 $aMsg[] = array(
1465 "id"=>'attach_error',
1466 "text" => $res);
1467 }
1468 endif;
1469
1470 if (intval($val["FILE_ID"]) > 0):
1471 $arFiles[$key]["old_file"] = $val["FILE_ID"];
1472 $arFilesExists[$val["FILE_ID"]] = $val;
1473 continue;
1474 endif;
1475 endforeach;
1476 if ($ACTION != "NOT_CHECK_DB" && !empty($arFilesExists))
1477 {
1478 $arFilter = array("FILE_FORUM_ID" => $arParams["FORUM_ID"]);
1479 if (isset($arParams["TOPIC_ID"]))
1480 $arFilter["FILE_TOPIC_ID"] = $arParams["TOPIC_ID"];
1481 if (isset($arParams["MESSAGE_ID"]))
1482 $arFilter["FILE_MESSAGE_ID"] = $arParams["MESSAGE_ID"];
1483 $arFilter["@FILE_ID"] = array_keys($arFilesExists);
1484
1485 $db_res = CForumFiles::GetList(array("FILE_ID" => "ASC"), $arFilter);
1486 if ($db_res && $res = $db_res->Fetch())
1487 {
1488 do
1489 {
1490 unset($arFilesExists[$res["FILE_ID"]]);
1491 }while ($res = $db_res->Fetch());
1492 }
1493
1494 if (!empty($arFilesExists))
1495 {
1496 $aMsg[] = array(
1497 "id" => 'attach_error',
1498 "text" => str_replace("#FILE_ID#", implode(", ", array_keys($arFilesExists)), GetMessage("F_ERR_UPOAD_FILES_IS_LOST")));
1499 }
1500 }
1501 endif;
1502 if(!empty($aMsg))
1503 {
1504 $e = new CAdminException($aMsg);
1505 $GLOBALS["APPLICATION"]->ThrowException($e);
1506 return false;
1507 }
1509 return true;
1510 }
1511
1512 public static function Add($arFileID, &$arParams, $bCheckFields = false)
1513 {
1514 if (!is_array($arFileID))
1515 $arFileID = array($arFileID);
1516
1517 //if ($bCheckFields && !CForumFiles::CheckFields($arFields, $arParams, "ADD")) // TODO add check file by forum params
1518 //return false;
1519
1520 $strUploadDir = (!is_set($arParams, "upload_dir") ? "forum/upload" : $arParams["upload_dir"]);
1521 foreach($arFileID as $fileID)
1522 {
1523 $arParams["FILE_ID"] = $fileID;
1524 $arInsert = $GLOBALS["DB"]->PrepareInsert("b_forum_file", $arParams, $strUploadDir);
1525 $strSql = "INSERT INTO b_forum_file(".$arInsert[0].") VALUES(".$arInsert[1].")";
1526 $GLOBALS["DB"]->Query($strSql);
1527 }
1528 return true;
1529 }
1530
1531 public static function Save(&$arFields, $arParams, $bCheckFields = true)
1532 {
1533 if ($bCheckFields)
1534 {
1535 $result = \Bitrix\Forum\File::checkFiles(\Bitrix\Forum\Forum::getById($arParams["FORUM_ID"]), $arFields, $arParams);
1536 if (!$result->isSuccess())
1537 {
1538 return false;
1539 }
1540 }
1541
1543
1544 $files = [];
1545 foreach ($arFields as $file)
1546 {
1547 if ($file["FILE_ID"] > 0)
1548 {
1549 $files[$file["FILE_ID"]] = $file;
1550 }
1551 }
1552 return $files;
1553 }
1554
1555 public static function UpdateByID($ID, $arFields)
1556 {
1557 $ID = (is_array($ID) ? $ID : array($ID));
1558 $arFields = (is_array($arFields) ? $arFields : array($arFields));
1559 $res = array();
1560 foreach ($ID as $val):
1561 $val = intval($val);
1562 if ($val > 0)
1563 $res[] = $val;
1564 endforeach;
1565 $ID = $res;
1566 $res = array();
1567 foreach ($arFields as $key => $val):
1568 if (intval($val) > 0 && in_array($key, array("FORUM_ID", "TOPIC_ID", "MESSAGE_ID")))
1569 $res[$key] = $val;
1570 endforeach;
1571 $arFields = $res;
1572 if (empty($ID) || empty($arFields))
1573 return false;
1574 $strUpdate = $GLOBALS["DB"]->PrepareUpdate("b_forum_file", $arFields);
1575 $strSql = "UPDATE b_forum_file SET ".$strUpdate." WHERE FILE_ID IN(".implode(",", $ID).")";
1576 $GLOBALS["DB"]->Query($strSql);
1577 }
1578
1579 public static function Delete($fields = [], $params = [])
1580 {
1581 if (empty($fields))
1582 {
1583 return false;
1584 }
1585
1586 global $DB;
1587
1588 $fields = (is_array($fields) ? $fields : []);
1589 $params = (is_array($params) ? $params : []);
1590
1591 foreach (['FILE_ID', 'MESSAGE_ID', 'TOPIC_ID', 'FORUM_ID'] as $key)
1592 {
1593 $fields[$key] = (int) ($fields[$key] ?? 0);
1594 }
1595
1596 $arSQL = [];
1597
1598 if (!empty($fields['FILE_ID']))
1599 {
1600 $arSQL[] = 'FILE_ID=' . $fields['FILE_ID'];
1601 }
1602 if (!empty($fields['MESSAGE_ID']) && (!empty($arSQL) || $params['DELETE_MESSAGE_FILE'] == 'Y'))
1603 {
1604 $arSQL[] = 'MESSAGE_ID=' . $fields['MESSAGE_ID'];
1605 }
1606 if (!empty($fields['TOPIC_ID']) && (!empty($arSQL) || $params['DELETE_TOPIC_FILE'] == 'Y'))
1607 {
1608 $arSQL[] = 'TOPIC_ID=' . $fields['TOPIC_ID'];
1609 }
1610 if (!empty($fields['FORUM_ID']) && (!empty($arSQL) || $params['DELETE_FORUM_FILE'] == 'Y'))
1611 {
1612 $arSQL[] = 'FORUM_ID=' . $fields['FORUM_ID'];
1613 }
1614 if (!empty($arSQL))
1615 {
1616 $db_res = $DB->Query('SELECT * from b_forum_file where '.implode(' AND ', $arSQL));
1617 if ($db_res && $res = $db_res->Fetch())
1618 {
1619 do
1620 {
1621 CFile::Delete($res['FILE_ID']);
1622 } while ($res = $db_res->Fetch());
1623 }
1624 }
1625 }
1626
1627 public static function OnFileDelete($arFile)
1628 {
1629 $result = true;
1630 if($arFile["MODULE_ID"] == "forum")
1631 {
1632 $GLOBALS["DB"]->Query("DELETE from b_forum_file where FILE_ID=".$arFile["ID"]);
1633 }
1634 return $result;
1635 }
1636}
$arParams
Определения access_dialog.php:21
$path
Определения access_edit.php:21
$type
Определения options.php:106
$db_res
Определения options_user_settings.php:8
global $APPLICATION
Определения include.php:80
Определения message.php:1194
$sNameTemplate
Определения message.php:1195
__construct($res, $params=array())
Определения message.php:1196
Fetch()
Определения message.php:1209
Определения topic.php:950
static checkFiles(Forum $forum, &$files, $params=["TOPIC_ID"=> 0, "MESSAGE_ID"=> 0, "USER_ID"=> 0])
Определения file.php:111
static saveFiles(&$files, $params, $uploadDir="forum/upload")
Определения file.php:197
const CAN_READ
Определения permission.php:68
static encode($text)
Определения emoji.php:17
Определения message.php:1387
static Save(&$arFields, $arParams, $bCheckFields=true)
Определения message.php:1531
static Add($arFileID, &$arParams, $bCheckFields=false)
Определения message.php:1512
static getByMessageID($ID)
Определения message.php:1388
static CheckFields(&$arFields, &$arParams, $ACTION="ADD", $extParams=array())
Определения message.php:1413
static UpdateByID($ID, $arFields)
Определения message.php:1555
static OnFileDelete($arFile)
Определения message.php:1627
static Delete($fields=[], $params=[])
Определения message.php:1579
$DB
Определения dbresult.php:40
static Filter($message)
Определения filter_dictionary.php:590
Определения message.php:11
static CanUserAddMessage($TID, $arUserGroups, $iUserID=0, $ExternalPermission=false)
Определения message.php:13
static Delete($ID)
Определения message.php:528
static GetFirstUnreadEx($FID, $TID, $arUserGroups)
Определения message.php:1034
static Reindex($ID, &$arMessage=[])
Определения message.php:429
static SendMailMessage($MID, $arFields=array(), $strLang=false, $mailTemplate=false)
Определения message.php:802
static setWebdavRights($arFilter, $rights)
Определения message.php:1154
static GetByID($ID, $arAddParams=array())
Определения message.php:591
static GetByIDEx($ID, $arAddParams=array())
Определения message.php:641
static OnSocNetLogFormatEvent($arEvent, $arParams)
Определения message.php:1126
static Update($ID, $arFields, $skip_counts=false, $strUploadDir=false)
Определения message.php:246
static CanUserDeleteMessage($MID, $arUserGroups, $iUserID=0, $ExternalPermission=false)
Определения message.php:69
static GetMentionedUserID($strMessage)
Определения message.php:1176
static GetFirstUnread($FID, $TID, $PERMISSION)
Определения message.php:1044
static GetMessagePage($ID, $messagePerPage, $arUserGroups, $TID=0, $addParams=[])
Определения message.php:753
static CanUserUpdateMessage($MID, $arUserGroups, $iUserID=0, $ExternalPermission=false)
Определения message.php:36
static CheckFields($ACTION, &$arFields, $ID=0, $arParams=array())
Определения message.php:91
static GetSites($ID)
Определения forum_new.php:411
static GetUserPermission($ID, $arUserGroups)
Определения forum_new.php:564
static GetByID($ID)
Определения forum_new.php:1399
static GetAccessPermissions($ID, $TYPE="ONE")
Определения forum_new.php:463
static PreparePath2Message($strPath, $arVals=array())
Определения forum_new.php:1801
static GetPermissionUserDefault($ID)
Определения forum_new.php:444
static GetSelectFields($arAddParams=array())
Определения forum_new.php:720
static SetStat($ID=0, $arParams=array())
Определения forum_new.php:1638
static UpdateLastSend($MID, $sIDs)
Определения user.php:1308
static GetListEx($arOrder=array("ID"=>"ASC"), $arFilter=array())
Определения user.php:1432
static Delete($ID)
Определения topic.php:413
static GetByID($ID, $arAddParams=array())
Определения topic.php:431
static SetStat($ID=0, $params=[])
Определения topic.php:720
static GetSelectFields($arAddParams=array(), $fields=array())
Определения topic.php:606
static IsLocked($userID)
Определения user.php:82
static SetStat($userId=0, $params=[])
Определения user.php:830
static GetFormattedNameByUserID($userID, $template="", $arUser=array())
Определения user.php:737
static DeleteIndex($MODULE_ID, $ITEM_ID=false, $PARAM1=false, $PARAM2=false, $SITE_ID=false)
Определения search.php:2922
static KillTags($str)
Определения search.php:2092
static Index($MODULE_ID, $ITEM_ID, $arFields, $bOverWrite=false, $SEARCH_SESS_ID='')
Определения search.php:1302
static Delete($ID)
Определения vote.php:245
static GetForumFilters($FID, $SOCNET_GROUP_ID=false)
Определения mail.php:33
static GetList($arOrder=Array("ID"=>"ASC"), $arFilter=Array(), $iNum=0, $arAddParams=array())
Определения message.php:884
static QueryFirstUnread($arFilter)
Определения message.php:875
static GetList($arOrder=Array("ID"=>"ASC"), $arFilter=Array(), $bCount=false, $iNum=0, $arAddParams=array())
Определения message.php:193
static clearAllTags($text)
Определения textparser.php:2358
Определения functions.php:18
static GetFeatures($arForum)
Определения functions.php:50
$str
Определения commerceml2.php:63
if(!is_array($prop["VALUES"])) $tmp
Определения component_props.php:203
$arFields
Определения dblapprove.php:5
$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
global $USER_FIELD_MANAGER
Определения attempt.php:6
$result
Определения get_property_values.php:14
if($ajaxMode) $ID
Определения get_user.php:27
$filter
Определения iblock_catalog_list.php:54
$_SERVER["DOCUMENT_ROOT"]
Определения cron_frame.php:9
global $DB
Определения cron_frame.php:29
global $USER
Определения csv_new_run.php:40
$ACTION
Определения csv_new_setup.php:27
endif
Определения csv_new_setup.php:990
ExecuteModuleEventEx($arEvent, $arParams=[])
Определения tools.php:5214
IsModuleInstalled($module_id)
Определения tools.php:5301
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
$order
Определения payment.php:8
$message
Определения payment.php:8
if(intval($iTestTransaction) > 0) $arTmp
Определения payment.php:22
$arFiles
Определения options.php:60
$event
Определения prolog_after.php:141
return false
Определения prolog_main_admin.php:185
global_menu_<?echo $menu["menu_id"]?> adm main menu item icon adm main menu item text text adm main menu hover adm submenu menucontainer menu_id menu_id items_id items_id desktop menu_id block none adm global submenu<?=($subMenuDisplay=="block" ? " adm-global-submenu-active" :"")?> global_submenu_<?echo $menu["menu_id"]?> text MAIN_PR_ADMIN_FAV items adm submenu items wrap adm submenu items stretch wrap BX adminMenu itemsStretchScroll()"> <table class if (!empty( $menu["items"])) elseif ( $menu[ 'menu_id']=='desktop') if ( $menu[ 'menu_id']=='desktop') endforeach
Определения prolog_main_admin.php:255
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
if(empty($signedUserToken)) $key
Определения quickway.php:257
$i
Определения factura.php:643
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
Определения waybill.php:936
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
Определения template.php:799
$val
Определения options.php:1793
$site_id
Определения sonet_set_content_view.php:9
$k
Определения template_pdf.php:567
$GLOBALS['_____370096793']
Определения update_client.php:1
$arFilter
Определения user_search.php:106
$rights
Определения options.php:4
$fields
Определения yandex_run.php:501