1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
message.php
См. документацию.
1<?php
2
3require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/forum/classes/general/message.php");
4
6{
7 public static function Add($arFields, $strUploadDir = false, $arParams = array())
8 {
10
11 $strUploadDir = ($strUploadDir === false ? "forum/upload" : $strUploadDir);
12
14 return false;
15
16 $arForum = CForumNew::GetByID($arFields["FORUM_ID"]);
17 $arParams["SKIP_STATISTIC"] = (isset($arParams["SKIP_STATISTIC"]) && $arParams["SKIP_STATISTIC"] == "Y" ? "Y" : "N");
18 $arParams["SKIP_INDEXING"] = $arParams["SKIP_INDEXING"] ?? 'N';
19 $arParams["SKIP_INDEXING"] = ($arParams["SKIP_INDEXING"] == "Y" || $arForum["INDEXATION"] != "Y" ? "Y" : "N");
20
21 $POST_MESSAGE = $arFields["POST_MESSAGE"];
22 $parser = new forumTextParser(LANGUAGE_ID);
23 $allow = forumTextParser::GetFeatures($arForum);
24 $allow['SMILES'] = (($arFields["USE_SMILES"] != "Y") ? 'N' : $allow['SMILES']);
25 if (COption::GetOptionString("forum", "FILTER", "Y") == "Y")
26 {
27 $POST_MESSAGE = CFilterUnquotableWords::Filter($POST_MESSAGE);
28 $arFields["POST_MESSAGE_FILTER"] = (empty($POST_MESSAGE) ? "*" : $POST_MESSAGE);
29 }
30/***************** Attach ******************************************/
31 $arFiles = array();
32 if (isset($arFields["ATTACH_IMG"]) && is_array($arFields["ATTACH_IMG"]))
33 $arFields["FILES"] = array($arFields["ATTACH_IMG"]);
34 unset($arFields["ATTACH_IMG"]);
35 if (!empty($arFields["FILES"]) && is_array($arFields["FILES"]))
36 {
37 $res = array("FORUM_ID" => $arFields["FORUM_ID"], "USER_ID" => $arFields["AUTHOR_ID"], "upload_dir" => $strUploadDir);
38 $arFiles = CForumFiles::Save($arFields["FILES"], $res, false);
39 if (!empty($arFiles))
40 {
41 $arFiles = array_keys($arFiles);
42 sort($arFiles);
43 $arFields["ATTACH_IMG"] = $arFiles[0];
44 $arFields["ATTACHED_FILES"] = $arFiles;
45 }
46 unset($arFields["FILES"]);
47 }
48/***************** Attach/******************************************/
49 if (COption::GetOptionString("forum", "MESSAGE_HTML", "N") == "Y")
50 $POST_MESSAGE = $parser->convert($POST_MESSAGE, $allow, "html", $arFiles);
51 $arFields["POST_MESSAGE_HTML"] = $POST_MESSAGE;
52/***************** Event onBeforeMessageAdd ************************/
53 foreach(GetModuleEvents("forum", "onBeforeMessageAdd", true) as $arEvent)
54 {
55 if (ExecuteModuleEventEx($arEvent, array(&$arFields, &$strUploadDir)) === false)
56 return false;
57 }
58/***************** /Event ******************************************/
59 if (empty($arFields))
60 return false;
61 $arInsert = $DB->PrepareInsert("b_forum_message", $arFields, $strUploadDir);
62
63 $strDatePostField = "";
64 $strDatePostValue = "";
65 if (!is_set($arFields, "POST_DATE"))
66 {
67 $strDatePostField = ", POST_DATE";
68 $strDatePostValue = ", ".$DB->GetNowFunction()."";
69 }
70
71 $strSql = "INSERT INTO b_forum_message(".$arInsert[0].$strDatePostField.") VALUES(".$arInsert[1].$strDatePostValue.")";
72 $DB->Query($strSql);
73 $ID = intval($DB->LastID());
74/***************** Attach ******************************************/
75 if (!empty($arFiles))
76 CForumFiles::UpdateByID($arFiles, array("FORUM_ID" => $arFields["FORUM_ID"],
77 "TOPIC_ID" => $arFields["TOPIC_ID"], "MESSAGE_ID" => $ID));
78/***************** Attach/******************************************/
79 $USER_FIELD_MANAGER->Update("FORUM_MESSAGE", $ID, $arFields, (array_key_exists("USER_ID", $arFields) ? $arFields["USER_ID"] : false));
80
81 $arMessage = CForumMessage::GetByIDEx($ID, array("GET_FORUM_INFO" => "N", "GET_TOPIC_INFO" => "Y", "FILTER" => "Y"));
82
83 /***************** Events onAfterMessageAdd ************************/
84 foreach(GetModuleEvents("forum", "onAfterMessageAdd", true) as $arEvent)
85 ExecuteModuleEventEx($arEvent, array(&$ID, $arMessage, $arMessage["TOPIC_INFO"], $arMessage["FORUM_INFO"], $arFields));
86 /***************** /Events *****************************************/
87
88 if ($arParams["SKIP_STATISTIC"] == "Y" && $arParams["SKIP_INDEXING"] == "Y")
89 return $ID;
90
91 if ($arParams["SKIP_STATISTIC"] != "Y")
92 {
93 if (intval($arMessage["AUTHOR_ID"]) > 0)
94 {
95 CForumUser::SetStat($arMessage["AUTHOR_ID"], array("MESSAGE" => $arMessage));
96 }
97 CForumTopic::SetStat($arMessage["TOPIC_ID"], array("MESSAGE" => $arMessage));
98 CForumNew::SetStat($arMessage["FORUM_ID"], array("MESSAGE" => $arMessage));
99 }
100 if ($arMessage["APPROVED"] == "Y" && $arParams["SKIP_INDEXING"] != "Y" && CModule::IncludeModule("search"))
101 {
102 $arMessage["POST_MESSAGE"] = (COption::GetOptionString("forum", "FILTER", "Y") == "Y" ?
103 $arMessage["POST_MESSAGE_FILTER"] : $arMessage["POST_MESSAGE"]);
105 "PERMISSION" => array(),
106 "SITE" => CForumNew::GetSites($arMessage["FORUM_ID"]),
107 "DEFAULT_URL" => "/");
108
109 $arGroups = CForumNew::GetAccessPermissions($arMessage["FORUM_ID"]);
110 foreach($arGroups as $arGroup)
111 {
112 if ($arGroup[1] >= "E")
113 {
114 $arParams["PERMISSION"][] = $arGroup[0];
115 if ($arGroup[0] == 2)
116 break;
117 }
118 }
119
120 $arSearchInd = array(
121 "LID" => array(),
122 "LAST_MODIFIED" => $arMessage["POST_DATE"],
123 "PARAM1" => $arMessage["FORUM_ID"],
124 "PARAM2" => $arMessage["TOPIC_ID"],
125 "ENTITY_TYPE_ID" => ($arMessage["NEW_TOPIC"] == "Y"? "FORUM_TOPIC": "FORUM_POST"),
126 "ENTITY_ID" => ($arMessage["NEW_TOPIC"] == "Y"? $arMessage["TOPIC_ID"]: $ID),
127 "USER_ID" => $arMessage["AUTHOR_ID"],
128 "PERMISSIONS" => $arParams["PERMISSION"],
129 "TITLE" => $arMessage["TOPIC_INFO"]["TITLE"].($arMessage["NEW_TOPIC"] == "Y" && !empty($arMessage["TOPIC_INFO"]["DESCRIPTION"]) ?
130 ", ".$arMessage["TOPIC_INFO"]["DESCRIPTION"] : ""),
131 "TAGS" => ($arMessage["NEW_TOPIC"] == "Y" ? $arMessage["TOPIC_INFO"]["TAGS"] : ""),
132 "BODY" => GetMessage("AVTOR_PREF")." ".$arMessage["AUTHOR_NAME"].". ".(CSearch::KillTags(forumTextParser::clearAllTags($arMessage["POST_MESSAGE"]))),
133 "URL" => "",
134 "INDEX_TITLE" => $arMessage["NEW_TOPIC"] == "Y",
135 );
136
137 // get mentions
138 $arMentionedUserID = CForumMessage::GetMentionedUserID($arMessage["POST_MESSAGE"]);
139 if (!empty($arMentionedUserID))
140 {
141 $arSearchInd["PARAMS"] = array(
142 "mentioned_user_id" => $arMentionedUserID
143 );
144 }
145
146 $urlPatterns = array(
147 "FORUM_ID" => $arMessage["FORUM_ID"],
148 "TOPIC_ID" => $arMessage["TOPIC_ID"],
149 "TITLE_SEO" => $arMessage["TOPIC_INFO"]["TITLE_SEO"],
150 "MESSAGE_ID" => $arMessage["ID"],
151 "SOCNET_GROUP_ID" => $arMessage["TOPIC_INFO"]["SOCNET_GROUP_ID"],
152 "OWNER_ID" => $arMessage["TOPIC_INFO"]["OWNER_ID"],
153 "PARAM1" => $arMessage["PARAM1"],
154 "PARAM2" => $arMessage["PARAM2"]);
155 foreach ($arParams["SITE"] as $key => $val)
156 {
157 $arSearchInd["LID"][$key] = CForumNew::PreparePath2Message($val, $urlPatterns);
158 if (empty($arSearchInd["URL"]) && !empty($arSearchInd["LID"][$key]))
159 $arSearchInd["URL"] = $arSearchInd["LID"][$key];
160 }
161
162 if (empty($arSearchInd["URL"]))
163 {
164 foreach ($arParams["SITE"] as $key => $val):
165 $db_lang = CLang::GetByID($key);
166 if ($db_lang && $ar_lang = $db_lang->Fetch()):
167 $arParams["DEFAULT_URL"] = $ar_lang["DIR"];
168 break;
169 endif;
171 $arParams["DEFAULT_URL"] .= COption::GetOptionString("forum", "REL_FPATH", "").
172 "forum/read.php?FID=#FID#&TID=#TID#&MID=#MID##message#MID#";
173
174 $arSearchInd["URL"] = CForumNew::PreparePath2Message($arParams["DEFAULT_URL"], $urlPatterns);
175 }
176 /***************** Events onMessageIsIndexed ***********************/
177 $index = true;
178 foreach(GetModuleEvents("forum", "onMessageIsIndexed", true) as $arEvent)
179 {
180 if (ExecuteModuleEventEx($arEvent, array($ID, $arMessage, &$arSearchInd)) === false)
181 {
182 $index = false;
183 break;
184 }
185 }
186 /***************** /Events *****************************************/
187 if ($index == true)
188 CSearch::Index("forum", $ID, $arSearchInd, true);
189 }
190 return $ID;
191 }
192
193 public static function GetList($arOrder = Array("ID"=>"ASC"), $arFilter = Array(), $bCount = false, $iNum = 0, $arAddParams = array())
194 {
195 global $DB, $USER_FIELD_MANAGER;
196 $arSqlSearch = array();
197 $arSqlOrder = array();
198 $strSqlSearch = "";
199 $strSqlOrder = "";
200 $arFilter = (is_array($arFilter) ? $arFilter : array());
201 $arAddParams = (is_array($arAddParams) ? $arAddParams : array());
202 $arAddParams['nTopCount'] = ($arAddParams['nTopCount'] ?? 0);
203 $obUserFieldsSql = new CUserTypeSQL;
204 $obUserFieldsSql->SetEntity("FORUM_MESSAGE", "FM.ID");
205 $obUserFieldsSql->SetSelect($arAddParams["SELECT"] ?? null);
206 $obUserFieldsSql->SetFilter($arFilter);
207 $obUserFieldsSql->SetOrder($arOrder);
208
209 foreach ($arFilter as $key => $val)
210 {
212 $key = mb_strtoupper($key_res["FIELD"]);
213 $strNegative = $key_res["NEGATIVE"];
214 $strOperation = $key_res["OPERATION"];
215
216 switch ($key)
217 {
218 case "PARAM1":
219 case "AUTHOR_NAME":
220 case "POST_MESSAGE_CHECK":
221 case "APPROVED":
222 case "NEW_TOPIC":
223 if ($val == '')
224 $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FM.".$key." IS NULL OR LENGTH(FM.".$key.")<=0)";
225 else
226 $arSqlSearch[] = ($strNegative=="Y"?" FM.".$key." IS NULL OR NOT ":"")."(FM.".$key." ".$strOperation." '".$DB->ForSql($val)."' )";
227 break;
228 case "PARAM2":
229 case "ID":
230 case "AUTHOR_ID":
231 case "FORUM_ID":
232 case "TOPIC_ID":
233 case "ATTACH_IMG":
234 if ( ($strOperation == "IN") && (!is_array($val)) && (mb_strpos($val, ",") > 0) )
235 $val = explode(",", $val);
236 if (($strOperation!="IN") && (intval($val) > 0))
237 $arSqlSearch[] = ($strNegative=="Y"?" FM.".$key." IS NULL OR NOT ":"")."(FM.".$key." ".$strOperation." ".intval($val)." )";
238 elseif (($strOperation =="IN") && ((is_array($val) && sizeof($val)>0 && (array_sum($val) > 0)) || ($val <> '') ))
239 {
240 if (is_array($val))
241 {
242 $val_int = array();
243 foreach ($val as $v)
244 $val_int[] = intval($v);
245 $val = implode(", ", $val_int);
246 }
247 else
248 {
249 $val = intval($val);
250 }
251 $arSqlSearch[] = ($strNegative=="Y"?" NOT ":"")."(FM.".$key." IN (".$DB->ForSql($val).") )";
252 }
253 else
254 $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FM.".$key." IS NULL OR FM.".$key."<=0)";
255 break;
256 case "EDIT_DATE":
257 case "POST_DATE":
258 if ($val == '')
259 $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FM.".$key." IS NULL OR LENGTH(FM.".$key.")<=0)";
260 else
261 $arSqlSearch[] = ($strNegative=="Y"?" FM.".$key." IS NULL OR NOT ":"")."(FM.".$key." ".$strOperation." ".$DB->CharToDateFunction($DB->ForSql($val), "FULL")." )";
262 break;
263 case "PERMISSION":
264 if ((is_array($val)) && (count($val)>0))
265 {
266 $return = array();
267 foreach ($val as $value)
268 {
269 $str = array();
270 foreach ($value as $k => $v)
271 {
273 $k = mb_strtoupper($k_res["FIELD"]);
274 $strNegative = $k_res["NEGATIVE"];
275 $strOperation = $k_res["OPERATION"];
276 switch ($k)
277 {
278 case "TOPIC_ID":
279 case "FORUM_ID":
280 if (intval($v)<=0)
281 $str[] = ($strNegative=="Y"?"NOT":"")."(FM.".$k." IS NULL OR FM.".$k."<=0)";
282 else
283 $str[] = ($strNegative=="Y"?" FM.".$k." IS NULL OR NOT ":"")."(FM.".$k." ".$strOperation." ".intval($v)." )";
284 break;
285 case "APPROVED":
286 if ($v == '')
287 $str[] = ($strNegative=="Y"?"NOT":"")."(FM.APPROVED IS NULL OR LENGTH(FM.APPROVED)<=0)";
288 else
289 $str[] = ($strNegative=="Y"?" FM.APPROVED IS NULL OR NOT ":"")."FM.APPROVED ".$strOperation." '".$DB->ForSql($v)."' ";
290 break;
291 }
292 }
293 $return[] = implode(" AND ", $str);
294 }
295 if (count($return)>0)
296 $arSqlSearch[] = "(".implode(") OR (", $return).")";
297 }
298 break;
299 }
300 }
301 $r = $obUserFieldsSql->GetFilter();
302 if (!empty($r))
303 $arSqlSearch[] = $r;
304 if (!empty($arSqlSearch))
305 $strSqlSearch = " AND (".implode(") AND (", $arSqlSearch).") ";
306
307 if ($bCount || (is_set($arAddParams, "bDescPageNumbering") && $arAddParams["nTopCount"] <= 0))
308 {
309 $strFrom = "FROM b_forum_message FM\n".$obUserFieldsSql->GetJoin("FM.ID")."\nWHERE 1 = 1 ".$strSqlSearch;
310 if($obUserFieldsSql->GetDistinct())
311 $strFrom = "FROM b_forum_message FM\n\tINNER JOIN (SELECT DISTINCT FM.ID ".$strFrom.") FM2 ON (FM2.ID=FM.ID)";
312
313 // This code was changed because of http://bugs.mysql.com/bug.php?id=64002
314 if ($bCount === "cnt_not_approved")
315 {
316 $ar_res = false;
317 $strSql =
318 "SELECT COUNT(FM.ID) as CNT, MAX(FM.ID) AS ABS_LAST_MESSAGE_ID, MIN(FM.ID) AS ABS_FIRST_MESSAGE_ID, \n\t".
319 "MIN(CASE WHEN FM.NEW_TOPIC='Y' THEN FM.ID ELSE NULL END) AS FIRST_MESSAGE_ID, \n\t".
320 "SUM(CASE WHEN FM.APPROVED!='Y' THEN 1 ELSE 0 END) as CNT_NOT_APPROVED,\n\t".
321 "MAX(CASE WHEN FM.APPROVED='Y' THEN FM.ID ELSE 0 END) AS LAST_MESSAGE_ID \n".
322 $strFrom;
323
324 if (array_intersect_key($arFilter, array("FORUM_ID" => null)) == $arFilter && $arFilter["FORUM_ID"] > 0) // High-usage
325 {
326 $db_res = $DB->Query($strSql . "\nGROUP BY FM.FORUM_ID");
327 $ar_res = $db_res->Fetch();
328 }
329 else if (array_intersect_key($arFilter, array("TOPIC_ID" => null)) == $arFilter && $arFilter["TOPIC_ID"] > 0) // High-usage
330 {
331 $db_res = $DB->Query($strSql . "\nGROUP BY FM.TOPIC_ID");
332 $ar_res = $db_res->Fetch();
333 }
334 else
335 {
336 $strSql = "SELECT COUNT(FM.ID) as CNT ".$strFrom;
337 $db_res = $DB->Query($strSql );
338 if ($db_res && $ar_res = $db_res->Fetch())
339 {
340 $strSql =
341 "SELECT MAX(FM.ID) AS ABS_LAST_MESSAGE_ID, MIN(FM.ID) AS ABS_FIRST_MESSAGE_ID, \n\t".
342 "MIN(CASE WHEN FM.NEW_TOPIC='Y' THEN FM.ID ELSE NULL END) AS FIRST_MESSAGE_ID, \n\t".
343 "SUM(CASE WHEN FM.APPROVED!='Y' THEN 1 ELSE 0 END) as CNT_NOT_APPROVED,\n\t".
344 "MAX(CASE WHEN FM.APPROVED='Y' THEN FM.ID ELSE 0 END) AS LAST_MESSAGE_ID \n".
345 $strFrom;
346 $db_res = $DB->Query($strSql );
347 if ($db_res && $ar_res1 = $db_res->Fetch())
348 {
349 $ar_res = array_merge($ar_res1, $ar_res);
350 }
351 }
352 }
353
354 return $ar_res;
355 }
356 else if ($bCount === "cnt_and_last_mid")
357 {
358 $ar_res = array();
359 if (array_intersect_key($arFilter, array("AUTHOR_ID" => null, "APPROVED" => null)) == $arFilter && $arFilter["AUTHOR_ID"] > 0) // High-usage
360 {
361 $strSql = "SELECT COUNT(FM.ID) as CNT, MAX(FM.ID) as LAST_MESSAGE_ID \n ".$strFrom." \nGROUP BY FM.AUTHOR_ID"; // explain the same as without "GROUP BY"
362 $db_res = $DB->Query($strSql);
363 if ($db_res)
364 $ar_res = $db_res->Fetch();
365 }
366 else
367 {
368 $strSql = "SELECT COUNT(FM.ID) as CNT \n ".$strFrom;
369 $db_res = $DB->Query($strSql);
370 if ($db_res && $ar_res = $db_res->Fetch())
371 {
372 $strSql = "SELECT MAX(FM.ID) as LAST_MESSAGE_ID \n ".$strFrom;
373 $db_res = $DB->Query($strSql);
374 if ($db_res && $ar_res1 = $db_res->Fetch())
375 {
376 $ar_res["LAST_MESSAGE_ID"] = $ar_res1["LAST_MESSAGE_ID"];
377 }
378 }
379 }
380 return $ar_res;
381 }
382 else
383 {
384 $strSql = "SELECT COUNT(FM.ID) as CNT \n ".$strFrom;
385 $db_res = $DB->Query($strSql);
386 $iCnt = 0;
387 if ($db_res && $ar_res = $db_res->Fetch())
388 $iCnt = intval($ar_res["CNT"]);
389 if ($bCount)
390 return $iCnt;
391 }
392 // /This code was changed because of http://bugs.mysql.com/bug.php?id=64002
393 }
394
395 foreach ($arOrder as $by=>$order)
396 {
397 $by = mb_strtoupper($by);
398 $order = mb_strtoupper($order);
399 if ($order!="ASC") $order = "DESC";
400 if ($by == "AUTHOR_NAME") $arSqlOrder[] = " FM.AUTHOR_NAME ".$order." ";
401 elseif ($by == "EDIT_DATE") $arSqlOrder[] = " FM.EDIT_DATE ".$order." ";
402 elseif ($by == "POST_DATE") $arSqlOrder[] = " FM.POST_DATE ".$order." ";
403 elseif ($by == "FORUM_ID") $arSqlOrder[] = " FM.FORUM_ID ".$order." ";
404 elseif ($by == "TOPIC_ID") $arSqlOrder[] = " FM.TOPIC_ID ".$order." ";
405 elseif ($by == "NEW_TOPIC") $arSqlOrder[] = " FM.NEW_TOPIC ".$order." ";
406 elseif ($by == "APPROVED") $arSqlOrder[] = " FM.APPROVED ".$order." ";
407 else
408 {
409 $r = $obUserFieldsSql->GetOrder($by);
410 if (!!$r)
411 {
412 $arSqlOrder[] = " ".$r." ".$order." ";
413 }
414 else
415 {
416 $arSqlOrder[] = " FM.ID ".$order." ";
417 $by = "ID";
418 }
419 }
420 }
421 $arSqlOrder = array_unique($arSqlOrder);
422 DelDuplicateSort($arSqlOrder);
423 if(!empty($arSqlOrder))
424 $strSqlOrder = " ORDER BY ".implode(", ", $arSqlOrder);
425
426 $strSqlUserFieldJoin = $obUserFieldsSql->GetJoin("FM.ID");
427 if ($obUserFieldsSql->GetDistinct())
428 {
429 $obUserFieldsSqlSelect = new CUserTypeSQL;
430 $obUserFieldsSqlSelect->SetEntity("FORUM_MESSAGE", "FM.ID");
431 $obUserFieldsSqlSelect->SetSelect($arAddParams["SELECT"]);
432 $obUserFieldsSqlSelect->SetOrder($arOrder);
433
434 $strSqlUserFieldJoin =
435 $obUserFieldsSqlSelect->GetJoin("FM.ID")."
436 INNER JOIN (
437 SELECT DISTINCT FM.ID
438 FROM b_forum_message FM\n".
439 $obUserFieldsSql->GetJoin("FM.ID")."\n".
440 "WHERE 1 = 1 ".$strSqlSearch.") FM2 ON (FM2.ID = FM.ID) ";
441 $strSqlSearch = "";
442 }
443
444 $select = "FM.ID,
445 FM.AUTHOR_ID, FM.AUTHOR_NAME, FM.AUTHOR_EMAIL, FM.AUTHOR_IP,
446 FM.USE_SMILES, FM.POST_MESSAGE, FM.POST_MESSAGE_HTML, FM.POST_MESSAGE_FILTER,
447 FM.FORUM_ID, FM.TOPIC_ID, FM.NEW_TOPIC,
448 FM.APPROVED, FM.SOURCE_ID, FM.POST_MESSAGE_CHECK, FM.GUEST_ID, FM.AUTHOR_REAL_IP, FM.ATTACH_IMG, FM.XML_ID,
449 " . $DB->DateToCharFunction("FM.POST_DATE", "FULL") . " as POST_DATE,
450 FM.EDITOR_ID, FM.EDITOR_NAME, FM.EDITOR_EMAIL, FM.EDIT_REASON,
451 FU.SHOW_NAME, U.LOGIN, U.NAME, U.SECOND_NAME, U.LAST_NAME, U.PERSONAL_PHOTO,
452 " . $DB->DateToCharFunction("FM.EDIT_DATE", "FULL") . " as EDIT_DATE, FM.PARAM1, FM.PARAM2, FM.HTML, FM.MAIL_HEADER, FM.SERVICE_TYPE, FM.SERVICE_DATA " .
453 $obUserFieldsSql->GetSelect() .
454 (!empty($arAddParams["sNameTemplate"]) ?
455 ",\n\t".CForumUser::GetFormattedNameFieldsForSelect(array_merge(
456 $arAddParams, array(
457 "sUserTablePrefix" => "U.",
458 "sForumUserTablePrefix" => "FU.",
459 "sFieldName" => "AUTHOR_NAME_FRMT")), false) : "");
460
461 $strSql =
462 "SELECT " . $select . "
463 FROM b_forum_message FM
464 LEFT JOIN b_forum_user FU ON (FM.AUTHOR_ID = FU.USER_ID)
465 LEFT JOIN b_user U ON (FM.AUTHOR_ID = U.ID)" .
466 $strSqlUserFieldJoin . "
467 WHERE 1 = 1 " . $strSqlSearch . "
468 " . $strSqlOrder;
469
470 $limit = intval($iNum ?? $arAddParams["nTopCount"]);
471 if ($limit > 0)
472 {
473 $strSql .= " LIMIT ".$limit;
474 }
475 if (!$iNum && is_set($arAddParams, "bDescPageNumbering") && $arAddParams["nTopCount"] <= 0)
476 {
477 $db_res = new CDBResult();
478 $db_res->SetUserFields($USER_FIELD_MANAGER->GetUserFields("FORUM_MESSAGE"));
479 $db_res->NavQuery($strSql, $iCnt, $arAddParams);
480 }
481 else
482 {
483 $db_res = $DB->Query($strSql);
484 $db_res->SetUserFields($USER_FIELD_MANAGER->GetUserFields("FORUM_MESSAGE"));
485 }
486 return new _CMessageDBResult($db_res, $arAddParams);
487 }
488
489 public static function GetListEx($arOrder = Array("ID"=>"ASC"), $arFilter = Array(), $bCount = false, $iNum = 0, $arAddParams = array())
490 {
491 global $DB;
492 $arSqlSearch = array();
493 $arSqlOrder = array();
494 $arSqlFrom = array();
495 $arSqlSelect = array();
496 $arSqlGroup = array();
497 $strSqlSearch = "";
498 $strSqlOrder = "";
499 $strSqlFrom = "";
500 $strSqlSelect = "";
501 $strSqlGroup = "";
502 $UseGroup = false;
503 $arFilter = (is_array($arFilter) ? $arFilter : array());
504 $arAddParams = (is_array($arAddParams) ? $arAddParams : array());
505 $arIndexFields = array();
506
507 foreach ($arFilter as $key => $val)
508 {
510 $key = mb_strtoupper($key_res["FIELD"]);
511 $strNegative = $key_res["NEGATIVE"];
512 $strOperation = $key_res["OPERATION"];
513
514 switch ($key)
515 {
516 case "PARAM1":
517 case "AUTHOR_NAME":
518 case "POST_MESSAGE_CHECK":
519 case "APPROVED":
520 case "NEW_TOPIC":
521 case "POST_MESSAGE":
522 $arIndexFields[] = $key;
523 if ($strOperation == "LIKE")
524 $val = "%".$val."%";
525 if ($val == '')
526 $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FM.".$key." IS NULL OR LENGTH(FM.".$key.")<=0)";
527 else
528 $arSqlSearch[] = ($strNegative=="Y"?" FM.".$key." IS NULL OR NOT ":"")."(FM.".$key." ".$strOperation." '".$DB->ForSql($val)."' )";
529 break;
530 case "APPROVED_AND_MINE":
531 $arIndexFields[] = "APPROVED";
532 if ($val >= 0)
533 {
534 $arSqlSearch[] = "(FM.APPROVED='Y' OR FM.AUTHOR_ID=".intval($val).")";
535 $arIndexFields[] = "AUTHOR_ID";
536 }
537 else
538 {
539 $arSqlSearch[] = "(FM.APPROVED='Y')";
540 }
541 break;
542 case "PARAM2":
543 case "ID":
544 case "AUTHOR_ID":
545 case "FORUM_ID":
546 case "TOPIC_ID":
547 case "ATTACH_IMG":
548 $arIndexFields[] = $key;
549 if ( ($strOperation == "IN") && (!is_array($val)) && (mb_strpos($val, ",") > 0) )
550 $val = explode(",", $val);
551 if (($strOperation!="IN") && (intval($val) > 0))
552 $arSqlSearch[] = ($strNegative=="Y"?" FM.".$key." IS NULL OR NOT ":"")."(FM.".$key." ".$strOperation." ".intval($val)." )";
553 elseif (($strOperation =="IN") && ((is_array($val) && (array_sum($val) > 0)) || ($val <> '') ))
554 {
555 if (is_array($val))
556 {
557 $val_int = array();
558 foreach ($val as $v)
559 $val_int[] = intval($v);
560 $val = implode(", ", $val_int);
561 }
562 else
563 {
564 $val = intval($val);
565 }
566 $arSqlSearch[] = ($strNegative=="Y"?" NOT ":"")."(FM.".$key." IN (".$DB->ForSql($val).") )";
567 }
568 else
569 $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FM.".$key." IS NULL OR FM.".$key."<=0)";
570 break;
571 case "POINTS_TO_AUTHOR_ID":
572 if (intval($val) > 0)
573 {
574 $arSqlSelect["FR.POINTS"] = "FR.POINTS";
575 $arSqlSelect["FR.DATE_UPDATE"] = "FR.DATE_UPDATE";
576 $arSqlFrom["FR"] = "LEFT JOIN b_forum_user_points FR ON ((FM.AUTHOR_ID = FR.TO_USER_ID) AND (FR.FROM_USER_ID=".intval($val)."))";
577 }
578 break;
579 case "POST_DATE":
580 $arIndexFields[] = $key;
581 if ($val == '')
582 $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FM.".$key." IS NULL OR LENGTH(FM.".$key.")<=0)";
583 else
584 $arSqlSearch[] = ($strNegative=="Y"?" FM.".$key." IS NULL OR NOT ":"")."(FM.".$key." ".$strOperation." ".$DB->CharToDateFunction($DB->ForSql($val), "FULL").")";
585 break;
586 case "USER_ID":
587// $arSqlSelect["LAST_VISIT"] = $DB->DateToCharFunction("FUT.LAST_VISIT", "FULL");
588 if(intval($val) > 0)
589 {
590 $arSqlFrom["FUT"] = "
591 LEFT JOIN b_forum_user_topic FUT ON (FM.TOPIC_ID = FUT.TOPIC_ID AND FUT.USER_ID=".intval($val).")";
592 }
593 break;
594 case "NEW_MESSAGE":
595 if ($val <> '' && intval($arFilter["USER_ID"]) > 0)
596 {
597 $arSqlFrom["FUT"] = "
598 LEFT JOIN b_forum_user_topic FUT ON (FM.TOPIC_ID = FUT.TOPIC_ID AND FUT.USER_ID=".intval($arFilter["USER_ID"]).")";
599 $arSqlSearch[] = "
600 (FUT.LAST_VISIT IS NOT NULL AND FM.POST_DATE > FUT.LAST_VISIT)
601 OR
602 (FUT.LAST_VISIT IS NULL AND FM.POST_DATE ".$strOperation." ".$DB->CharToDateFunction($DB->ForSql($val), "FULL").")
603 ";
604 }
605 break;
606 case "USER_GROUP":
607 if (!empty($val))
608 {
609 if (!is_array($val))
610 $val = explode(",", $val);
611 if (!in_array(2, $val))
612 $val[] = 2;
613 $val = implode(",", array_map("intval", $val));
614 $arIndexFields[] = "FP.GROUP_ID";
615 $arSqlFrom["FP"] = "LEFT JOIN b_forum_perms FP ON (FP.FORUM_ID=FM.FORUM_ID)";
616 $arSqlSearch[] = "FP.GROUP_ID IN (".$DB->ForSql($val).") AND ((FP.PERMISSION IN ('E','I','M') AND FM.APPROVED='Y') OR (FP.PERMISSION IN ('Q','U','Y')))";
617 $UseGroup = true;
618 }
619 break;
620 case "TOPIC_SOCNET_GROUP_ID":
621 $arIndexFields[] = "FT.SOCNET_GROUP_ID";
622 $arSqlFrom["FT"] = "
623 LEFT JOIN b_forum_topic FT ON (FT.ID = FM.TOPIC_ID)";
624 $arSqlSearch[] = "FT.SOCNET_GROUP_ID = ".intval($val);
625 $arSqlSelect[] = "FT.SOCNET_GROUP_ID as TOPIC_SOCNET_GROUP_ID";
626 break;
627 case "TOPIC_OWNER_ID":
628 $arIndexFields[] = "FT.OWNER_ID";
629 $arSqlFrom["FT"] = "
630 LEFT JOIN b_forum_topic FT ON (FT.ID = FM.TOPIC_ID)";
631 $arSqlSearch[] = "FT.OWNER_ID = ".intval($val);
632 $arSqlSelect[] = "FT.OWNER_ID as TOPIC_OWNER_ID";
633 break;
634 case "TOPIC":
635 $arSqlFrom["FT"] = "
636 LEFT JOIN b_forum_topic FT ON (FT.ID = FM.TOPIC_ID)";
637 $arSqlSelect[] = "FT.TITLE";
638 $arSqlSelect[] = CForumNew::Concat("-", array("FT.ID", "FT.TITLE_SEO"))." as TITLE_SEO";
639 $arSqlSelect[] = "FT.DESCRIPTION AS TOPIC_DESCRIPTION";
640 $arSqlSelect[] = $DB->DateToCharFunction("FT.START_DATE", "FULL")." as START_DATE";
641 $arSqlSelect[] = "FT.USER_START_NAME";
642 $arSqlSelect[] = "FT.USER_START_ID";
643 $arSqlSelect[] = "FT.XML_ID AS TOPIC_XML_ID";
644 $arSqlSelect[] = "FT.SOCNET_GROUP_ID AS TOPIC_SOCNET_GROUP_ID";
645 $arSqlSelect[] = "FT.OWNER_ID AS TOPIC_OWNER_ID";
646 break;
647 case "TOPIC_MESSAGE_ID":
648 if (is_array($val))
649 {
650 $val_int = array();
651 foreach ($val as $v)
652 $val_int[] = intval($v);
653 $val = implode(", ", $val_int);
654 }
655 else
656 {
657 $val = intval($val);
658 }
659 if (!empty($val))
660 {
661 $arSqlFrom["FT"] = "
662 LEFT JOIN b_forum_topic FT ON (FT.ID = FM.TOPIC_ID)";
663 $arIndexFields[] = "ID";
664 $arSqlSearch[] = "FT.ID IN (SELECT DISTINCT TOPIC_ID FROM b_forum_message WHERE ID IN (".$val."))";
665 }
666 break;
667 case "TOPIC_TITLE":
668 case "TITLE":
669 $arSqlFrom["FT"] = "
670 LEFT JOIN b_forum_topic FT ON (FT.ID = FM.TOPIC_ID)";
671 $key = "TITLE";
672 $arIndexFields[] = $key;
673 if ($strOperation == "LIKE")
674 $val = "%".$val."%";
675 if ($val == '')
676 $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FT.".$key." IS NULL OR LENGTH(FT.".$key.")<=0)";
677 else
678 $arSqlSearch[] = ($strNegative=="Y"?" FT.".$key." IS NULL OR NOT ":"")."(FT.".$key." ".$strOperation." '".$DB->ForSql($val)."' )";
679 break;
680 }
681 }
682 foreach ($arOrder as $by=>$order)
683 {
684 $by = mb_strtoupper($by);
685 $order = mb_strtoupper($order);
686 if ($order!="ASC") $order = "DESC";
687 if (in_array($by, array("FORUM_ID", "TOPIC_ID", "USE_SMILES", "NEW_TOPIC", "APPROVED",
688 "POST_DATE", "POST_MESSAGE", "ATTACH_IMG", "PARAM1", "PARAM2",
689 "AUTHOR_ID", "AUTHOR_NAME", "AUTHOR_EMAIL", "AUTHOR_IP", "AUTHOR_REAL_IP", "GUEST_ID",
690 "EDITOR_ID", "EDITOR_NAME", "EDITOR_EMAIL", "EDIT_REASON", "EDIT_DATE", "HTML"))):
691 $arSqlOrder[] = "FM.".$by." ".$order;
692 elseif ($by == "SORT" || $by == "NAME"):
693 $arSqlFrom["F"] = "
694 LEFT JOIN b_forum F ON (F.ID = FM.FORUM_ID)";
695 $arSqlSelect["F.".$by] = "F.".$by;
696 $arSqlOrder[] = "F_M.".$by." ".$order;
697 else:
698 $arSqlOrder[] = "FM.ID ".$order;
699 $by = "ID";
700 endif;
701 }
702 $arSqlOrder = array_unique($arSqlOrder);
703 DelDuplicateSort($arSqlOrder);
704 if(count($arSqlOrder) > 0)
705 $strSqlOrder = " ORDER BY ".implode(", ", $arSqlOrder);
706
707 $IX_FORUM_MESSAGE_TOPIC = false;
708 if (count($arSqlSearch) > 0)
709 {
710 $strSqlSearch = " AND (".implode(") AND (", $arSqlSearch).") ";
711 $arIndexFields = array_unique($arIndexFields);
712 $IX_FORUM_MESSAGE_TOPIC = ($arIndexFields == array("TOPIC_ID", "APPROVED") || $arIndexFields == array("TOPIC_ID"));
713 }
714 if (count($arSqlSelect) > 0)
715 $strSqlSelect = ",\n\t".implode(", ", $arSqlSelect);
716 if (count($arSqlFrom) > 0)
717 $strSqlFrom .= "\n\t".implode("\n\t", $arSqlFrom);
718 if ($UseGroup)
719 {
720 foreach ($arSqlSelect as $key => $val)
721 {
722 if (mb_substr($key, 0, 1) != "!")
723 $arSqlGroup[$key] = $val;
724 }
725 if (!empty($arSqlGroup)):
726 $strSqlGroup = ", ".implode(", ", $arSqlGroup);
727 endif;
728 }
729
730 if (!isset($arAddParams["nTopCount"]))
731 {
732 $arAddParams["nTopCount"] = 0;
733 }
734 if ($bCount || (is_set($arAddParams, "bDescPageNumbering") && intval($arAddParams["nTopCount"]) <= 0))
735 {
736 $strSql =
737 "SELECT
738 COUNT(FM.ID) as CNT,
739 MAX(FM.ID) AS LAST_MESSAGE_ID
740 FROM b_forum_message FM
741 ".$strSqlFrom."
742 WHERE 1 = 1
743 ".$strSqlSearch;
744 if ($bCount === 3)
745 {
746 $strSql .= "GROUP BY FM.TOPIC_ID";
747 return $DB->Query($strSql);
748 }
749 // This code exists because of http://bugs.mysql.com/bug.php?id=64002
750 $iCnt = 0; $iLAST_MESSAGE_ID = 0;
751 if ((array_intersect_key($arFilter, array("TOPIC_ID" => null, "APPROVED" => null)) == $arFilter ||
752 array_intersect_key($arFilter, array("TOPIC_ID" => null)) == $arFilter) && $arFilter["TOPIC_ID"] > 0) // high-usage
753 {
754 $strSql .= "GROUP BY FM.TOPIC_ID"; // explane the same as without "GROUP BY"
755 $db_res = $DB->Query($strSql);
756 if ($ar_res = $db_res->Fetch())
757 {
758 $iCnt = intval($ar_res["CNT"]);
759 $iLAST_MESSAGE_ID = intval($ar_res["LAST_MESSAGE_ID"]);
760 }
761 }
762 else
763 {
764 $strSql = "SELECT COUNT(FM.ID) as CNT \nFROM b_forum_message FM ".$strSqlFrom."\nWHERE 1 = 1 ".$strSqlSearch;
765 $db_res = $DB->Query($strSql);
766 if ($ar_res = $db_res->Fetch())
767 {
768 $iCnt = intval($ar_res["CNT"]);
769 }
770 if ($bCount === 4)
771 {
772 $strSql = "SELECT MAX(FM.ID) AS LAST_MESSAGE_ID \nFROM b_forum_message FM ".$strSqlFrom."\nWHERE 1 = 1 ".$strSqlSearch;
773 $db_res = $DB->Query($strSql);
774 if ($ar_res = $db_res->Fetch())
775 {
776 $iLAST_MESSAGE_ID = intval($ar_res["LAST_MESSAGE_ID"]);
777 }
778 }
779 }
780 // / This code exists because of http://bugs.mysql.com/bug.php?id=64002
781 if ($bCount === 4)
782 return array("CNT" => $iCnt, "LAST_MESSAGE_ID" => $iLAST_MESSAGE_ID);
783
784 if ($bCount)
785 return $iCnt;
786 }
787
788 if ($UseGroup)
789 {
790 $strSql =
791 "SELECT F_M.*, FM.FORUM_ID, FM.TOPIC_ID, FM.USE_SMILES, FM.NEW_TOPIC, \n".
792 " FM.APPROVED, FM.SOURCE_ID, \n".
793 " ".$DB->DateToCharFunction("FM.POST_DATE", "FULL")." as POST_DATE, \n".
794 " FM.POST_MESSAGE, FM.POST_MESSAGE_HTML, FM.POST_MESSAGE_FILTER, \n".
795 " FM.ATTACH_IMG, FM.XML_ID, FM.PARAM1, FM.PARAM2, \n".
796 " FM.AUTHOR_ID, FM.AUTHOR_NAME, FM.AUTHOR_EMAIL, \n".
797 " FM.AUTHOR_IP, FM.AUTHOR_REAL_IP, FM.GUEST_ID, \n".
798 " FM.EDITOR_ID, FM.EDITOR_NAME, FM.EDITOR_EMAIL, FM.EDIT_REASON, \n".
799 " ".$DB->DateToCharFunction("FM.EDIT_DATE", "FULL")." as EDIT_DATE, \n".
800 " FM.HTML, FM.MAIL_HEADER, FM.SERVICE_TYPE, FM.SERVICE_DATA, \n".
801 " FU.SHOW_NAME, FU.DESCRIPTION, FU.NUM_POSTS, FU.POINTS as NUM_POINTS, FU.SIGNATURE, FU.AVATAR, \n".
802 " ".$DB->DateToCharFunction("FU.DATE_REG", "SHORT")." as DATE_REG, \n".
803 " U.LOGIN, U.NAME, U.SECOND_NAME, U.LAST_NAME, U.PERSONAL_PHOTO, FU.RANK_ID, U.PERSONAL_WWW, U.PERSONAL_GENDER, \n".
804 " U.EMAIL, U.PERSONAL_ICQ, U.PERSONAL_CITY, U.PERSONAL_COUNTRY, U.EXTERNAL_AUTH_ID".
805 (!empty($arAddParams["sNameTemplate"]) ?
806 ",\n\t".CForumUser::GetFormattedNameFieldsForSelect(array_merge(
807 $arAddParams, array(
808 "sUserTablePrefix" => "U.",
809 "sForumUserTablePrefix" => "FU.",
810 "sFieldName" => "AUTHOR_NAME_FRMT")), false) : "")." \n".
811 "FROM ( \n".
812 " SELECT FM.ID".$strSqlSelect." \n".
813 " FROM b_forum_message FM \n".
814 " LEFT JOIN b_forum_user FU ON FM.AUTHOR_ID = FU.USER_ID \n".
815 " LEFT JOIN b_user U ON FM.AUTHOR_ID = U.ID \n".
816 " ".$strSqlFrom." \n".
817 " WHERE (1=1 ".$strSqlSearch.") \n".
818 " GROUP BY FM.ID".$strSqlGroup." \n".
819 " ) F_M \n".
820 " INNER JOIN b_forum_message FM ON (F_M.ID = FM.ID) \n".
821 " LEFT JOIN b_forum_user FU ON (FM.AUTHOR_ID = FU.USER_ID) \n".
822 " LEFT JOIN b_user U ON (FM.AUTHOR_ID = U.ID) \n".
823 $strSqlOrder;
824 }
825 else
826 {
827 $isMysql = \Bitrix\Main\Application::getConnection()->getType() === 'mysql';
828 $strSql =
829 "SELECT FM.ID, FM.FORUM_ID, FM.TOPIC_ID, FM.USE_SMILES, FM.NEW_TOPIC, \n".
830 " FM.APPROVED, FM.SOURCE_ID, \n".
831 " ".$DB->DateToCharFunction("FM.POST_DATE", "FULL")." as POST_DATE, \n".
832 " FM.POST_MESSAGE, FM.POST_MESSAGE_HTML, FM.POST_MESSAGE_FILTER, \n".
833 " FM.ATTACH_IMG, FM.XML_ID, FM.PARAM1, FM.PARAM2, \n".
834 " FM.AUTHOR_ID, FM.AUTHOR_NAME, FM.AUTHOR_EMAIL, \n".
835 " FM.AUTHOR_IP, FM.AUTHOR_REAL_IP, FM.GUEST_ID, \n".
836 " FM.EDITOR_ID, FM.EDITOR_NAME, FM.EDITOR_EMAIL, FM.EDIT_REASON, \n".
837 " ".$DB->DateToCharFunction("FM.EDIT_DATE", "FULL")." as EDIT_DATE, \n".
838 " FM.HTML, FM.MAIL_HEADER, FM.SERVICE_TYPE, FM.SERVICE_DATA, \n".
839 " FU.SHOW_NAME, FU.DESCRIPTION, FU.NUM_POSTS, FU.POINTS as NUM_POINTS, FU.SIGNATURE, FU.AVATAR, \n".
840 " ".$DB->DateToCharFunction("FU.DATE_REG", "SHORT")." as DATE_REG, \n".
841 " U.LOGIN, U.NAME, U.SECOND_NAME, U.LAST_NAME, U.PERSONAL_PHOTO, FU.RANK_ID, U.PERSONAL_WWW, U.PERSONAL_GENDER, \n".
842 " U.EMAIL, U.PERSONAL_ICQ, U.PERSONAL_CITY, U.PERSONAL_COUNTRY, U.EXTERNAL_AUTH_ID".
843 (!empty($arAddParams["sNameTemplate"]) ?
844 ",\n\t".CForumUser::GetFormattedNameFieldsForSelect(array_merge(
845 $arAddParams, array(
846 "sUserTablePrefix" => "U.",
847 "sForumUserTablePrefix" => "FU.",
848 "sFieldName" => "AUTHOR_NAME_FRMT")), false)."\n" : "").$strSqlSelect."\n".
849 "FROM b_forum_message FM ".(($IX_FORUM_MESSAGE_TOPIC && $isMysql) ? "USE INDEX (IX_FORUM_MESSAGE_TOPIC)" : "")."\n".
850 " LEFT JOIN b_forum_user FU ON (FM.AUTHOR_ID = FU.USER_ID) \n".
851 " LEFT JOIN b_user U ON (FM.AUTHOR_ID = U.ID) \n".
852 " ".$strSqlFrom." \n".
853 "WHERE 1 = 1 ".$strSqlSearch." \n".
854 $strSqlOrder;
855 }
856
857 $iNum = intval($iNum);
858 if ($iNum > 0 || intval($arAddParams["nTopCount"]) > 0):
859 $iNum = ($iNum > 0) ? $iNum : intval($arAddParams["nTopCount"]);
860 $strSql .= "\nLIMIT 0,".$iNum;
861 endif;
862
863 if (!$iNum && is_array($arAddParams) && is_set($arAddParams, "bDescPageNumbering") && (intval($arAddParams["nTopCount"])<=0))
864 {
865 $db_res = new CDBResult();
866 $db_res->NavQuery($strSql, $iCnt, $arAddParams);
867 }
868 else
869 {
870 $db_res = $DB->Query($strSql);
871 }
872 return new _CMessageDBResult($db_res, $arAddParams);
873 }
874
875 public static function QueryFirstUnread($arFilter) // out-of-date function
876 {
877 $db_res = CForumMessage::GetList(array("ID"=>"ASC"), $arFilter, false, 1);
878 return $db_res;
879 }
880}
881
882class CForumFiles extends CAllForumFiles
883{
884 public static function GetList($arOrder = Array("ID"=>"ASC"), $arFilter = Array(), $iNum = 0, $arAddParams = array())
885 {
886 global $DB;
887 $arSqlSearch = array();
888 $arSqlOrder = array();
889 $strSqlSearch = "";
890 $strSqlOrder = "";
891 $iCnt = 0;
892 $iNum = intval($iNum);
893 $arFilter = (is_array($arFilter) ? $arFilter : array());
894 $arAddParams = (is_array($arAddParams) ? $arAddParams : array());
895 if (isset($arAddParams["nTopCount"]) && intval($arAddParams["nTopCount"]) > 0)
896 unset($arAddParams["bDescPageNumbering"]);
897
898 foreach ($arFilter as $key => $val)
899 {
901 $key = mb_strtoupper($key_res["FIELD"]);
902 $strNegative = $key_res["NEGATIVE"];
903 $strOperation = $key_res["OPERATION"];
904
905 switch ($key)
906 {
907 case "PARAM1":
908 case "AUTHOR_NAME":
909 case "POST_MESSAGE_CHECK":
910 case "APPROVED":
911 if ($val == '')
912 $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FM.".$key." IS NULL OR LENGTH(FM.".$key.")<=0)";
913 else
914 $arSqlSearch[] = ($strNegative=="Y"?" FM.".$key." IS NULL OR NOT ":"")."(FM.".$key." ".$strOperation." '".$DB->ForSql($val)."' )";
915 break;
916 // to table b_forum_message
917 case "APPROVED_AND_MINE":
918 if ($val >= 0)
919 $arSqlSearch[] = "(FM.APPROVED='Y' OR FM.AUTHOR_ID=".intval($val).")";
920 else
921 $arSqlSearch[] = "(FM.APPROVED='Y')";
922 break;
923 case "PARAM2":
924 case "FORUM_ID":
925 case "TOPIC_ID":
926 case "AUTHOR_ID":
927 if (($strOperation!="IN") && (intval($val) > 0))
928 $arSqlSearch[] = ($strNegative=="Y"?" FM.".$key." IS NULL OR NOT ":"")."(FM.".$key." ".$strOperation." ".intval($val)." )";
929 elseif ($strOperation == "IN" && (is_array($val) && array_sum($val) > 0 || is_string($val) && $val <> ''))
930 {
931 if (is_array($val))
932 {
933 $val_int = array();
934 foreach ($val as $v)
935 $val_int[] = intval($v);
936 $val = implode(", ", $val_int);
937 }
938 $arSqlSearch[] = ($strNegative=="Y"?" NOT ":"")."(FM.".$key." IN (".$DB->ForSql($val).") )";
939 }
940 else
941 $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FM.".$key." IS NULL OR FM.".$key."<=0)";
942 break;
943 // to table b_forum_file
944 case "FILE_FORUM_ID":
945 case "FILE_TOPIC_ID":
946 case "FILE_MESSAGE_ID":
947 $key = mb_substr($key, 5);
948 if ($strOperation != "IN" && intval($val) > 0)
949 {
950 $res = ($strNegative=="Y"?" FF.".$key." IS NULL OR NOT ":"")."(FF.".$key." ".$strOperation." ".intval($val)." ) OR ".
951 "".($strNegative=="Y"?"NOT":"")."(FF.".$key." IS NULL OR FF.".$key."<=0)";
952 $arSqlSearch[] = $res;
953 break;
954 }
955 elseif ($strOperation == "IN" && (is_array($val) && array_sum($val) > 0 || is_string($val) && $val <> ''))
956 {
957 $val = (!is_array($val) ? explode(",", $val) : $val);
958 $val_int = array();
959 foreach ($val as $k => $v):
960 $val_int[] = intval($v);
962 $val = implode(",", $val_int);
963 if ($val <> '')
964 {
965 $arSqlSearch[] = ($strNegative=="Y"?" NOT ":"")."(FF.".$key." IN (".$DB->ForSql($val).") )";
966 break;
967 }
968 }
969 $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FF.".$key." IS NULL OR FF.".$key."<=0)";
970 break;
971 case "FILE_ID":
972 case "MESSAGE_ID":
973 case "USER_ID":
974 if (($strOperation!="IN") && (intval($val) > 0 || $val === 0))
975 {
976 $arSqlSearch[] = ($strNegative=="Y"?" FF.".$key." IS NULL OR NOT ":"")."(FF.".$key." ".$strOperation." ".intval($val)." )";
977 break;
978 }
979 elseif ($strOperation =="IN" && (is_array($val) && array_sum($val) > 0 || $val <> ''))
980 {
981 $val = (!is_array($val) ? explode(",", $val) : $val);
982 $val_int = array();
983 foreach ($val as $k => $v):
984 $val_int[] = intval($v);
986 $val = implode(",", $val_int);
987 if ($val <> '')
988 {
989 $arSqlSearch[] = ($strNegative=="Y"?" NOT ":"")."(FF.".$key." IN (".$DB->ForSql($val).") )";
990 break;
991 }
992 }
993 $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FF.".$key." IS NULL OR FF.".$key."<=0)";
994 break;
995 case "EDIT_DATE":
996 case "POST_DATE":
997 if ($val == '')
998 $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FM.".$key." IS NULL OR LENGTH(FM.".$key.")<=0)";
999 else
1000 $arSqlSearch[] = ($strNegative=="Y"?" FM.".$key." IS NULL OR NOT ":"")."(FM.".$key." ".$strOperation." ".$DB->CharToDateFunction($DB->ForSql($val), "FULL")." )";
1001 break;
1002 case "PERMISSION":
1003 if ((is_array($val)) && (count($val)>0))
1004 {
1005 $return = array();
1006 foreach ($val as $value)
1007 {
1008 $str = array();
1009 foreach ($value as $k => $v)
1010 {
1012 $k = mb_strtoupper($k_res["FIELD"]);
1013 $strNegative = $k_res["NEGATIVE"];
1014 $strOperation = $k_res["OPERATION"];
1015 switch ($k)
1016 {
1017 case "TOPIC_ID":
1018 case "FORUM_ID":
1019 if (intval($v)<=0)
1020 $str[] = ($strNegative=="Y"?"NOT":"")."(FM.".$k." IS NULL OR FM.".$k."<=0)";
1021 else
1022 $str[] = ($strNegative=="Y"?" FM.".$k." IS NULL OR NOT ":"")."(FM.".$k." ".$strOperation." ".intval($v)." )";
1023 break;
1024 case "APPROVED":
1025 if ($v == '')
1026 $str[] = ($strNegative=="Y"?"NOT":"")."(FM.APPROVED IS NULL OR LENGTH(FM.APPROVED)<=0)";
1027 else
1028 $str[] = ($strNegative=="Y"?" FM.APPROVED IS NULL OR NOT ":"")."FM.APPROVED ".$strOperation." '".$DB->ForSql($v)."' ";
1029 break;
1030 }
1031 }
1032 $return[] = implode(" AND ", $str);
1033 }
1034 if (count($return)>0)
1035 $arSqlSearch[] = "(".implode(") OR (", $return).")";
1036 }
1037 break;
1038 }
1039 }
1040 if (count($arSqlSearch) > 0)
1041 $strSqlSearch = " AND (".implode(") AND (", $arSqlSearch).") ";
1042
1043 foreach ($arOrder as $by=>$order)
1044 {
1045 $by = mb_strtoupper($by);
1046 $order = mb_strtoupper($order);
1047 if ($order!="ASC") $order = "DESC";
1048 if ($by == "FILE_ID") $arSqlOrder[] = " FF.FILE_ID ".$order." ";
1049 elseif ($by == "FORUM_ID") $arSqlOrder[] = " FF.FORUM_ID ".$order." ";
1050 elseif ($by == "TOPIC_ID") $arSqlOrder[] = " FF.TOPIC_ID ".$order." ";
1051 elseif ($by == "MESSAGE_ID") $arSqlOrder[] = " FF.MESSAGE_ID ".$order." ";
1052 else
1053 {
1054 $arSqlOrder[] = " FF.FILE_ID ".$order." ";
1055 $by = "FILE_ID";
1056 }
1057 }
1058 DelDuplicateSort($arSqlOrder);
1059 if(count($arSqlOrder) > 0)
1060 $strSqlOrder = " ORDER BY ".implode(", ", $arSqlOrder);
1061
1062 $strSql =
1063 "SELECT BF.ID, BF.HEIGHT, BF.WIDTH, BF.FILE_SIZE, BF.CONTENT_TYPE, BF.SUBDIR, BF.FILE_NAME,
1064 BF.ORIGINAL_NAME, FF.FILE_ID, FF.FORUM_ID, FF.TOPIC_ID, FF.MESSAGE_ID, FF.USER_ID, FF.HITS,
1065 ".$DB->DateToCharFunction("FF.TIMESTAMP_X", "FULL")." as TIMESTAMP_X, BF.HANDLER_ID
1066 FROM b_forum_file FF
1067 INNER JOIN b_file BF ON (BF.ID = FF.FILE_ID)
1068 LEFT JOIN b_forum_message FM ON (FM.ID=FF.MESSAGE_ID)
1069 WHERE 1 = 1
1070 ".$strSqlSearch."
1071 ".$strSqlOrder;
1072 if ($iNum > 0 || (isset($arAddParams["nTopCount"]) && intval($arAddParams["nTopCount"]) > 0))
1073 {
1074 $iNum = ($iNum > 0) ? $iNum : intval($arAddParams["nTopCount"]);
1075 $strSql = "SELECT * FROM(".$strSql.") WHERE ROWNUM<=".$iNum;
1076 }
1077 elseif (is_set($arAddParams, "bDescPageNumbering"))
1078 {
1079 $iCnt = 0;
1080 $strSql1 = "SELECT COUNT(FM.ID) as CNT FROM b_forum_message FM WHERE 1 = 1 ".$strSqlSearch;
1081 $db_res = $DB->Query($strSql1);
1082 if ($ar_res = $db_res->Fetch())
1083 $iCnt = intval($ar_res["CNT"]);
1084 $db_res = new CDBResult();
1085 $db_res->NavQuery($strSql, $iCnt, $arAddParams);
1086 }
1087 else
1088 {
1089 $db_res = $DB->Query($strSql);
1090 }
1091 return $db_res;
1092 }
1093
1094 public static function CleanUp()
1095 {
1096 global $DB;
1098 $helper = $connection->getSqlHelper();
1099
1100 $db_res = $DB->Query('
1101 SELECT FF.ID, FF.FILE_ID
1102 FROM b_forum_file FF
1103 WHERE FF.TIMESTAMP_X < ' . $helper->addDaysToDateTime(-1) . '
1104 AND (FF.TOPIC_ID IS NULL OR FF.TOPIC_ID <= 0)
1105 AND (FF.MESSAGE_ID IS NULL OR FF.MESSAGE_ID <= 0)
1106 ORDER BY FF.ID ASC
1107 ');
1108 if ($db_res && $res = $db_res->Fetch())
1109 {
1110 do
1111 {
1112 CFile::Delete($res["FILE_ID"]);
1113 $lastId = (int)$res["ID"];
1114 } while ($res = $db_res->Fetch());
1115
1116 $DB->Query('
1117 DELETE
1118 FROM b_forum_file
1119 WHERE (ID < ' . $lastId . ')
1120 AND (TOPIC_ID IS NULL OR TOPIC_ID <= 0)
1121 AND (MESSAGE_ID IS NULL OR MESSAGE_ID <= 0)
1122 ');
1123 }
1124 return "CForumFiles::CleanUp();";
1125 }
1126}
$arParams
Определения access_dialog.php:21
$connection
Определения actionsdefinitions.php:38
$db_res
Определения options_user_settings.php:8
$ar_res
Определения options_user_settings_set.php:16
Определения message.php:1194
static getConnection($name="")
Определения application.php:638
static Filter($message)
Определения filter_dictionary.php:590
Определения message.php:11
static GetByIDEx($ID, $arAddParams=array())
Определения message.php:641
static GetMentionedUserID($strMessage)
Определения message.php:1176
static CheckFields($ACTION, &$arFields, $ID=0, $arParams=array())
Определения message.php:91
static GetFilterOperation($key)
Определения forum_new.php:582
static GetSites($ID)
Определения forum_new.php:411
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 SetStat($ID=0, $arParams=array())
Определения forum_new.php:1638
static SetStat($ID=0, $params=[])
Определения topic.php:720
static SetStat($userId=0, $params=[])
Определения user.php:830
static KillTags($str)
Определения search.php:2092
static Index($MODULE_ID, $ITEM_ID, $arFields, $bOverWrite=false, $SEARCH_SESS_ID='')
Определения search.php:1302
Определения message.php:883
static GetList($arOrder=Array("ID"=>"ASC"), $arFilter=Array(), $iNum=0, $arAddParams=array())
Определения message.php:884
static CleanUp()
Определения message.php:1094
Определения message.php:6
static QueryFirstUnread($arFilter)
Определения message.php:875
static GetList($arOrder=Array("ID"=>"ASC"), $arFilter=Array(), $bCount=false, $iNum=0, $arAddParams=array())
Определения message.php:193
static Add($arFields, $strUploadDir=false, $arParams=array())
Определения message.php:7
static GetListEx($arOrder=Array("ID"=>"ASC"), $arFilter=Array(), $bCount=false, $iNum=0, $arAddParams=array())
Определения message.php:489
static Concat($glue="", $pieces=array())
Определения forum_new.php:247
static clearAllTags($text)
Определения textparser.php:2358
Определения usertypesql.php:4
SetEntity($entity_id, $ID)
Определения usertypesql.php:16
Определения functions.php:18
static GetFeatures($arForum)
Определения functions.php:50
if(!\Bitrix\Main\Loader::includeModule('clouds')) $lastId
Определения sync.php:68
$str
Определения commerceml2.php:63
$arFields
Определения dblapprove.php:5
</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
if($ajaxMode) $ID
Определения get_user.php:27
$select
Определения iblock_catalog_list.php:194
$_SERVER["DOCUMENT_ROOT"]
Определения cron_frame.php:9
global $DB
Определения cron_frame.php:29
endif
Определения csv_new_setup.php:990
ExecuteModuleEventEx($arEvent, $arParams=[])
Определения tools.php:5214
DelDuplicateSort(&$arSort)
Определения tools.php:2055
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
Определения tools.php:5177
is_set($a, $k=false)
Определения tools.php:2133
GetMessage($name, $aReplace=null)
Определения tools.php:3397
$order
Определения payment.php:8
$arFiles
Определения options.php:60
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
</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
$val
Определения options.php:1793
$k
Определения template_pdf.php:567
$arFilter
Определения user_search.php:106