1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
log_follow.php
См. документацию.
1<?php
2
4
6{
7 public static function Set($user_id, $code = "**", $type = "Y", $follow_date = false, $site_id = SITE_ID, $bByWF = false)
8 {
9 global $USER;
10
11 static $LOG_CACHE;
12 static $runCache = []; // to prevent double run
13
14 if ($code == '')
15 {
16 $code = "**";
17 }
18
19 if ($type != "Y")
20 {
21 $type = "N";
22 }
23
24 $user_id = intval($user_id);
25 if ($user_id <= 0)
26 {
27 $user_id = $USER->GetID();
28 }
29
30 $runCacheKey = [
31 'userId' => $user_id,
32 'code' => $code,
33 'type' => $type,
34 'date' => $follow_date,
35 'siteId' => $site_id,
36 'byWF' => $bByWF
37 ];
38
39 $runCacheKey = md5(serialize($runCacheKey));
40 if (array_key_exists($runCacheKey, $runCache))
41 {
42 return true;
43 }
44 $runCache[$runCacheKey] = true;
45
46 $arFollows = array();
47
48 $rsFollow = CSocNetLogFollow::GetList(
49 array(
50 "USER_ID" => $user_id,
51 "CODE" => array_unique(array("**", $code))
52 )
53 );
54 while($arFollow = $rsFollow->Fetch())
55 {
56 $arFollows[$arFollow["CODE"]] = array(
57 "TYPE" => $arFollow["TYPE"],
58 "FOLLOW_DATE" => $arFollow["FOLLOW_DATE"]
59 );
60 }
61
62 $default_type = (
63 array_key_exists("**", $arFollows)
64 ? $arFollows["**"]["TYPE"]
65 : COption::GetOptionString("socialnetwork", "follow_default_type", "Y")
66 );
67
68 $res = false;
69
70 if (preg_match('/^L(\d+)$/', $code, $matches))
71 {
72 $log_id = intval($matches[1]);
73 if ($log_id > 0)
74 {
75 if (isset($LOG_CACHE[$log_id]))
76 {
77 $arLog = $LOG_CACHE[$log_id];
78 }
79 else
80 {
81 $rsLog = CSocNetLog::GetList(
82 array("ID" => "DESC"),
83 array("ID" => $log_id),
84 false,
85 false,
86 array("ID", "LOG_UPDATE", "LOG_DATE"),
87 array(
88 "CHECK_RIGHTS" => "N",
89 "USE_SUBSCRIBE" => "N",
90 "USE_FOLLOW" => "N"
91 )
92 );
93
94 if ($arLog = $rsLog->Fetch())
95 {
96 $LOG_CACHE[$log_id] = $arLog;
97 }
98 }
99
100 if ($arLog)
101 {
102 $log_date = ($arLog["LOG_DATE"] <> '' ? $arLog["LOG_DATE"] : false);
103 $log_update = ($arLog["LOG_UPDATE"] <> '' ? $arLog["LOG_UPDATE"] : false);
104
105 if (array_key_exists($code, $arFollows)) // already in the follows table
106 {
108 $user_id,
109 $code,
110 $type,
111 (
112 $arFollows[$code]["FOLLOW_DATE"] <> ''
113 ? $arFollows[$code]["FOLLOW_DATE"] // existing value
114 : (
115 $type == "N"
116 ? $log_update
117 : ($code == "**" ? $log_date : false)
118 )
119 ),
120 $bByWF
121 );
122 }
123 elseif ($type != $default_type) // new record in the follow table only if not equal to default type
124 {
126 $user_id,
127 $code,
128 $type,
129 (
130 $follow_date
131 ? $follow_date
132 : (
133 $type == "N"
134 ? $log_update
135 : $log_date
136 )
137 ),
138 $bByWF
139 );
140 }
141
142 if ($res)
143 {
144 $events = getModuleEvents('socialnetwork', 'onAfterLogFollowSet');
145 while ($eventFields = $events->fetch())
146 {
147 executeModuleEventEx($eventFields, [ $log_id, $type, $user_id ]);
148 }
149 }
150 }
151 }
152 }
153 else // **, change of default type
154 {
155 $res = (
156 array_key_exists($code, $arFollows)
157 ? CSocNetLogFollow::Update($user_id, $code, $type, false)
158 : CSocNetLogFollow::Add($user_id, $code, $type, false)
159 );
160 }
161
162 return $res;
163 }
164
165 public static function Add($user_id, $code, $type, $follow_date = false, $bByWF = false)
166 {
167 global $DB, $CACHE_MANAGER;
168
169 if (
170 intval($user_id) <= 0
171 || $code == ''
172 )
173 {
174 return false;
175 }
176
177 if ($type != "Y")
178 {
179 $type = "N";
180 }
181
183
184 $ref_id = (preg_match('/(\d+)/', $code, $matches) ? intval($matches[1]) : 0);
185
186 $sql = $connection->getSqlHelper()->getInsertIgnore(
187 'b_sonet_log_follow',
188 ' (USER_ID, CODE, REF_ID, TYPE, FOLLOW_DATE, BY_WF) ',
189 "VALUES("
190 . intval($user_id) . ", '"
191 . $DB->forSql($code) . "', "
192 . $ref_id . ", '"
193 . $DB->forSql($type) . "', "
194 . ($follow_date ? $DB->CharToDateFunction($follow_date) : $DB->CurrentTimeFunction()) . ", "
195 . ($bByWF ? "'Y'" : "null") . ")"
196 );
197
198 $connection->query($sql);
199
200 if (
201 defined("BX_COMP_MANAGED_CACHE")
202 && intval($user_id) > 0
203 && $code === "**"
204 )
205 {
206 $CACHE_MANAGER->ClearByTag("SONET_LOG_FOLLOW_".$user_id);
207 }
208
209 return true;
210 }
211
212 public static function Update($user_id, $code, $type, $follow_date = false, $bByWF = false)
213 {
214 global $DB, $CACHE_MANAGER;
215
216 if (intval($user_id) <= 0 || $code == '')
217 return false;
218
219 if ($type != "Y")
220 $type = "N";
221
222 $strSQL = "UPDATE b_sonet_log_follow SET TYPE = '".$DB->forSql($type)."', FOLLOW_DATE = ".($follow_date ? $DB->CharToDateFunction($follow_date) : $DB->CurrentTimeFunction()).", BY_WF = ".($bByWF ? "'Y'" : "null")." WHERE USER_ID = ".intval($user_id)." AND CODE = '".$DB->forSql($code)."'";
223 if ($DB->Query($strSQL))
224 {
225 if (
226 defined("BX_COMP_MANAGED_CACHE")
227 && intval($user_id) > 0
228 && $code === "**"
229 )
230 {
231 $CACHE_MANAGER->ClearByTag("SONET_LOG_FOLLOW_".$user_id);
232 }
233
234 return true;
235 }
236 else
237 {
238 return false;
239 }
240 }
241
242 public static function Delete($user_id, $code, $type = false)
243 {
244 global $DB, $CACHE_MANAGER;
245
246 if (intval($user_id) <= 0 || $code == '')
247 return false;
248
249 $strSQL = "DELETE FROM b_sonet_log_follow WHERE USER_ID = ".$user_id." AND CODE = '".$code."'";
250
251 if ($type)
252 $strSQL .= " AND TYPE = '".$type."'";
253
254 if ($DB->Query($strSQL))
255 {
256 if (
257 defined("BX_COMP_MANAGED_CACHE")
258 && intval($user_id) > 0
259 && $code === "**"
260 )
261 {
262 $CACHE_MANAGER->ClearByTag("SONET_LOG_FOLLOW_".$user_id);
263 }
264
265 return true;
266 }
267 else
268 {
269 return false;
270 }
271 }
272
273 public static function DeleteByLogID($log_id, $type = false, $bUseSmartLogic = false)
274 {
275 global $DB;
276
277 if (intval($log_id) <= 0)
278 {
279 return false;
280 }
281
282 if (
283 $type == "Y"
284 && $bUseSmartLogic
285 )
286 {
287 $default_follow = COption::GetOptionString("socialnetwork", "follow_default_type", "Y");
288
289 if ($default_follow == "N")
290 {
291 $arUserID = array();
292 $strSQL = "SELECT
293 USER_ID FROM b_sonet_log_follow
294 WHERE
295 CODE = '**'
296 AND TYPE='Y'
297 ";
298 $dbRes = $DB->Query($strSQL);
299 while ($arRes = $dbRes->Fetch())
300 {
301 $arUserID[] = $arRes["USER_ID"];
302 }
303
304 if (count($arUserID) > 0)
305 {
306 $strSQL = "DELETE FROM b_sonet_log_follow
307 WHERE
308 TYPE = 'Y'
309 AND CODE = 'L".$log_id."'
310 AND USER_ID IN (".implode(", ", $arUserID).")
311 ";
312 $DB->Query($strSQL);
313 }
314
315 $strSQL = "UPDATE b_sonet_log_follow
316 SET FOLLOW_DATE = NULL
317 WHERE
318 TYPE = 'Y'
319 AND CODE = 'L".$log_id."'
320 ";
321 if ($DB->Query($strSQL))
322 {
323 return true;
324 }
325 else
326 {
327 return false;
328 }
329 }
330 else
331 {
332 $arUserID = array();
333 $strSQL = "SELECT
334 USER_ID FROM b_sonet_log_follow
335 WHERE
336 CODE = '**'
337 AND TYPE='N'
338 ";
339 $dbRes = $DB->Query($strSQL);
340 while ($arRes = $dbRes->Fetch())
341 $arUserID[] = $arRes["USER_ID"];
342
343 if (count($arUserID) > 0)
344 {
345 $strSQL = "UPDATE b_sonet_log_follow
346 SET FOLLOW_DATE = NULL
347 WHERE
348 TYPE = 'Y'
349 AND CODE = 'L".$log_id."'
350 AND USER_ID IN (".implode(", ", $arUserID).")
351 ";
352 $DB->Query($strSQL);
353 }
354
355 $strSQL = "DELETE FROM b_sonet_log_follow
356 WHERE
357 TYPE = 'Y'
358 AND CODE = 'L".$log_id."'";
359
360 if (count($arUserID) > 0)
361 $strSQL .= " AND USER_ID NOT IN (".implode(", ", $arUserID).")";
362
363 if ($DB->Query($strSQL))
364 return true;
365 else
366 return false;
367 }
368 }
369 else
370 {
371 $strSQL = "DELETE FROM b_sonet_log_follow WHERE CODE = 'L".$log_id."'";
372
373 if ($DB->Query($strSQL))
374 return true;
375 else
376 return false;
377 }
378 }
379
380 public static function GetExactValueByRating($user_id, $rating_type_id, $rating_entity_id)
381 {
382 global $DB;
383
384 if (
385 intval($user_id) <= 0
386 || $rating_type_id == ''
387 || intval($rating_entity_id) <= 0
388 )
389 return false;
390
391 $arPostTypeID = array(
392 "BLOG_POST",
393 "FORUM_TOPIC",
394 "IBLOCK_ELEMENT",
395 "BITRIX24_NEW_USER",
396 "INTRANET_NEW_USER",
397 "LOG_ENTRY"
398 );
399
400 $arCommentTypeID = array(
401 "BLOG_COMMENT",
402 "FORUM_POST",
403 "BITRIX24_NEW_USER_COMMENT",
404 "INTRANET_NEW_USER_COMMENT",
405 "LOG_COMMENT"
406 );
407
408 $strRes = false;
409
410 if (
411 in_array($rating_type_id, $arCommentTypeID)
412 ||
413 (
414 !in_array($rating_type_id, $arCommentTypeID)
415 && !in_array($rating_type_id, $arPostTypeID)
416 )
417 )
418 {
419 $strSQL = "SELECT TYPE FROM b_sonet_log_follow LFW
420 INNER JOIN b_sonet_log_comment LC ON
421 LC.RATING_TYPE_ID = '".$rating_type_id."'
422 AND LC.RATING_ENTITY_ID = ".intval($rating_entity_id)."
423 AND LFW.REF_ID = LC.LOG_ID
424 AND LFW.CODE = ".$DB->Concat("'L'", ($DB->type == "MSSQL" ? "CAST(LC.LOG_ID as varchar(17))" : "LC.LOG_ID"))."
425 WHERE
426 LFW.USER_ID = ".intval($user_id);
427
428 $dbRes = $DB->Query($strSQL);
429 if ($arRes = $dbRes->Fetch())
430 {
431 $strRes = $arRes["TYPE"];
432 }
433 }
434
435 if (
436 in_array($rating_type_id, $arPostTypeID)
437 ||
438 (
439 !in_array($rating_type_id, $arCommentTypeID)
440 && !in_array($rating_type_id, $arPostTypeID)
441 && !$strRes
442 )
443 )
444 {
445 $strSQL = "SELECT TYPE FROM b_sonet_log_follow LFW
446 INNER JOIN b_sonet_log L ON
447 L.RATING_TYPE_ID = '".$rating_type_id."'
448 AND L.RATING_ENTITY_ID = ".intval($rating_entity_id)."
449 AND LFW.REF_ID = L.ID
450 AND LFW.CODE = ".$DB->Concat("'L'", ($DB->type == "MSSQL" ? "CAST(L.ID as varchar(17))" : "L.ID"))."
451 WHERE
452 LFW.USER_ID = ".intval($user_id);
453
454 $dbRes = $DB->Query($strSQL);
455 if ($arRes = $dbRes->Fetch())
456 {
457 $strRes = $arRes["TYPE"];
458 }
459 }
460
461 return $strRes;
462 }
463
464 public static function GetList($arFilter = Array(), $arSelectFields = array())
465 {
466 global $DB;
467
468 if (count($arSelectFields) <= 0)
469 {
470 $arSelectFields = array("USER_ID", "CODE", "TYPE", "FOLLOW_DATE", "BY_WF");
471 }
472
473 // FIELDS -->
475 "USER_ID" => Array("FIELD" => "SLF.USER_ID", "TYPE" => "int"),
476 "CODE" => Array("FIELD" => "SLF.CODE", "TYPE" => "string"),
477 "REF_ID" => Array("FIELD" => "SLF.REF_ID", "TYPE" => "int"),
478 "TYPE" => array("FIELD" => "SLF.TYPE", "TYPE" => "char"),
479 "FOLLOW_DATE" => Array("FIELD" => "SLF.FOLLOW_DATE", "TYPE" => "datetime"),
480 "BY_WF" => array("FIELD" => "SLF.BY_WF", "TYPE" => "char"),
481 );
482 // <-- FIELDS
483
484 $arSqls = CSocNetGroup::PrepareSql($arFields, array(), $arFilter, false, $arSelectFields);
485
486 $arSqls["SELECT"] = str_replace("%%_DISTINCT_%%", "", $arSqls["SELECT"]);
487
488 $strSql =
489 "SELECT ".$arSqls["SELECT"]." ".
490 "FROM b_sonet_log_follow SLF ".
491 " ".$arSqls["FROM"]." ";
492 if ($arSqls["WHERE"] <> '')
493 $strSql .= "WHERE ".$arSqls["WHERE"]." ";
494
495 $dbRes = $DB->Query($strSql);
496
497 return $dbRes;
498 }
499
500 public static function GetDefaultValue($user_id)
501 {
502 if (intval($user_id) <= 0)
503 {
504 return false;
505 }
506
507 global $CACHE_MANAGER;
508
509 $ttl = (defined("BX_COMP_MANAGED_CACHE") ? 2592000 : 600);
510
511 $cache_id = 'sonet_follow_default_'.$user_id;
512 $obCache = new CPHPCache;
513 $cache_dir = '/sonet/log_follow/'.$user_id.'/';
514
515 if($obCache->InitCache($ttl, $cache_id, $cache_dir))
516 {
517 $tmpVal = $obCache->GetVars();
518 $default_follow = $tmpVal["VALUE"];
519 unset($tmpVal);
520 }
521 else
522 {
523 $default_follow = false;
524
525 if (is_object($obCache))
526 $obCache->StartDataCache($ttl, $cache_id, $cache_dir);
527
528 if (defined("BX_COMP_MANAGED_CACHE"))
529 {
530 $CACHE_MANAGER->StartTagCache($cache_dir);
531 $CACHE_MANAGER->RegisterTag("SONET_LOG_FOLLOW_".$user_id);
532 }
533
534 $rsFollow = CSocNetLogFollow::GetList(
535 array(
536 "USER_ID" => $user_id,
537 "CODE" => "**"
538 ),
539 array("TYPE")
540 );
541 if ($arFollow = $rsFollow->Fetch())
542 {
543 $default_follow = $arFollow["TYPE"];
544 }
545
546 if (is_object($obCache))
547 {
548 $arCacheData = Array(
549 "VALUE" => $default_follow
550 );
551 $obCache->EndDataCache($arCacheData);
552 if (defined("BX_COMP_MANAGED_CACHE"))
553 {
554 $CACHE_MANAGER->EndTagCache();
555 }
556 }
557 }
558 unset($obCache);
559
560 if (!$default_follow)
561 {
562 $default_follow = COption::GetOptionString("socialnetwork", "follow_default_type", "Y");
563 }
564
565 return $default_follow;
566 }
567
568 public static function OnBlogPostMentionNotifyIm($ID, $arMessageFields)
569 {
570 $res = false;
571
572 if (
573 is_array($arMessageFields)
574 && intval($arMessageFields["TO_USER_ID"]) > 0
575 && intval($arMessageFields["LOG_ID"]) > 0
576 )
577 {
579 'logId' => $arMessageFields["LOG_ID"],
580 'userId' => $arMessageFields["TO_USER_ID"],
581 'typeList' => array(
582 'FOLLOW',
583 'COUNTER_COMMENT_PUSH'
584 ),
585 'followDate' => 'CURRENT'
586 ));
587 }
588
589 return $res;
590 }
591
592 public static function checkAutoUnfollow($traffic_cnt, $traffic_avg, $userId = false)
593 {
594 global $USER;
595
596 if (
597 (int)$traffic_cnt > 10
598 && (int)$traffic_avg < 60*60*4 // 4 hours
599 )
600 {
601 $userId = (
602 !$userId
603 || intval($userId) <= 0
604 ? $USER->GetID()
605 : intval($userId)
606 );
607
608 $default_follow = self::GetDefaultValue($userId);
609 if ($default_follow === 'Y')
610 {
611 $isAlreadyChecked = CUserOptions::GetOption("socialnetwork", "~log_autofollow_checked", "N", $userId);
612 if ($isAlreadyChecked !== 'Y')
613 {
614 if (CModule::IncludeModule('im'))
615 {
616 $locCode = \Bitrix\Main\ModuleManager::isModuleInstalled('intranet') ? "SONET_LF_UNFOLLOW_IM_MESSAGE3" : "SONET_LF_UNFOLLOW_IM_MESSAGE";
617 $arMessageFields2Send = array(
618 "MESSAGE_TYPE" => IM_MESSAGE_SYSTEM,
619 "NOTIFY_TYPE" => IM_NOTIFY_CONFIRM,
620 "NOTIFY_MODULE" => "socialnetwork",
621 "NOTIFY_EVENT" => "sonet_auto_unfollow_btn",
622 "NOTIFY_TAG" => "SONET|UNFOLLOW|".$userId,
623 "TO_USER_ID" => $userId,
624 "NOTIFY_MESSAGE" => fn (?string $languageId = null) => \Bitrix\Main\Localization\Loc::getMessage($locCode, null, $languageId),
625 "NOTIFY_MESSAGE_OUT" => IM_MAIL_SKIP,
626 "NOTIFY_BUTTONS" => Array(
627 Array("TITLE" => GetMessage("SONET_LF_UNFOLLOW_IM_BUTTON_Y"), "VALUE" => "Y", "TYPE" => "accept"),
628 Array("TITLE" => GetMessage("SONET_LF_UNFOLLOW_IM_BUTTON_N"), "VALUE" => "N", "TYPE" => "cancel"),
629 )
630 );
631
632 CIMNotify::Add($arMessageFields2Send);
633 }
634
635 CUserOptions::SetOption("socialnetwork", "~log_autofollow_checked", "Y", false, $userId);
636 }
637 }
638 }
639 }
640
641 public static function OnBeforeConfirmNotify($module, $tag, $value, $arParams)
642 {
643 global $USER;
644
645 if ($module === "socialnetwork")
646 {
647 $arTag = explode("|", $tag);
648 if (
649 count($arTag) === 3
650 && $arTag[1] === 'UNFOLLOW'
651 )
652 {
653 if ($value === 'Y')
654 {
655 self::Set($USER->GetID(), "**", "N");
656 }
657 return true;
658 }
659 }
660
661 return null;
662 }
663}
$arParams
Определения access_dialog.php:21
$connection
Определения actionsdefinitions.php:38
$type
Определения options.php:106
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
Определения check_mail.php:18
static getConnection($name="")
Определения application.php:638
static isModuleInstalled($moduleName)
Определения modulemanager.php:125
static userLogSubscribe($params=array())
Определения componenthelper.php:4799
Определения log_follow.php:6
static OnBeforeConfirmNotify($module, $tag, $value, $arParams)
Определения log_follow.php:641
static GetList($arFilter=Array(), $arSelectFields=array())
Определения log_follow.php:464
static Update($user_id, $code, $type, $follow_date=false, $bByWF=false)
Определения log_follow.php:212
static checkAutoUnfollow($traffic_cnt, $traffic_avg, $userId=false)
Определения log_follow.php:592
static Delete($user_id, $code, $type=false)
Определения log_follow.php:242
static DeleteByLogID($log_id, $type=false, $bUseSmartLogic=false)
Определения log_follow.php:273
static OnBlogPostMentionNotifyIm($ID, $arMessageFields)
Определения log_follow.php:568
static GetDefaultValue($user_id)
Определения log_follow.php:500
static GetExactValueByRating($user_id, $rating_type_id, $rating_entity_id)
Определения log_follow.php:380
static Set($user_id, $code="**", $type="Y", $follow_date=false, $site_id=SITE_ID, $bByWF=false)
Определения log_follow.php:7
static Add($user_id, $code, $type, $follow_date=false, $bByWF=false)
Определения log_follow.php:165
static GetList($arOrder=Array("ID"=> "DESC"), $arFilter=Array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array(), $arParams=array())
Определения log.php:338
global $CACHE_MANAGER
Определения clear_component_cache.php:7
$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
if($ajaxMode) $ID
Определения get_user.php:27
const IM_MESSAGE_SYSTEM
Определения include.php:21
const IM_MAIL_SKIP
Определения include.php:52
const IM_NOTIFY_CONFIRM
Определения include.php:36
global $DB
Определения cron_frame.php:29
global $USER
Определения csv_new_run.php:40
if(!is_null($config))($config as $configItem)(! $configItem->isVisible()) $code
Определения options.php:195
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
Определения tools.php:3778
GetMessage($name, $aReplace=null)
Определения tools.php:3397
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
</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
$matches
Определения index.php:22
$arRes
Определения options.php:104
$site_id
Определения sonet_set_content_view.php:9
const SITE_ID
Определения sonet_set_content_view.php:12
$arFilter
Определения user_search.php:106
$dbRes
Определения yandex_detail.php:168