1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
log_comments.php
См. документацию.
1<?php
2
4
12
14{
15 /***************************************/
16 /******** DATA MODIFICATION **********/
17 /***************************************/
18 public static function CheckFields($ACTION, &$arFields, $ID = 0)
19 {
20 static $arSiteWorkgroupsPage;
21
23
24 if (
25 !$arSiteWorkgroupsPage
26 && IsModuleInstalled("extranet")
27 && ($arFields["ENTITY_TYPE"] ?? null) == SONET_ENTITY_GROUP
28 )
29 {
30 $rsSite = CSite::GetList("sort", "desc", Array("ACTIVE" => "Y"));
31 while($arSite = $rsSite->Fetch())
32 {
33 $arSiteWorkgroupsPage[$arSite["ID"]] = COption::GetOptionString("socialnetwork", "workgroups_page", $arSite["DIR"]."workgroups/", $arSite["ID"]);
34 }
35 }
36
37 if ($ACTION != "ADD" && intval($ID) <= 0)
38 {
39 $APPLICATION->ThrowException("System error 870164", "ERROR");
40 return false;
41 }
42
43 $newEntityType = "";
44
45 if ((is_set($arFields, "ENTITY_TYPE") || $ACTION=="ADD") && $arFields["ENTITY_TYPE"] == '')
46 {
47 $APPLICATION->ThrowException(GetMessage("SONET_GLC_EMPTY_ENTITY_TYPE"), "EMPTY_ENTITY_TYPE");
48 return false;
49 }
50 elseif (is_set($arFields, "ENTITY_TYPE"))
51 {
52 if (!in_array($arFields["ENTITY_TYPE"], CSocNetAllowed::GetAllowedEntityTypes()))
53 {
54 $APPLICATION->ThrowException(GetMessage("SONET_GLC_ERROR_NO_ENTITY_TYPE"), "ERROR_NO_ENTITY_TYPE");
55 return false;
56 }
57
58 $newEntityType = $arFields["ENTITY_TYPE"];
59 }
60
61 if ((is_set($arFields, "ENTITY_ID") || $ACTION=="ADD") && intval($arFields["ENTITY_ID"]) <= 0)
62 {
63 $APPLICATION->ThrowException(GetMessage("SONET_GLC_EMPTY_ENTITY_ID"), "EMPTY_ENTITY_ID");
64 return false;
65 }
66 elseif (is_set($arFields, "ENTITY_ID"))
67 {
68 if ($newEntityType == '' && $ID > 0)
69 {
71 if ($arRe)
72 {
73 $newEntityType = $arRe["ENTITY_TYPE"];
74 }
75 }
76 if ($newEntityType == '')
77 {
78 $APPLICATION->ThrowException(GetMessage("SONET_GL_ERROR_CALC_ENTITY_TYPE"), "ERROR_CALC_ENTITY_TYPE");
79 return false;
80 }
81
82 if ($newEntityType == SONET_ENTITY_GROUP)
83 {
84 $arResult = CSocNetGroup::GetByID($arFields["ENTITY_ID"]);
85 if ($arResult == false)
86 {
87 $APPLICATION->ThrowException(GetMessage("SONET_GLC_ERROR_NO_ENTITY_ID"), "ERROR_NO_ENTITY_ID");
88 return false;
89 }
90 }
91 elseif ($newEntityType == SONET_ENTITY_USER)
92 {
93 $dbResult = CUser::GetByID($arFields["ENTITY_ID"]);
94 if (!$dbResult->Fetch())
95 {
96 $APPLICATION->ThrowException(GetMessage("SONET_GLC_ERROR_NO_ENTITY_ID"), "ERROR_NO_ENTITY_ID");
97 return false;
98 }
99 }
100 }
101
102 if ((is_set($arFields, "LOG_ID") || $ACTION=="ADD") && intval($arFields["LOG_ID"]) <= 0)
103 {
104 $APPLICATION->ThrowException(GetMessage(\Bitrix\Main\ModuleManager::isModuleInstalled('intranet') ? "SONET_GLC_EMPTY_LOG_ID2" : "SONET_GLC_EMPTY_LOG_ID"), "EMPTY_LOG_ID");
105 return false;
106 }
107
108 if ((is_set($arFields, "EVENT_ID") || $ACTION=="ADD") && $arFields["EVENT_ID"] == '')
109 {
110 $APPLICATION->ThrowException(GetMessage("SONET_GLC_EMPTY_EVENT_ID"), "EMPTY_EVENT_ID");
111 return false;
112 }
113 elseif (is_set($arFields, "EVENT_ID"))
114 {
115 $arFields["EVENT_ID"] = mb_strtolower($arFields["EVENT_ID"]);
117 if (!$arEvent)
118 {
119 $APPLICATION->ThrowException(GetMessage("SONET_GLC_ERROR_NO_FEATURE_ID"), "ERROR_NO_FEATURE");
120 return false;
121 }
122 }
123
124 if (is_set($arFields, "USER_ID"))
125 {
126 $dbResult = CUser::GetByID($arFields["USER_ID"]);
127 if (!$dbResult->Fetch())
128 {
129 $APPLICATION->ThrowException(GetMessage("SONET_GLC_ERROR_NO_USER_ID"), "ERROR_NO_USER_ID");
130 return false;
131 }
132 }
133
134 if (is_set($arFields, "LOG_DATE") && (!$DB->IsDate($arFields["LOG_DATE"], false, LANG, "FULL")))
135 {
136 $APPLICATION->ThrowException(GetMessage("SONET_GLC_EMPTY_DATE_CREATE"), "EMPTY_LOG_DATE");
137 return false;
138 }
139
140 if (isset($arFields["URL"]) && is_array($arSiteWorkgroupsPage))
141 foreach($arSiteWorkgroupsPage as $groups_page)
142 if (mb_strpos($arFields["URL"], $groups_page) === 0)
143 $arFields["URL"] = "#GROUPS_PATH#".mb_substr($arFields["URL"], mb_strlen($groups_page), mb_strlen($arFields["URL"]) - mb_strlen($groups_page));
144
145 if (!$USER_FIELD_MANAGER->CheckFields("SONET_COMMENT", $ID, $arFields, (isset($arFields["USER_ID"]) && intval($arFields["USER_ID"]) > 0 ? intval($arFields["USER_ID"]) : false)))
146 return false;
147
148 if (!empty($arFields['TEXT_MESSAGE']))
149 {
150 $arFields["TEXT_MESSAGE"] = \Bitrix\Main\Text\Emoji::encode($arFields["TEXT_MESSAGE"]);
151 }
152
153 if (!empty($arFields['MESSAGE']))
154 {
155 $arFields["MESSAGE"] = \Bitrix\Main\Text\Emoji::encode($arFields["MESSAGE"]);
156 }
157
158 return True;
159 }
160
161 public static function Delete($ID, $bSetSource = false)
162 {
164
165 $ID = intval($ID);
166 if ($ID <= 0)
167 {
168 $APPLICATION->ThrowException(GetMessage("SONET_GLC_WRONG_PARAMETER_ID"), "ERROR_NO_ID");
169 return false;
170 }
171
172 $bSuccess = false;
173
174 if ($arComment = CSocNetLogComments::GetByID($ID))
175 {
176 if ($bSetSource)
177 {
178 if ($arComment["EVENT_ID"] <> '')
179 {
180 $arCommentEvent = CSocNetLogTools::FindLogCommentEventByID($arComment["EVENT_ID"]);
181 if (
182 !$arCommentEvent
183 || !array_key_exists("DELETE_CALLBACK", $arCommentEvent)
184 || !is_callable($arCommentEvent["DELETE_CALLBACK"])
185 )
186 {
187 $bSetSource = false;
188 }
189 }
190 }
191
192 $bSuccess = true;
193
194 if ($bSetSource)
195 {
196 $arSource = CSocNetLogComments::SetSource($arComment, "DELETE");
197 }
198
199 if (
200 !$bSetSource
201 || (
202 is_array($arSource)
203 && (
204 !isset($arSource["ERROR"])
205 || empty($arSource["ERROR"])
206 )
207 )
208 )
209 {
210 if ($bSuccess)
211 {
212 $bSuccess = $DB->Query("DELETE FROM b_sonet_log_comment WHERE ID = ".$ID, true);
213 }
214
215 if ($bSuccess)
216 {
217 $USER_FIELD_MANAGER->Delete("SONET_COMMENT", $ID);
218
219 $db_events = GetModuleEvents("socialnetwork", "OnSocNetLogCommentDelete");
220 while ($arEvent = $db_events->Fetch())
221 {
222 ExecuteModuleEventEx($arEvent, array($ID));
223 }
224
225 LogIndex::deleteIndex(array(
226 'itemType' => LogIndexTable::ITEM_TYPE_COMMENT,
227 'itemId' => $ID
228 ));
229
230 LogTagTable::deleteByItem(array(
231 'itemType' => LogTagTable::ITEM_TYPE_COMMENT,
232 'itemId' => $ID
233 ));
234
236 'ENTITY_TYPE_ID' => $arComment['RATING_TYPE_ID'],
237 'ENTITY_ID' => $arComment['RATING_ENTITY_ID']
238 ]);
239
240 if ((int)$arComment["LOG_ID"] > 0)
241 {
243 \Bitrix\Socialnetwork\Internals\EventService\EventDictionary::EVENT_SPACE_LIVEFEED_COMMENT_DEL,
244 [
245 'SONET_LOG_ID' => (int)$arComment['LOG_ID'],
246 'SONET_LOG_COMMENT_ID' => (int)$ID,
247 ]
248 );
249
250 CSocNetLogComments::UpdateLogData($arComment["LOG_ID"], false, true);
251
252 $cache = new CPHPCache;
253 $cacheSubFolder = (int)((int)$arComment["LOG_ID"] / 1000);
254 $cache->CleanDir("/sonet/log/".$cacheSubFolder."/".$arComment["LOG_ID"]."/entry/");
255 $cache->CleanDir("/sonet/log/".$cacheSubFolder."/".$arComment["LOG_ID"]."/comments/");
256 }
257 }
258 }
259 elseif (
260 is_array($arSource)
261 && isset($arSource["ERROR"])
262 && is_string($arSource["ERROR"])
263 && !empty($arSource["ERROR"])
264 )
265 {
266 $APPLICATION->ThrowException($arSource["ERROR"], "ERROR_DELETE_SOURCE");
267 $bSuccess = false;
268 }
269 }
270
271 return $bSuccess;
272 }
273
274 public static function DeleteNoDemand($userID)
275 {
276 global $DB;
277
278 $userID = intval($userID);
279 if ($userID <= 0)
280 return false;
281
282 $DB->Query("DELETE FROM b_sonet_log_comment WHERE ENTITY_TYPE = 'U' AND ENTITY_ID = ".$userID."", true);
283
284 return true;
285 }
286
287 /***************************************/
288 /********** DATA SELECTION ***********/
289 /***************************************/
290 public static function GetByID($ID)
291 {
292 global $APPLICATION;
293
294 $ID = intval($ID);
295 if ($ID <= 0)
296 {
297 $APPLICATION->ThrowException(GetMessage("SONET_GLC_WRONG_PARAMETER_ID"), "ERROR_NO_ID");
298 return false;
299 }
300
302 if ($arResult = $dbResult->GetNext())
303 return $arResult;
304
305 return false;
306 }
307
308 /***************************************/
309 /********** SEND EVENTS **************/
310 /***************************************/
311
312 public static function SendEvent($ID, $mailTemplate = "SONET_NEW_EVENT", $bTransport = false)
313 {
314 global $DB;
315
316 $arSocNetAllowedSubscribeEntityTypesDesc = CSocNetAllowed::GetAllowedEntityTypesDesc();
317
318 $ID = intval($ID);
319 if ($ID <= 0)
320 {
321 return false;
322 }
323
324 $arFilter = array("ID" => $ID);
325
326 $dbLogComments = CSocNetLogComments::GetList(
327 array(),
328 $arFilter,
329 false,
330 false,
331 array("ID", "LOG_ID", "ENTITY_TYPE", "ENTITY_ID", "USER_ID", "USER_NAME", "USER_LAST_NAME", "USER_SECOND_NAME", "USER_LOGIN", "EVENT_ID", "LOG_DATE", "MESSAGE", "TEXT_MESSAGE", "URL", "MODULE_ID", "GROUP_NAME", "CREATED_BY_NAME", "CREATED_BY_SECOND_NAME", "CREATED_BY_LAST_NAME", "CREATED_BY_LOGIN", "LOG_SITE_ID", "SOURCE_ID", "LOG_SOURCE_ID")
332 );
333 $arLogComment = $dbLogComments->Fetch();
334 if (!$arLogComment)
335 return false;
336
337 $arLog = array();
338 if (intval($arLogComment["LOG_ID"]) > 0)
339 {
341 array(),
342 array("ID" => $arLogComment["LOG_ID"])
343 );
344 $arLog = $dbLog->Fetch();
345 if (!$arLog)
346 $arLog = array();
347 }
348
349 $arEvent = CSocNetLogTools::FindLogCommentEventByID($arLogComment["EVENT_ID"]);
350
351 if (
352 $arEvent
353 && array_key_exists("CLASS_FORMAT", $arEvent)
354 && array_key_exists("METHOD_FORMAT", $arEvent)
355 && $arEvent["CLASS_FORMAT"] <> ''
356 && $arEvent["METHOD_FORMAT"] <> ''
357 )
358 {
359 $dbSiteCurrent = CSite::GetByID(SITE_ID);
360 if ($arSiteCurrent = $dbSiteCurrent->Fetch())
361 if ($arSiteCurrent["LANGUAGE_ID"] != LANGUAGE_ID)
362 $arLogComment["MAIL_LANGUAGE_ID"] = $arSiteCurrent["LANGUAGE_ID"];
363
364 $arLogComment["FIELDS_FORMATTED"] = call_user_func(array($arEvent["CLASS_FORMAT"], $arEvent["METHOD_FORMAT"]), $arLogComment, array(), true, $arLog);
365 }
366
367 if (
368 array_key_exists($arLogComment["ENTITY_TYPE"], $arSocNetAllowedSubscribeEntityTypesDesc)
369 && array_key_exists("HAS_MY", $arSocNetAllowedSubscribeEntityTypesDesc[$arLogComment["ENTITY_TYPE"]])
370 && $arSocNetAllowedSubscribeEntityTypesDesc[$arLogComment["ENTITY_TYPE"]]["HAS_MY"] == "Y"
371 && array_key_exists("CLASS_OF", $arSocNetAllowedSubscribeEntityTypesDesc[$arLogComment["ENTITY_TYPE"]])
372 && array_key_exists("METHOD_OF", $arSocNetAllowedSubscribeEntityTypesDesc[$arLogComment["ENTITY_TYPE"]])
373 && $arSocNetAllowedSubscribeEntityTypesDesc[$arLogComment["ENTITY_TYPE"]]["CLASS_OF"] <> ''
374 && $arSocNetAllowedSubscribeEntityTypesDesc[$arLogComment["ENTITY_TYPE"]]["METHOD_OF"] <> ''
375 && method_exists($arSocNetAllowedSubscribeEntityTypesDesc[$arLogComment["ENTITY_TYPE"]]["CLASS_OF"], $arSocNetAllowedSubscribeEntityTypesDesc[$arLogComment["ENTITY_TYPE"]]["METHOD_OF"])
376 )
377 {
378 $arOfEntities = call_user_func(array($arSocNetAllowedSubscribeEntityTypesDesc[$arLogComment["ENTITY_TYPE"]]["CLASS_OF"], $arSocNetAllowedSubscribeEntityTypesDesc[$arLogComment["ENTITY_TYPE"]]["METHOD_OF"]), $arLogComment["ENTITY_ID"]);
379 }
380
381 if ($bTransport)
382 {
383 $arListParams = array(
384 "USE_SUBSCRIBE" => "Y",
385 "ENTITY_TYPE" => $arLogComment["ENTITY_TYPE"],
386 "ENTITY_ID" => $arLogComment["ENTITY_ID"],
387 "EVENT_ID" => $arLogComment["EVENT_ID"],
388 "USER_ID" => $arLogComment["USER_ID"],
389 "OF_ENTITIES" => $arOfEntities,
390 "TRANSPORT" => array("M", "X")
391 );
392
393 $arLogSites = array();
394 $rsLogSite = CSocNetLog::GetSite($arLog["ID"]);
395 while($arLogSite = $rsLogSite->Fetch())
396 {
397 $arLogSites[] = $arLogSite["LID"];
398 }
399
400 if (CModule::IncludeModule("extranet"))
401 {
402 if ($arLogComment["ENTITY_TYPE"] == SONET_ENTITY_GROUP)
403 {
404 $arSites = array();
405 $dbSite = CSite::GetList("sort", "desc", array("ACTIVE" => "Y"));
406 while($arSite = $dbSite->Fetch())
407 {
408 $arSites[$arSite["ID"]] = array(
409 "DIR" => (trim($arSite["DIR"]) <> '' ? $arSite["DIR"] : "/"),
410 "SERVER_NAME" => (trim($arSite["SERVER_NAME"]) <> '' ? $arSite["SERVER_NAME"] : COption::GetOptionString("main", "server_name", $_SERVER["HTTP_HOST"]))
411 );
412 }
413
414 $intranet_site_id = CSite::GetDefSite();
415 }
416 $arIntranetUsers = CExtranet::GetIntranetUsers();
417 $extranet_site_id = CExtranet::GetExtranetSiteID();
418 }
419
420 $dbSubscribers = CSocNetLogEvents::GetList(
421 array(
422 "TRANSPORT" => "DESC"
423 ),
424 array(
425 "USER_ACTIVE" => "Y",
426 "SITE_ID" => array_merge($arLogSites, array(false))
427 ),
428 false,
429 false,
430 array("USER_ID", "ENTITY_TYPE", "ENTITY_ID", "ENTITY_CB", "ENTITY_MY", "USER_NAME", "USER_LAST_NAME", "USER_LOGIN", "USER_LID", "USER_EMAIL", "TRANSPORT"),
431 $arListParams
432 );
433
434 $arListParams = array(
435 "USE_SUBSCRIBE" => "Y",
436 "ENTITY_TYPE" => $arLogComment["ENTITY_TYPE"],
437 "ENTITY_ID" => $arLogComment["ENTITY_ID"],
438 "EVENT_ID" => $arLogComment["EVENT_ID"],
439 "USER_ID" => $arLogComment["USER_ID"],
440 "OF_ENTITIES" => $arOfEntities,
441 "TRANSPORT" => "N"
442 );
443
444 $dbUnSubscribers = CSocNetLogEvents::GetList(
445 array(
446 "TRANSPORT" => "DESC"
447 ),
448 array(
449 "USER_ACTIVE" => "Y",
450 "SITE_ID" => array_merge($arLogSites, array(false))
451 ),
452 false,
453 false,
454 array("USER_ID", "SITE_ID", "ENTITY_TYPE", "ENTITY_ID", "ENTITY_CB", "ENTITY_MY", "TRANSPORT", "EVENT_ID"),
455 $arListParams
456 );
457
458 $arUnSubscribers = array();
459 while ($arUnSubscriber = $dbUnSubscribers->Fetch())
460 {
461 $arUnSubscribers[] = $arUnSubscriber["USER_ID"]."_".$arUnSubscriber["ENTITY_TYPE"]."_".$arUnSubscriber["ENTITY_ID"]."_".$arUnSubscriber["ENTITY_MY"]."_".$arUnSubscriber["ENTITY_CB"]."_".$arUnSubscriber["EVENT_ID"];
462 }
463
464 $bHasAccessAll = CSocNetLogRights::CheckForUserAll(($arLog["ID"] ? $arLog["ID"] : $arLogComment["LOG_ID"]));
465
466 $arSentUserID = array("M" => array(), "X" => array());
467 while ($arSubscriber = $dbSubscribers->Fetch())
468 {
469 if (
470 is_array($arIntranetUsers)
471 && !in_array($arSubscriber["USER_ID"], $arIntranetUsers)
472 && !in_array($extranet_site_id, $arLogSites)
473 )
474 {
475 continue;
476 }
477
478 if (
479 array_key_exists($arSubscriber["TRANSPORT"], $arSentUserID)
480 && in_array($arSubscriber["USER_ID"], $arSentUserID[$arSubscriber["TRANSPORT"]])
481 )
482 {
483 continue;
484 }
485
486 if (
487 intval($arSubscriber["ENTITY_ID"]) != 0
488 && $arSubscriber["EVENT_ID"] == "all"
489 &&
490 (
491 in_array($arSubscriber["USER_ID"]."_".$arSubscriber["ENTITY_TYPE"]."_".$arSubscriber["ENTITY_ID"]."_N_".$arSubscriber["ENTITY_CB"]."_".$arLogComment["EVENT_ID"], $arUnSubscribers)
492 || in_array($arSubscriber["USER_ID"]."_".$arSubscriber["ENTITY_TYPE"]."_".$arSubscriber["ENTITY_ID"]."_Y_".$arSubscriber["ENTITY_CB"]."_".$arLogComment["EVENT_ID"], $arUnSubscribers)
493 )
494 )
495 {
496 continue;
497 }
498 elseif (
499 intval($arSubscriber["ENTITY_ID"]) == 0
500 && $arSubscriber["ENTITY_CB"] == "N"
501 && $arSubscriber["EVENT_ID"] != "all"
502 &&
503 (
504 in_array($arSubscriber["USER_ID"]."_".$arSubscriber["ENTITY_TYPE"]."_".$arLogComment["ENTITY_ID"]."_Y_N_all", $arUnSubscribers)
505 || in_array($arSubscriber["USER_ID"]."_".$arSubscriber["ENTITY_TYPE"]."_".$arLogComment["ENTITY_ID"]."_N_N_all", $arUnSubscribers)
506 || in_array($arSubscriber["USER_ID"]."_".$arSubscriber["ENTITY_TYPE"]."_".$arLogComment["ENTITY_ID"]."_Y_N_".$arLogComment["EVENT_ID"], $arUnSubscribers)
507 || in_array($arSubscriber["USER_ID"]."_".$arSubscriber["ENTITY_TYPE"]."_".$arLogComment["ENTITY_ID"]."_N_N_".$arLogComment["EVENT_ID"], $arUnSubscribers)
508 )
509 )
510 {
511 continue;
512 }
513
514 $arSentUserID[$arSubscriber["TRANSPORT"]][] = $arSubscriber["USER_ID"];
515
516 if (!$bHasAccessAll)
517 {
518 $bHasAccess = CSocNetLogRights::CheckForUserOnly(($arLog["ID"] ? $arLog["ID"] : $arLogComment["LOG_ID"]), $arSubscriber["USER_ID"]);
519 if (!$bHasAccess)
520 {
521 continue;
522 }
523 }
524
525 if (
526 $arLogComment["ENTITY_TYPE"] == SONET_ENTITY_GROUP
527 && is_array($arIntranetUsers)
528 && CModule::IncludeModule("extranet")
529 )
530 {
531 $server_name = $arSites[((!in_array($arSubscriber["USER_ID"], $arIntranetUsers) && $extranet_site_id) ? $extranet_site_id : $intranet_site_id)]["SERVER_NAME"];
532 $arLogComment["FIELDS_FORMATTED"]["EVENT_FORMATTED"]["URL_TO_SEND"] = str_replace(
533 array("#SERVER_NAME#", "#GROUPS_PATH#"),
534 array(
535 $server_name,
536 COption::GetOptionString("socialnetwork", "workgroups_page", false, ((!in_array($arSubscriber["USER_ID"], $arIntranetUsers) && $extranet_site_id) ? $extranet_site_id : $intranet_site_id))
537 ),
538 $arLogComment["FIELDS_FORMATTED"]["EVENT_FORMATTED"]["URL"]
539 );
540 }
541 else
542 {
543 $arLogComment["FIELDS_FORMATTED"]["EVENT_FORMATTED"]["URL_TO_SEND"] = $arLogComment["FIELDS_FORMATTED"]["EVENT_FORMATTED"]["URL"];
544 }
545
546 switch ($arSubscriber["TRANSPORT"])
547 {
548 case "X":
549 $link = (
550 array_key_exists("URL_TO_SEND", $arLogComment["FIELDS_FORMATTED"]["EVENT_FORMATTED"])
551 && $arLogComment["FIELDS_FORMATTED"]["EVENT_FORMATTED"]["URL_TO_SEND"] <> ''
552 ? GetMessage("SONET_GLC_SEND_EVENT_LINK").$arLogComment["FIELDS_FORMATTED"]["EVENT_FORMATTED"]["URL_TO_SEND"]
553 : ""
554 );
555
556 $arMessageFields = array(
557 "FROM_USER_ID" => ((int)$arLogComment["USER_ID"] > 0 ? $arLogComment["USER_ID"] : 1),
558 "TO_USER_ID" => $arSubscriber["USER_ID"],
559 "MESSAGE" => $arLogComment["FIELDS_FORMATTED"]["EVENT_FORMATTED"]["TITLE"]." #BR# ".$arLogComment["FIELDS_FORMATTED"]["EVENT_FORMATTED"]["MESSAGE"].($link <> '' ? "#BR# ".$link : ""),
560 "=DATE_CREATE" => $DB->CurrentTimeFunction(),
561 "MESSAGE_TYPE" => SONET_MESSAGE_SYSTEM,
562 "IS_LOG" => "Y"
563 );
564 CSocNetMessages::Add($arMessageFields);
565 break;
566 case "M":
567 $arFields["SUBSCRIBER_ID"] = $arSubscriber["USER_ID"];
568 $arFields["SUBSCRIBER_NAME"] = $arSubscriber["USER_NAME"];
569 $arFields["SUBSCRIBER_LAST_NAME"] = $arSubscriber["USER_LAST_NAME"];
570 $arFields["SUBSCRIBER_LOGIN"] = $arSubscriber["USER_LOGIN"];
571 $arFields["SUBSCRIBER_EMAIL"] = $arSubscriber["USER_EMAIL"];
572 $arFields["EMAIL_TO"] = $arSubscriber["USER_EMAIL"];
573 $arFields["TITLE"] = str_replace("#BR#", "\n", $arLogComment["FIELDS_FORMATTED"]["EVENT_FORMATTED"]["TITLE"]);
574 $arFields["MESSAGE"] = str_replace("#BR#", "\n", $arLogComment["FIELDS_FORMATTED"]["EVENT_FORMATTED"]["MESSAGE"]);
575 $arFields["ENTITY"] = $arLogComment["FIELDS_FORMATTED"]["ENTITY"]["FORMATTED"];
576 $arFields["ENTITY_TYPE"] = $arLogComment["FIELDS_FORMATTED"]["ENTITY"]["TYPE_MAIL"];
577
578 $arFields["URL"] = (
579 array_key_exists("URL_TO_SEND", $arLogComment["FIELDS_FORMATTED"]["EVENT_FORMATTED"])
580 && $arLogComment["FIELDS_FORMATTED"]["EVENT_FORMATTED"]["URL_TO_SEND"] <> ''
581 ? $arLogComment["FIELDS_FORMATTED"]["EVENT_FORMATTED"]["URL_TO_SEND"]
582 : $arLogComment["URL"]
583 );
584
585 if (CModule::IncludeModule("extranet"))
586 {
587 $arUserGroup = CUser::GetUserGroup($arSubscriber["USER_ID"]);
588 }
589
590 foreach ($arLogSites as $site_id_tmp)
591 {
592 if (IsModuleInstalled("extranet"))
593 {
594 if (
595 (
596 CExtranet::IsExtranetSite($site_id_tmp)
597 && in_array(CExtranet::GetExtranetUserGroupID(), $arUserGroup)
598 )
599 ||
600 (
601 !CExtranet::IsExtranetSite($site_id_tmp)
602 && !in_array(CExtranet::GetExtranetUserGroupID(), $arUserGroup)
603 )
604 )
605 {
606 $siteID = $site_id_tmp;
607 break;
608 }
609 else
610 {
611 continue;
612 }
613 }
614 else
615 {
616 $siteID = $site_id_tmp;
617 break;
618 }
619 }
620
621 if (!$siteID)
622 $siteID = (defined("SITE_ID") ? SITE_ID : $arSubscriber["SITE_ID"]);
623
624 if ($siteID == '')
625 $siteID = $arSubscriber["USER_LID"];
626 if ($siteID == '')
627 break;
628
629 $event = new CEvent;
630 $event->Send($mailTemplate, $siteID, $arFields, "N");
631 break;
632 default:
633 }
634 }
635 }
636
637 if (!(
638 $arLogComment["EVENT_ID"] === "tasks_comment"
639 && !\Bitrix\Socialnetwork\ComponentHelper::checkLivefeedTasksAllowed()
640 ))
641 {
642 if (!$bHasAccessAll)
643 {
644 CUserCounter::IncrementWithSelect(
646 $arLogComment["ID"],
647 array(
648 "TYPE" => "LC",
649 "FOR_ALL_ACCESS" => $bHasAccessAll
650 )
651 ),
652 true,
653 [
654 'SET_ENTITY' => 'Y',
655 'SET_ENTRY' => 'Y',
656 ]
657 );
658 }
659 else // for all, mysql only
660 {
661 $tag = time();
662 CUserCounter::IncrementWithSelect(
664 $arLogComment["ID"],
665 array(
666 "TYPE" => "LC",
667 "FOR_ALL_ACCESS_ONLY" => true,
668 "TAG_SET" => $tag
669 )
670 ),
671 false, // sendpull
672 array(
673 "TAG_SET" => $tag,
674 'SET_ENTITY' => 'Y',
675 'SET_ENTRY' => 'Y',
676 )
677 );
678
679 CUserCounter::IncrementWithSelect(
681 $arLogComment["ID"],
682 array(
683 "TYPE" => "LC",
684 "FOR_ALL_ACCESS_ONLY" => false
685 )
686 ),
687 true, // sendpull
688 array(
689 "TAG_CHECK" => $tag,
690 'SET_ENTITY' => 'Y',
691 'SET_ENTRY' => 'Y',
692 )
693 );
694 }
695 }
696
697 return true;
698 }
699
700 public static function UpdateLogData($log_id, $bSetDate = true, $bSetDateByLastComment = false)
701 {
702 $dbResult = CSocNetLogComments::GetList(array(), array("LOG_ID" => $log_id), array());
703 $comments_count = $dbResult;
704
705 $res = LogTable::getList(array(
706 'filter' => array(
707 "ID" => $log_id
708 ),
709 'select' => array("ID", "LOG_DATE")
710 ));
711 while ($logFields = $res->fetch())
712 {
713 $arFields = array("COMMENTS_COUNT" => $comments_count);
714 if ($bSetDateByLastComment)
715 {
716 $resComments = LogCommentTable::getList(array(
717 'order' => array(
718 "LOG_DATE" => "DESC"
719 ),
720 'filter' => array(
721 "LOG_ID" => $log_id
722 ),
723 'select' => array("ID", "LOG_DATE")
724 ));
725 $arFields["LOG_UPDATE"] = (
726 ($commentFields = $resComments->fetch())
727 ? $commentFields["LOG_DATE"]
728 : $logFields["LOG_DATE"]
729 );
730 }
731 elseif ($bSetDate)
732 {
734 $helper = $connection->getSqlHelper();
735 $arFields["LOG_UPDATE"] = new SqlExpression($helper->getCurrentDateTimeFunction());
736 }
737
738 LogTable::update($logFields["ID"], $arFields);
739
740 CSocNetLogFollow::DeleteByLogID($log_id, "Y", true); // not only delete but update to NULL for existing records
741 }
742 }
743
744 public static function SetSource($arFields, $action = false)
745 {
746 $arCallback = false;
747
748 if (!$action)
749 {
750 $action = "ADD";
751 }
752
753 if (!in_array($action, array("ADD", "UPDATE", "DELETE")))
754 {
755 return false;
756 }
757
759 if ($arEvent)
760 {
761 $arCallback = $arEvent[$action."_CALLBACK"];
762 }
763
764 if (
765 $arCallback
766 && is_callable($arCallback)
767 )
768 {
769 $arSource = call_user_func_array($arCallback, array($arFields));
770 }
771
772 return $arSource;
773 }
774
775 public static function SendMentionNotification($arCommentFields)
776 {
777 if (!CModule::IncludeModule("im"))
778 {
779 return false;
780 }
781
782 if ($arCommentFields["EVENT_ID"] === 'forum')
783 {
784 $arTitleRes = self::OnSendMentionGetEntityFields_Forum($arCommentFields);
785 }
786 else
787 {
788 $db_events = GetModuleEvents("socialnetwork", "OnSendMentionGetEntityFields");
789 while ($arEvent = $db_events->Fetch())
790 {
791 $arTitleRes = ExecuteModuleEventEx($arEvent, array($arCommentFields));
792 if ($arTitleRes)
793 {
794 break;
795 }
796 }
797 }
798
799 if (
800 !empty($arTitleRes)
801 && is_array($arTitleRes)
802 && !empty($arTitleRes["NOTIFY_MESSAGE"])
803 )
804 {
805 $arMessageFields = array(
806 "MESSAGE_TYPE" => IM_MESSAGE_SYSTEM,
807 "FROM_USER_ID" => $arCommentFields["USER_ID"],
808 "NOTIFY_TYPE" => IM_NOTIFY_FROM,
809 "NOTIFY_MODULE" => (!empty($arTitleRes["NOTIFY_MODULE"]) ? $arTitleRes["NOTIFY_MODULE"] : "socialnetwork"),
810 "NOTIFY_EVENT" => "mention",
811 "NOTIFY_TAG" => (!empty($arTitleRes["NOTIFY_TAG"]) ? $arTitleRes["NOTIFY_TAG"] : "LOG_COMMENT|COMMENT_MENTION|".$arCommentFields["ID"])
812 );
813
814 $arMention = \Bitrix\Socialnetwork\Helper\Mention::getUserIds($arCommentFields['MESSAGE']);
815
816 if(!empty($arMention))
817 {
818 $arExcludeUsers = array($arCommentFields["USER_ID"]);
819 $collaberIds = array_filter($arMention, static function ($userId) {
820 $userId = (int)$userId;
821
822 return (new \Bitrix\Socialnetwork\Collab\User\User($userId))->isCollaber();
823 });
824
825 $arExcludeUsers = array_merge($arExcludeUsers, $collaberIds);
826
827 if (!empty($arCommentFields["LOG_ID"]))
828 {
829 $rsUnFollower = CSocNetLogFollow::GetList(
830 array(
831 "CODE" => "L".$arCommentFields["LOG_ID"],
832 "TYPE" => "N"
833 ),
834 array("USER_ID")
835 );
836
837 while ($arUnFollower = $rsUnFollower->Fetch())
838 {
839 $arExcludeUsers[] = $arUnFollower["USER_ID"];
840 }
841 }
842
843 $arSourceURL = array(
844 "URL" => $arTitleRes["URL"]
845 );
846 if (!empty($arTitleRes["CRM_URL"]))
847 {
848 $arSourceURL["CRM_URL"] = $arTitleRes["CRM_URL"];
849 }
850
851 foreach ($arMention as $mentionUserID)
852 {
853 $bHaveRights = (
854 ($arTitleRes["IS_CRM"] ?? null) !== "Y"
855 || COption::GetOptionString("crm", "enable_livefeed_merge", "N") === "Y"
856 ? CSocNetLogRights::CheckForUserOnly($arCommentFields["LOG_ID"], $mentionUserID)
857 : false
858 );
859
860 if (
861 $bHaveRights
862 && $arTitleRes["IS_CRM"] === "Y"
863 ) // user has 'normal' rights to the log entry but it's crm
864 {
865 $dbLog = CSocNetLog::getList(
866 array(),
867 array(
868 "ID" => $arCommentFields["LOG_ID"],
869 ),
870 false,
871 false,
872 array("ID", "MODULE_ID")
873 );
874 if (
875 !($arLog = $dbLog->fetch())
876 || $arLog["MODULE_ID"] !== "crm_shared"
877 )
878 {
879 $bHaveRights = false;
880 }
881 }
882
883 $bHaveCrmRights = false;
884
885 if (
886 !$bHaveRights
887 && ($arTitleRes["IS_CRM"] ?? null) === "Y"
888 )
889 {
891 array(),
892 array(
893 "ID" => $arCommentFields["LOG_ID"],
894 "ENTITY_TYPE" => $arCommentFields["ENTITY_TYPE"],
895 ),
896 false,
897 false,
898 array("ID"),
899 array(
900 "IS_CRM" => "Y",
901 "CHECK_CRM_RIGHTS" => "Y",
902 "USER_ID" => $mentionUserID,
903 "USE_SUBSCRIBE" => "N"
904 )
905 );
906 if ($arLog = $dbLog->fetch())
907 {
908 $bHaveCrmRights = true;
909 }
910 }
911
912 if (
913 in_array($mentionUserID, $arExcludeUsers)
914 || (!$bHaveRights && !$bHaveCrmRights)
915 )
916 {
917 continue;
918 }
919
920 $url = false;
921 $serverName = false;
922
923 if (
924 !empty($arSourceURL["URL"])
925 || !empty($arSourceURL["CRM_URL"])
926 )
927 {
929 $arSourceURL,
930 $mentionUserID
931 );
932
933 if (
934 $arTitleRes["IS_CRM"] === "Y"
935 && $bHaveCrmRights
936 && !empty($arTmp["URLS"]["CRM_URL"])
937 )
938 {
939 $url = $arTmp["URLS"]["CRM_URL"];
940 }
941 else
942 {
943 $url = $arTmp["URLS"]["URL"];
944 }
945 $serverName = (str_starts_with($url, "http://") || str_starts_with($url, "https://") ? "" : $arTmp["SERVER_NAME"]);
946 }
947
948 $arMessageFields["TO_USER_ID"] = $mentionUserID;
949
950 if (is_callable($arTitleRes['NOTIFY_MESSAGE']))
951 {
952 $messageClosure = $arTitleRes['NOTIFY_MESSAGE'];
953 $arMessageFields["NOTIFY_MESSAGE"] = fn (?string $languageId = null) => str_replace(
954 array("#url#", "#server_name#"),
955 array($url, $serverName),
956 $messageClosure($languageId)
957 );
958 }
959 else
960 {
961 $arMessageFields["NOTIFY_MESSAGE"] = str_replace(
962 array("#url#", "#server_name#"),
963 array($url, $serverName),
964 $arTitleRes["NOTIFY_MESSAGE"]
965 );
966 }
967
968 if (!empty($arTitleRes["NOTIFY_MESSAGE_OUT"]))
969 {
970 if (is_callable($arTitleRes["NOTIFY_MESSAGE_OUT"]))
971 {
972 $messageOutClosure = $arTitleRes["NOTIFY_MESSAGE_OUT"];
973 $arMessageFields["NOTIFY_MESSAGE_OUT"] = fn (?string $languageId = null) => str_replace(
974 array("#url#", "#server_name#"),
975 array($url, $serverName),
976 $messageOutClosure($languageId)
977 );
978 }
979 else
980 {
981 $arMessageFields["NOTIFY_MESSAGE_OUT"] = str_replace(
982 array("#url#", "#server_name#"),
983 array($url, $serverName),
984 $arTitleRes["NOTIFY_MESSAGE_OUT"]
985 );
986 }
987 }
988 else
989 {
990 $arMessageFields["NOTIFY_MESSAGE_OUT"] = '';
991 }
992
993 CIMNotify::Add($arMessageFields);
994 }
995
996 $arMentionedDestCode = array();
997 foreach($arMention as $val)
998 {
999 $arMentionedDestCode[] = "U".$val;
1000 }
1001
1003 "CONTEXT" => "mention",
1004 "CODE" => array_unique($arMentionedDestCode)
1005 ));
1006 }
1007 }
1008 }
1009
1010 public static function OnSendMentionGetEntityFields_Forum($arCommentFields)
1011 {
1012 if ($arCommentFields["EVENT_ID"] !== "forum")
1013 {
1014 return false;
1015 }
1016
1018 array(),
1019 array(
1020 "ID" => $arCommentFields["LOG_ID"],
1021 "EVENT_ID" => "forum"
1022 ),
1023 false,
1024 false,
1025 array("ID", "TITLE")
1026 );
1027
1028 if ($arLog = $dbLog->Fetch())
1029 {
1030 $genderSuffix = "";
1031 $dbUsers = CUser::GetList("ID", "desc", array("ID" => $arCommentFields["USER_ID"]), array("PERSONAL_GENDER", "LOGIN", "NAME", "LAST_NAME", "SECOND_NAME"));
1032 if ($arUser = $dbUsers->Fetch())
1033 {
1034 $genderSuffix = $arUser["PERSONAL_GENDER"];
1035 }
1036
1037 $strPathToLogEntry = str_replace("#log_id#", $arLog["ID"], COption::GetOptionString("socialnetwork", "log_entry_page", "/company/personal/log/#log_id#/", SITE_ID));
1038 $strPathToLogEntryComment = $strPathToLogEntry.(mb_strpos($strPathToLogEntry, "?") !== false ? "&" : "?")."commentID=".$arCommentFields["ID"];
1039
1040 $title = str_replace(Array("\r\n", "\n"), " ", $arLog["TITLE"]);
1041 $title = TruncateText($title, 100);
1042 $title_out = TruncateText($title, 255);
1043
1044 return [
1045 "URL" => $strPathToLogEntryComment,
1046 "NOTIFY_TAG" => "FORUM|COMMENT_MENTION|".$arCommentFields["ID"],
1047 "NOTIFY_MESSAGE" => fn (?string $languageId = null) => Loc::getMessage(
1048 "SONET_GLC_FORUM_MENTION".($genderSuffix <> '' ? "_".$genderSuffix : ""),
1049 [
1050 "#title#" => "<a href=\"#url#\" class=\"bx-notifier-item-action\">".$title."</a>"
1051 ],
1052 $languageId
1053 ),
1054 "NOTIFY_MESSAGE_OUT" => fn (?string $languageId = null) => Loc::getMessage(
1055 "SONET_GLC_FORUM_MENTION".($genderSuffix <> '' ? "_".$genderSuffix : ""),
1056 [
1057 "#title#" => $title_out
1058 ],
1059 $languageId
1060 )." ("."#server_name##url#)"
1061 ];
1062 }
1063
1064 return false;
1065 }
1066
1067 public static function BatchUpdateLogId($oldLogId, $newLogId)
1068 {
1069 global $DB;
1070
1071 $strUpdate = "UPDATE b_sonet_log_comment SET ".$DB->PrepareUpdate("b_sonet_log_comment", array("LOG_ID" => $newLogId))." WHERE LOG_ID=".intval($oldLogId);
1072 $res = $DB->Query($strUpdate);
1073
1074 return $res;
1075 }
1076}
$connection
Определения actionsdefinitions.php:38
$arSites
Определения options.php:15
global $APPLICATION
Определения include.php:80
$arResult
Определения generate_coupon.php:16
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
Определения check_mail.php:18
static getConnection($name="")
Определения application.php:638
static merge(array $data)
Определения finderdest.php:99
static encode($text)
Определения emoji.php:17
static getUserIds(string $text='')
Определения mention.php:32
static addEvent(string $type, array $data)
Определения service.php:45
static BatchUpdateLogId($oldLogId, $newLogId)
Определения log_comments.php:1067
static UpdateLogData($log_id, $bSetDate=true, $bSetDateByLastComment=false)
Определения log_comments.php:700
static Delete($ID, $bSetSource=false)
Определения log_comments.php:161
static GetByID($ID)
Определения log_comments.php:290
static SetSource($arFields, $action=false)
Определения log_comments.php:744
static SendMentionNotification($arCommentFields)
Определения log_comments.php:775
static CheckFields($ACTION, &$arFields, $ID=0)
Определения log_comments.php:18
static SendEvent($ID, $mailTemplate="SONET_NEW_EVENT", $bTransport=false)
Определения log_comments.php:312
static OnSendMentionGetEntityFields_Forum($arCommentFields)
Определения log_comments.php:1010
static DeleteNoDemand($userID)
Определения log_comments.php:274
static GetSubSelect2($entityId, array $arParams=[])
Определения log_counter.php:17
static GetByID($ID)
Определения log.php:228
static GetSite($log_id)
Определения log.php:1025
Определения event.php:13
Определения cache.php:11
CleanDir($initdir=false, $basedir="cache")
Определения cache.php:25
static deleteRatingVoting(array $params=[])
Определения ratings.php:2444
static GetList($arOrder=Array("ID"=> "DESC"), $arFilter=Array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array(), $arParams=array())
Определения log_comments.php:519
static GetList($arOrder=Array("ID"=> "DESC"), $arFilter=Array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array(), $arParams=array())
Определения log_events.php:74
static GetList($arOrder=Array("ID"=> "DESC"), $arFilter=Array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array(), $arParams=array())
Определения log.php:338
static CheckForUserAll($logID)
Определения log_rights.php:467
static CheckForUserOnly($logID, $userID)
Определения log_rights.php:488
static FindLogCommentEventByID($event_id)
Определения log_tools.php:95
static ProcessPath($arUrl, $user_id, $explicit_site_id=false)
Определения log_tools.php:5283
static Add($arFields)
Определения messages.php:10
$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
$res
Определения filter_act.php:7
global $USER_FIELD_MANAGER
Определения attempt.php:6
if($ajaxMode) $ID
Определения get_user.php:27
const IM_MESSAGE_SYSTEM
Определения include.php:21
const IM_NOTIFY_FROM
Определения include.php:37
$_SERVER["DOCUMENT_ROOT"]
Определения cron_frame.php:9
global $DB
Определения cron_frame.php:29
$siteID
Определения cron_frame.php:12
$ACTION
Определения csv_new_setup.php:27
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
TruncateText($strText, $intLen)
Определения tools.php:2185
if(intval($iTestTransaction) > 0) $arTmp
Определения payment.php:22
$event
Определения prolog_after.php:141
return false
Определения prolog_main_admin.php:185
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
$title
Определения pdf.php:123
$val
Определения options.php:1793
const SONET_ENTITY_GROUP
Определения include.php:117
const SONET_ENTITY_USER
Определения include.php:118
const SONET_MESSAGE_SYSTEM
Определения include.php:47
const SITE_ID
Определения sonet_set_content_view.php:12
$action
Определения file_dialog.php:21
if(CModule::IncludeModule("forum")) if(CModule::IncludeModule("blog")) $dbLog
Определения updtr1007.php:132
$dbResult
Определения updtr957.php:3
$arFilter
Определения user_search.php:106
$url
Определения iframe.php:7