1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
group.php
См. документацию.
1<?php
2
4
14use Bitrix\Socialnetwork\Item\Workgroup\AvatarType;
15use Bitrix\Socialnetwork\Item\Workgroup\Type;
17use Bitrix\Tasks\Util\Restriction\Bitrix24Restriction\Limit\ProjectLimit;
18use Bitrix\Tasks\Util\Restriction\Bitrix24Restriction\Limit\ScrumLimit;
19use Bitrix\Tasks\Control\Tag;
21
23{
24 protected static $staticCache = array();
25
26 /***************************************/
27 /******** DATA MODIFICATION **********/
28 /***************************************/
29 public static function CheckFields($ACTION, &$arFields, $ID = 0): bool
30 {
32
33 if ($ACTION !== "ADD" && (int)$ID <= 0)
34 {
35 $APPLICATION->ThrowException("System error 870164", "ERROR");
36 return false;
37 }
38
39 if(
40 ($ID === 0 && !is_set($arFields, "SITE_ID"))
41 ||
42 (
43 is_set($arFields, "SITE_ID")
44 && (
45 (is_array($arFields["SITE_ID"]) && count($arFields["SITE_ID"]) <= 0)
46 ||
47 (!is_array($arFields["SITE_ID"]) && $arFields["SITE_ID"] == '')
48 )
49 )
50 )
51 {
52 $APPLICATION->ThrowException(GetMessage("SONET_GG_EMPTY_SITE_ID"), "EMPTY_SITE_ID");
53 return false;
54 }
55 elseif(is_set($arFields, "SITE_ID"))
56 {
57 if(!is_array($arFields["SITE_ID"]))
58 $arFields["SITE_ID"] = array($arFields["SITE_ID"]);
59
60 foreach($arFields["SITE_ID"] as $v)
61 {
62 $r = CSite::GetByID($v);
63 if(!$r->Fetch())
64 {
65 $APPLICATION->ThrowException(str_replace("#ID#", $v, GetMessage("SONET_GG_ERROR_NO_SITE")), "ERROR_NO_SITE");
66 return false;
67 }
68 }
69 }
70
71 if ((is_set($arFields, "NAME") || $ACTION === "ADD") && ($arFields["NAME"] ?? '') === '')
72 {
73 $APPLICATION->ThrowException(GetMessage("SONET_GB_EMPTY_NAME"), "EMPTY_NAME");
74 return false;
75 }
76
77 if (is_set($arFields, "DATE_CREATE") && (!$DB->IsDate($arFields["DATE_CREATE"], false, LANG, "FULL")))
78 {
79 $APPLICATION->ThrowException(GetMessage("SONET_GB_EMPTY_DATE_CREATE"), "EMPTY_DATE_CREATE");
80 return false;
81 }
82
83 if (is_set($arFields, "DATE_UPDATE") && (!$DB->IsDate($arFields["DATE_UPDATE"], false, LANG, "FULL")))
84 {
85 $APPLICATION->ThrowException(GetMessage("SONET_GB_EMPTY_DATE_UPDATE"), "EMPTY_DATE_UPDATE");
86 return false;
87 }
88
89 if (is_set($arFields, "DATE_ACTIVITY") && (!$DB->IsDate($arFields["DATE_ACTIVITY"], false, LANG, "FULL")))
90 {
91 $APPLICATION->ThrowException(GetMessage("SONET_GB_EMPTY_DATE_ACTIVITY"), "EMPTY_DATE_ACTIVITY");
92 return false;
93 }
94
95 if ((is_set($arFields, "OWNER_ID") || $ACTION === "ADD") && (int)$arFields["OWNER_ID"] <= 0)
96 {
97 $APPLICATION->ThrowException(GetMessage("SONET_GB_EMPTY_OWNER_ID"), "EMPTY_OWNER_ID");
98 return false;
99 }
100
101 if (is_set($arFields, "OWNER_ID"))
102 {
103 $dbResult = CUser::GetByID($arFields["OWNER_ID"]);
104 if (!$dbResult->Fetch())
105 {
106 $APPLICATION->ThrowException(GetMessage("SONET_GB_ERROR_NO_OWNER_ID"), "ERROR_NO_OWNER_ID");
107 return false;
108 }
109 }
110
111 if ((is_set($arFields, "SUBJECT_ID") || $ACTION === "ADD") && (int)$arFields["SUBJECT_ID"] <= 0)
112 {
113 $APPLICATION->ThrowException(GetMessage("SONET_GB_EMPTY_SUBJECT_ID"), "EMPTY_SUBJECT_ID");
114 return false;
115 }
116
117 if (is_set($arFields, "SUBJECT_ID"))
118 {
119 $arResult = CSocNetGroupSubject::GetByID($arFields["SUBJECT_ID"]);
120 if ($arResult == false)
121 {
122 $APPLICATION->ThrowException(GetMessage("SONET_GB_ERROR_NO_SUBJECT_ID"), "ERROR_NO_SUBJECT_ID");
123 return false;
124 }
125 }
126
127 if ((is_set($arFields, "ACTIVE") || $ACTION === "ADD") && $arFields["ACTIVE"] !== "Y" && $arFields["ACTIVE"] !== "N")
128 {
129 $arFields["ACTIVE"] = "Y";
130 }
131
132 if (
133 (is_set($arFields, "VISIBLE") || $ACTION === "ADD")
134 && ($arFields["VISIBLE"] ?? null) !== "Y"
135 && ($arFields["VISIBLE"] ?? null) !== "N"
136 )
137 {
138 $arFields["VISIBLE"] = "Y";
139 }
140
141 if (
142 (is_set($arFields, "OPENED") || $ACTION === "ADD")
143 && ($arFields["OPENED"] ?? null) !== "Y"
144 && ($arFields["OPENED"] ?? null) !== "N"
145 )
146 {
147 $arFields["OPENED"] = "N";
148 }
149
150 if (
151 (is_set($arFields, "CLOSED") || $ACTION=="ADD")
152 && ($arFields["CLOSED"] ?? null) != "Y"
153 && ($arFields["CLOSED"] ?? null) !== "N"
154 )
155 {
156 $arFields["CLOSED"] = "N";
157 }
158
159 if ((is_set($arFields, "INITIATE_PERMS") || $ACTION === "ADD") && $arFields["INITIATE_PERMS"] == '')
160 {
161 $APPLICATION->ThrowException(GetMessage("SONET_UG_EMPTY_INITIATE_PERMS"), "EMPTY_INITIATE_PERMS");
162 return false;
163 }
164
165 if (is_set($arFields, "INITIATE_PERMS") && !in_array($arFields["INITIATE_PERMS"], $arSocNetAllowedInitiatePerms))
166 {
167 $APPLICATION->ThrowException(str_replace("#ID#", $arFields["INITIATE_PERMS"], GetMessage("SONET_UG_ERROR_NO_INITIATE_PERMS")), "ERROR_NO_INITIATE_PERMS");
168 return false;
169 }
170
171 if ((is_set($arFields, "SPAM_PERMS") || $ACTION === "ADD") && $arFields["SPAM_PERMS"] == '')
172 {
173 $APPLICATION->ThrowException(GetMessage("SONET_UG_EMPTY_SPAM_PERMS"), "EMPTY_SPAM_PERMS");
174 return false;
175 }
176
177 if (is_set($arFields, "SPAM_PERMS") && !in_array($arFields["SPAM_PERMS"], $arSocNetAllowedSpamPerms))
178 {
179 $APPLICATION->ThrowException(str_replace("#ID#", $arFields["SPAM_PERMS"], GetMessage("SONET_UG_ERROR_NO_SPAM_PERMS")), "ERROR_NO_SPAM_PERMS");
180 return false;
181 }
182
183 if (
184 is_set($arFields, "IMAGE_ID")
185 && is_array($arFields["IMAGE_ID"])
186 && ($arFields["IMAGE_ID"]["name"] ?? '') == ''
187 && (($arFields["IMAGE_ID"]["del"] ?? null) == '' || $arFields["IMAGE_ID"]["del"] !== "Y")
188 )
189 {
190 unset($arFields["IMAGE_ID"]);
191 }
192
193 if (is_set($arFields, "IMAGE_ID"))
194 {
195 $arResult = CFile::CheckImageFile($arFields["IMAGE_ID"]);
196 if ($arResult <> '')
197 {
198 $APPLICATION->ThrowException(GetMessage("SONET_GP_ERROR_IMAGE_ID").": ".$arResult, "ERROR_IMAGE_ID");
199 return false;
200 }
201 }
202
203 $avatarType = $arFields['AVATAR_TYPE'] ?? null;
204 if (
205 is_set($arFields, 'AVATAR_TYPE')
206 && !array_key_exists($arFields['AVATAR_TYPE'], Workgroup::getAvatarTypes())
207 )
208 {
209 unset($arFields['AVATAR_TYPE']);
210 }
211
212 $canSetEmptyAvatarType =
213 ($arFields['TYPE'] ?? null) === Type::Collab->value
214 && $avatarType === AvatarType::None->value
215 ;
216
217 if ($canSetEmptyAvatarType)
218 {
219 $arFields['AVATAR_TYPE'] = '';
220 }
221
222 if (!$USER_FIELD_MANAGER->CheckFields("SONET_GROUP", $ID, $arFields))
223 {
224 return false;
225 }
226
227 if (!empty($arFields['NAME']))
228 {
229 $arFields['NAME'] = Emoji::encode($arFields['NAME']);
230 }
231
232 if (isset($arFields['NAME']))
233 {
234 $isCollab = $arFields['TYPE'] === Bitrix\Socialnetwork\Item\Workgroup\Type::Collab->value;
235 $isCheckNameNeeded = $isCollab || (Option::get('socialnetwork', 'check_group_name_enable', 'Y') === 'Y');
236
237 if ($isCheckNameNeeded)
238 {
239 $groupProvider = Bitrix\Socialnetwork\Provider\GroupProvider::getInstance();
240
241 if ($groupProvider->isExistingGroup($arFields['NAME'], $ID))
242 {
243 $APPLICATION->ThrowException(GetMessage("SONET_ERROR_SAME_GROUP_NAME_EXISTS"), 'ERROR_GROUP_NAME_EXISTS');
244 return false;
245 }
246 }
247 }
248
249 if (!empty($arFields['DESCRIPTION']))
250 {
251 $arFields['DESCRIPTION'] = Emoji::encode($arFields['DESCRIPTION']);
252 }
253
254 if (isset($arFields['TYPE']))
255 {
256 if (!Type::isValid($arFields['TYPE']))
257 {
258 $APPLICATION->ThrowException('Wrong type', 'WRONG_GROUP_TYPE');
259 return false;
260 }
261
262 $arFields['TYPE'] = Type::getValue($arFields['TYPE']);
263 }
264
265 if (!is_string($arFields['KEYWORDS'] ?? ''))
266 {
267 unset($arFields['KEYWORDS']);
268 }
269
270 return true;
271 }
272
273 public static function Delete($ID)
274 {
276
278 {
279 return false;
280 }
281
282 $ID = intval($ID);
283
284 $db_events = GetModuleEvents("socialnetwork", "OnBeforeSocNetGroupDelete");
285 while ($arEvent = $db_events->Fetch())
286 {
287 if (ExecuteModuleEventEx($arEvent, array($ID))===false)
288 {
289 return false;
290 }
291 }
292
293 $queryObject = \Bitrix\Socialnetwork\WorkgroupTable::getList([
294 'filter' => ['ID' => $ID],
295 'select' => ['IMAGE_ID', 'NAME', 'PROJECT', 'TYPE'],
296 ]);
297 $arGroup = $queryObject->fetch();
298 if (!$arGroup)
299 {
300 $APPLICATION->ThrowException(GetMessage("SONET_NO_GROUP"), "ERROR_NO_GROUP");
301 return false;
302 }
303
304 $isCollab = $arGroup['TYPE'] === Type::Collab->value;
305
306 $DB->StartTransaction();
307
308 $events = GetModuleEvents("socialnetwork", "OnSocNetGroupDelete");
309 while ($arEvent = $events->Fetch())
310 {
311 ExecuteModuleEventEx($arEvent, array($ID));
312 }
313
315 'GROUP_ID' => $ID,
316 ]);
317
318 $res = UserToGroupTable::getList([
319 'filter' => [
320 '=GROUP_ID' => $ID
321 ],
322 'select' => [ 'USER_ID' ]
323 ]);
324 while($relationFields = $res->fetch())
325 {
326 CSocNetSearch::onUserRelationsChange($relationFields['USER_ID']);
327 }
328 $bSuccess = $DB->Query("DELETE FROM b_sonet_user2group WHERE GROUP_ID = ".$ID, true);
329
330 if ($bSuccess)
331 {
332 if (!$isCollab)
333 {
335 'group_id' => $ID,
336 'group_name' => $arGroup['NAME'],
337 'group_project' => $arGroup['PROJECT'],
338 ]);
339 }
340
341 $bSuccessTmp = true;
342 $dbResult = CSocNetFeatures::GetList(
343 array(),
344 array("ENTITY_ID" => $ID, "ENTITY_TYPE" => SONET_ENTITY_GROUP)
345 );
346 while ($arResult = $dbResult->Fetch())
347 {
348 $bSuccessTmp = $DB->Query("DELETE FROM b_sonet_features2perms WHERE FEATURE_ID = ".$arResult["ID"]."", true);
349 if (!$bSuccessTmp)
350 {
351 break;
352 }
353 }
354 if (!$bSuccessTmp)
355 {
356 $bSuccess = false;
357 }
358 }
359 if ($bSuccess)
360 {
361 $bSuccess = $DB->Query("DELETE FROM b_sonet_features WHERE ENTITY_ID = ".$ID." AND ENTITY_TYPE = '".$DB->ForSql(SONET_ENTITY_GROUP, 1)."'", true);
362 }
363 if ($bSuccess)
364 {
366 array(),
367 array("ENTITY_ID" => $ID, "ENTITY_TYPE" => SONET_ENTITY_GROUP),
368 false,
369 false,
370 array("ID")
371 );
372 while ($arResult = $dbResult->Fetch())
373 {
374 $bSuccessTmp = $DB->Query("DELETE FROM b_sonet_log_site WHERE LOG_ID = ".$arResult["ID"]."", true);
375 if (!$bSuccessTmp)
376 {
377 break;
378 }
379
380 $bSuccessTmp = $DB->Query("DELETE FROM b_sonet_log_right WHERE LOG_ID = ".$arResult["ID"]."", true);
381 if (!$bSuccessTmp)
382 {
383 break;
384 }
385 }
386 if (!$bSuccessTmp)
387 {
388 $bSuccess = false;
389 }
390 }
391 if ($bSuccess)
392 {
393 $bSuccess = $DB->Query("DELETE FROM b_sonet_log WHERE ENTITY_TYPE = '".SONET_ENTITY_GROUP."' AND ENTITY_ID = ".$ID."", true);
394 }
395 if ($bSuccess)
396 {
398 }
399 if ($bSuccess)
400 {
401 $bSuccess = $DB->Query("DELETE FROM b_sonet_log_events WHERE ENTITY_TYPE = 'G' AND ENTITY_ID = ".$ID."", true);
402 }
403 if ($bSuccess)
404 {
405 $bSuccess = $DB->Query("DELETE FROM b_sonet_group_site WHERE GROUP_ID = ".$ID."", true);
406 }
407 if ($bSuccess)
408 {
409 $bSuccess = $DB->Query("DELETE FROM b_sonet_log_right WHERE GROUP_CODE LIKE 'OSG".$ID."\_%'", true);
410 }
411 if ($bSuccess)
412 {
413 $bSuccess = $DB->Query("DELETE FROM b_sonet_log_right WHERE GROUP_CODE LIKE 'SG".$ID."\_%'", true);
414 }
415 if ($bSuccess)
416 {
417 $bSuccess = $DB->Query("DELETE FROM b_sonet_log_right WHERE GROUP_CODE = 'SG".$ID."'", true);
418 }
419 if ($bSuccess)
420 {
421 $bSuccess = CSocNetSubscription::DeleteEx(false, "SG".$ID);
422 }
423 if ($bSuccess)
424 {
426 }
427
428 if ($bSuccess)
429 {
430 CFile::Delete($arGroup["IMAGE_ID"]);
431 $bSuccess = $DB->Query("DELETE FROM b_sonet_group WHERE ID = ".$ID."", true);
432 }
433
434 $sonetGroupCache = self::getStaticCache();
435
436 if ($bSuccess)
437 {
438 CUserOptions::DeleteOption("socialnetwork", "~menu_".SONET_ENTITY_GROUP."_".$ID, false, 0);
439
440 unset($sonetGroupCache[$ID]);
441 self::setStaticCache($sonetGroupCache);
442 GroupRegistry::getInstance()->invalidate($ID);
443 FeatureTable::cleanCache();
444 }
445
446 if ($bSuccess)
447 {
448 $DB->Commit();
449 }
450 else
451 {
452 $DB->Rollback();
453 }
454
455 if ($bSuccess)
456 {
457 unset($sonetGroupCache[$ID]);
458 self::setStaticCache($sonetGroupCache);
459
460 if(defined("BX_COMP_MANAGED_CACHE"))
461 {
462 $CACHE_MANAGER->ClearByTag("sonet_user2group_G".$ID);
463 $CACHE_MANAGER->ClearByTag("sonet_user2group");
464 $CACHE_MANAGER->ClearByTag("sonet_group_".$ID);
465 $CACHE_MANAGER->ClearByTag("sonet_group");
466 }
467 }
468
469 if (
470 $bSuccess
471 && CModule::IncludeModule("search")
472 )
473 {
474 CSearch::DeleteIndex("socialnetwork", "G".$ID);
475 }
476
477 if ($bSuccess)
478 {
479 $DB->Query("DELETE FROM b_sonet_event_user_view WHERE ENTITY_TYPE = '".SONET_ENTITY_GROUP."' AND ENTITY_ID = ".$ID, true);
480 }
481
482 if ($bSuccess)
483 {
484 $USER_FIELD_MANAGER->Delete("SONET_GROUP", $ID);
485 }
486
487 $groupId = (int)$ID;
488 if ($bSuccess && $groupId > 0)
489 {
490 GroupRegistry::getInstance()->invalidate($groupId);
491 }
492
493 if (Loader::includeModule('tasks'))
494 {
495 $tagService = new Tag(0);
496 $tagService->deleteGroupTags($ID);
497 }
498
499 return $bSuccess;
500 }
501
502 public static function DeleteNoDemand($userID): bool
503 {
504 global $APPLICATION;
505
506 if (!CSocNetGroup::__ValidateID($userID))
507 {
508 return false;
509 }
510
511 $userID = intval($userID);
512
513 $err = "";
514 $dbResult = CSocNetGroup::GetList(array(), array("OWNER_ID" => $userID), false, false, array("ID", "NAME"));
515 while ($arResult = $dbResult->GetNext())
516 {
517 $err .= Emoji::decode($arResult["NAME"]) . "<br>";
518 }
519
520 if ($err == '')
521 {
522 return true;
523 }
524 else
525 {
526 $err = GetMessage("SONET_GG_ERROR_CANNOT_DELETE_USER_1").$err;
527 $err .= GetMessage("SONET_GG_ERROR_CANNOT_DELETE_USER_2");
528 $APPLICATION->ThrowException($err);
529 return false;
530 }
531 }
532
533 public static function SetStat($ID, int $currentUserId = 0): void
534 {
536 return;
537
538 $ID = intval($ID);
539
540 $num = CSocNetUserToGroup::GetList(
541 array(),
542 array(
543 "GROUP_ID" => $ID,
544 "USER_ACTIVE" => "Y",
545 "<=ROLE" => SONET_ROLES_USER
546 ),
547 array()
548 );
549
550 $num_mods = CSocNetUserToGroup::GetList(
551 array(),
552 array(
553 "GROUP_ID" => $ID,
554 "USER_ACTIVE" => "Y",
555 "<=ROLE" => SONET_ROLES_MODERATOR
556 ),
557 array()
558 );
559
560 CSocNetGroup::Update(
561 $ID,
562 array(
563 "NUMBER_OF_MEMBERS" => $num,
564 "NUMBER_OF_MODERATORS" => $num_mods,
565 'INITIATED_BY_USER_ID' => $currentUserId,
566 ),
567 true,
568 false,
569 false
570 );
571 }
572
573 public static function SetLastActivity($ID, $date = false): void
574 {
575 global $DB, $CACHE_MANAGER;
576
578 {
579 return;
580 }
581
582 $ID = intval($ID);
583
584 CSocNetGroup::Update($ID, (
585 $date
586 ? array("DATE_ACTIVITY" => $date)
587 : array("=DATE_ACTIVITY" => $DB->CurrentTimeFunction())
588 ),
589 true,
590 false,
591 false
592 );
593
594 if (defined("BX_COMP_MANAGED_CACHE"))
595 {
596 $CACHE_MANAGER->clearByTag("sonet_group_activity");
597 }
598 }
599
600 /***************************************/
601 /********** DATA SELECTION ***********/
602 /***************************************/
603 public static function getById($id, $checkPermissions = false, array $options = [])
604 {
605 global $USER, $CACHE_MANAGER;
606
607 $id = (int)$id;
608
610 {
611 return false;
612 }
613
614 $staticCacheKey = implode('_', array_merge([
615 ($checkPermissions ? 'Y' : 'N'),
616 ], $options));
617
618 $sonetGroupCache = self::getStaticCache();
619
620 if (
621 is_array($sonetGroupCache)
622 && is_array(($sonetGroupCache[$id] ?? null))
623 && is_array(($sonetGroupCache[$id][$staticCacheKey] ?? null))
624 )
625 {
626 return $sonetGroupCache[$id][$staticCacheKey];
627 }
628
629 $cache = false;
630 $cachePath = false;
631
632 if (!$checkPermissions)
633 {
634 $cache = new CPHPCache;
635 $cacheTime = 31536000;
636 $cacheId = implode('_', array_merge([
637 'group',
638 $id,
639 LANGUAGE_ID,
640 CTimeZone::getOffset(),
641 Context::getCurrent()->getCulture()->getDateTimeFormat()
642 ], $options));
643 $cachePath = '/sonet/group/' . $id . '/';
644 }
645
646 if (
647 $cache
648 && $cache->initCache($cacheTime, $cacheId, $cachePath)
649 )
650 {
651 $cacheVars = $cache->getVars();
652 $result = $cacheVars['FIELDS'];
653 }
654 else
655 {
656 if ($cache)
657 {
658 $cache->startDataCache($cacheTime, $cacheId, $cachePath);
659 }
660
661 $filter = [
662 'ID' => $id,
663 ];
664
665 if (
666 $checkPermissions
667 && is_object($USER)
668 && ($USER->GetID() > 0)
669 )
670 {
671 $filter['CHECK_PERMISSIONS'] = $USER->getId();
672 }
673
674 $select = [
675 "ID", "SITE_ID", "NAME", "DESCRIPTION", "DATE_CREATE", "DATE_UPDATE", "ACTIVE", "VISIBLE", "OPENED", "CLOSED", "SUBJECT_ID", "OWNER_ID", "KEYWORDS",
676 'IMAGE_ID', 'AVATAR_TYPE',
677 "NUMBER_OF_MEMBERS", "NUMBER_OF_MODERATORS",
678 "INITIATE_PERMS", "SPAM_PERMS",
679 "DATE_ACTIVITY", "SUBJECT_NAME", 'TYPE', "UF_*",
680 ];
681 if (ModuleManager::isModuleInstalled('intranet'))
682 {
683 $select = array_merge($select, [ "PROJECT", "PROJECT_DATE_START", "PROJECT_DATE_FINISH" ]);
684 }
686 {
687 $select = array_merge($select, [ "LANDING" ]);
688 }
690 {
691 $select = array_merge($select, [ "SCRUM_OWNER_ID", "SCRUM_MASTER_ID", "SCRUM_SPRINT_DURATION", "SCRUM_TASK_RESPONSIBLE" ]);
692 }
693 $res = CSocNetGroup::getList(
694 [],
695 $filter,
696 false,
697 false,
698 $select
699 );
700 if ($result = $res->getNext())
701 {
702 if (
703 defined('BX_COMP_MANAGED_CACHE')
704 && $cache
705 )
706 {
707 $CACHE_MANAGER->StartTagCache($cachePath);
708 $CACHE_MANAGER->RegisterTag('sonet_group_' . $id);
709 $CACHE_MANAGER->RegisterTag('sonet_group');
710 }
711
712 if (!empty($result['NAME']))
713 {
714 $result['NAME'] = Emoji::decode($result['NAME']);
715 }
716 if (!empty($result['DESCRIPTION']))
717 {
718 $result['DESCRIPTION'] = Emoji::decode($result['DESCRIPTION']);
719 }
720
721 $result['NAME_FORMATTED'] = $result['NAME'];
722
723 if (($options['getSites'] ?? false))
724 {
725 $result['SITE_LIST'] = [];
726 $res = CSocNetGroup::getSite($id);
727 while ($groupSiteFields = $res->fetch())
728 {
729 $result['SITE_LIST'][] = $groupSiteFields['LID'];
730 }
731 }
732
733 $result['SCRUM'] = (isset($result['SCRUM_MASTER_ID']) && (int)$result['SCRUM_MASTER_ID'] > 0 ? 'Y' : 'N');
734 $result['SCRUM_PROJECT'] = $result['SCRUM'];
735 }
736 else
737 {
738 $result = false;
739 }
740
741 if ($cache)
742 {
743 $cacheData = [
744 'FIELDS' => $result,
745 ];
746 $cache->EndDataCache($cacheData);
747 if (defined('BX_COMP_MANAGED_CACHE'))
748 {
749 $CACHE_MANAGER->EndTagCache();
750 }
751 }
752 }
753
754 if (!is_array($sonetGroupCache))
755 {
756 $sonetGroupCache = [];
757 }
758 if (
759 !array_key_exists($id, $sonetGroupCache)
760 || !is_array($sonetGroupCache[$id])
761 )
762 {
763 $sonetGroupCache[$id] = [];
764 }
765 $sonetGroupCache[$id][$staticCacheKey] = $result;
766
767 self::setStaticCache($sonetGroupCache);
768
769 return $result;
770 }
771
772 protected static function getStaticCache(): array
773 {
774 return self::$staticCache;
775 }
776
777 protected static function setStaticCache($cache = array())
778 {
779 self::$staticCache = $cache;
780 }
781
782 /***************************************/
783 /********** COMMON METHODS ***********/
784 /***************************************/
785 public static function CanUserInitiate($userID, $groupID): bool
786 {
787 $userID = intval($userID);
788 $groupID = intval($groupID);
789 if ($groupID <= 0)
790 return false;
791
792 $userRoleInGroup = CSocNetUserToGroup::GetUserRole($userID, $groupID);
793 if ($userRoleInGroup == false)
794 return false;
795
796 $arGroup = CSocNetGroup::GetById($groupID);
797 if ($arGroup == false)
798 return false;
799
800 if ($arGroup["INITIATE_PERMS"] == SONET_ROLES_MODERATOR)
801 {
802 if ($userRoleInGroup == SONET_ROLES_MODERATOR || $userRoleInGroup == SONET_ROLES_OWNER)
803 return true;
804 else
805 return false;
806 }
807 elseif ($arGroup["INITIATE_PERMS"] == SONET_ROLES_USER)
808 {
809 if ($userRoleInGroup == SONET_ROLES_MODERATOR || $userRoleInGroup == SONET_ROLES_OWNER || $userRoleInGroup == SONET_ROLES_USER)
810 return true;
811 else
812 return false;
813 }
814 elseif ($arGroup["INITIATE_PERMS"] == SONET_ROLES_OWNER)
815 {
816 if ($userRoleInGroup == SONET_ROLES_OWNER)
817 return true;
818 else
819 return false;
820 }
821
822 return false;
823 }
824
825 public static function CanUserViewGroup($userID, $groupID): bool
826 {
827 $userID = intval($userID);
828 $groupID = intval($groupID);
829 if ($groupID <= 0)
830 return false;
831
832 $arGroup = CSocNetGroup::GetById($groupID);
833 if ($arGroup == false)
834 return false;
835
836 if ($arGroup["VISIBLE"] == "Y")
837 return true;
838
839 $userRoleInGroup = CSocNetUserToGroup::GetUserRole($userID, $groupID);
840 if ($userRoleInGroup == false)
841 return false;
842
843 return in_array($userRoleInGroup, array(SONET_ROLES_OWNER, SONET_ROLES_MODERATOR, SONET_ROLES_USER));
844 }
845
846 public static function CanUserReadGroup($userID, $groupID): bool
847 {
848 $userID = intval($userID);
849 $groupID = intval($groupID);
850 if ($groupID <= 0)
851 return false;
852
853 $arGroup = CSocNetGroup::GetById($groupID);
854 if ($arGroup == false)
855 return false;
856
857 if ($arGroup["OPENED"] == "Y")
858 return true;
859
860 $userRoleInGroup = CSocNetUserToGroup::GetUserRole($userID, $groupID);
861 if ($userRoleInGroup == false)
862 return false;
863
864 return in_array($userRoleInGroup, array(SONET_ROLES_OWNER, SONET_ROLES_MODERATOR, SONET_ROLES_USER));
865 }
866
867 /***************************************/
868 /************ ACTIONS ****************/
869 /***************************************/
870 public static function createGroup($ownerID, $arFields, $bAutoSubscribe = true)
871 {
872 global $APPLICATION, $DB;
873
874 $ownerID = (int)$ownerID;
875 if ($ownerID <= 0)
876 {
877 $APPLICATION->ThrowException(GetMessage("SONET_UR_EMPTY_OWNERID").". ", "ERROR_OWNERID");
878 return false;
879 }
880
881 if (!isset($arFields) || !is_array($arFields))
882 {
883 $APPLICATION->ThrowException(GetMessage("SONET_UR_EMPTY_FIELDS").". ", "ERROR_FIELDS");
884 return false;
885 }
886
887 if (!empty($arFields['SCRUM_MASTER_ID']) && CModule::includeModule("tasks"))
888 {
889 $isScrumLimitExceeded = ScrumLimit::isLimitExceeded() || !ScrumLimit::isFeatureEnabled();
890 if (ScrumLimit::canTurnOnTrial())
891 {
892 $isScrumLimitExceeded = false;
893 }
894 if ($isScrumLimitExceeded)
895 {
896 $APPLICATION->ThrowException("Scrum limit exceeded");
897
898 return false;
899 }
900 }
901 elseif (isset($arFields['TYPE']) && $arFields['TYPE'] === 'collab')
902 {
903 if (!\Bitrix\Socialnetwork\Collab\CollabFeature::isFeatureEnabled())
904 {
905 $APPLICATION->ThrowException('Collab feature not available');
906
907 return false;
908 }
909 }
910 elseif (empty($arFields['SCRUM_MASTER_ID']) && CModule::includeModule("tasks"))
911 {
912 $isProjectLimitExceeded = !ProjectLimit::isFeatureEnabled();
913 if (ProjectLimit::canTurnOnTrial())
914 {
915 $isProjectLimitExceeded = false;
916 }
917 if ($isProjectLimitExceeded)
918 {
919 $APPLICATION->ThrowException("Project limit exceeded");
920
921 return false;
922 }
923 }
924
925 $DB->StartTransaction();
926
927 if (!isset($arFields["DATE_CREATE"]))
928 {
929 $arFields["=DATE_CREATE"] = CDatabase::currentTimeFunction();
930 }
931
932 if (!isset($arFields["DATE_UPDATE"]))
933 {
934 $arFields["=DATE_UPDATE"] = CDatabase::currentTimeFunction();
935 }
936
937 if (!isset($arFields["DATE_ACTIVITY"]))
938 {
939 $arFields["=DATE_ACTIVITY"] = CDatabase::currentTimeFunction();
940 }
941
942 if (!isset($arFields['TYPE']))
943 {
944 $arFields['TYPE'] = static::getTypeByFields($arFields);
945 }
946
947 $arFields["ACTIVE"] = "Y";
948 $arFields["OWNER_ID"] = $ownerID;
949
950 if (!is_set($arFields, "SPAM_PERMS") || $arFields["SPAM_PERMS"] == '')
951 {
952 $arFields["SPAM_PERMS"] = SONET_ROLES_OWNER;
953 }
954
955 $groupID = CSocNetGroup::add($arFields);
956
957 if (
958 !$groupID
959 || $groupID <= 0
960 )
961 {
962 $errorMessage = $errorID = "";
963 if ($e = $APPLICATION->getException())
964 {
965 $errorMessage = $e->GetString();
966 $errorID = $e->GetID();
967
968 if (
969 $errorID == ''
970 && isset($e->messages)
971 && is_array($e->messages)
972 && is_array($e->messages[0])
973 && array_key_exists("id", $e->messages[0])
974 )
975 {
976 $errorID = $e->messages[0]["id"];
977 }
978 }
979
980 if ($errorMessage == '')
981 {
982 $errorMessage = GetMessage("SONET_UR_ERROR_CREATE_GROUP").". ";
983 }
984
985 if ($errorID == '')
986 {
987 $errorID = "ERROR_CREATE_GROUP";
988 }
989
990 $APPLICATION->ThrowException($errorMessage, $errorID);
991 $DB->Rollback();
992
993 return false;
994 }
995
996 $arFields1 = array(
997 "USER_ID" => $ownerID,
998 "GROUP_ID" => $groupID,
999 "ROLE" => SONET_ROLES_OWNER,
1000 "=DATE_CREATE" => $DB->CurrentTimeFunction(),
1001 "=DATE_UPDATE" => $DB->CurrentTimeFunction(),
1002 "INITIATED_BY_TYPE" => SONET_INITIATED_BY_USER,
1003 "INITIATED_BY_USER_ID" => $ownerID,
1004 "MESSAGE" => false
1005 );
1006
1007 if (!CSocNetUserToGroup::Add($arFields1))
1008 {
1009 $errorMessage = "";
1010 if ($e = $APPLICATION->GetException())
1011 {
1012 $errorMessage = $e->GetString();
1013 }
1014
1015 if ($errorMessage == '')
1016 {
1017 $errorMessage = GetMessage("SONET_UR_ERROR_CREATE_U_GROUP").". ";
1018 }
1019
1020 $APPLICATION->ThrowException($errorMessage, "ERROR_CREATE_GROUP");
1021 $DB->Rollback();
1022 return false;
1023 }
1024
1025 if ($bAutoSubscribe)
1026 {
1028 }
1029
1030 CSocNetSubscription::Set($ownerID, "SG".$groupID, "Y");
1031
1032 $DB->Commit();
1033
1034 return $groupID;
1035 }
1036
1037 /***************************************/
1038 /************* UTILITIES *************/
1039 /***************************************/
1040 public static function __ValidateID($ID): bool
1041 {
1042 global $APPLICATION;
1043
1044 if (intval($ID)."|" == $ID."|")
1045 return true;
1046
1047 $APPLICATION->ThrowException(GetMessage("SONET_WRONG_PARAMETER_ID"), "ERROR_NO_ID");
1048 return false;
1049 }
1050
1051 public static function GetFilterOperation($key): array
1052 {
1053 $strNegative = "N";
1054 if (mb_substr($key, 0, 1) == "!")
1055 {
1056 $key = mb_substr($key, 1);
1057 $strNegative = "Y";
1058 }
1059
1060 $strOrNull = "N";
1061 if (mb_substr($key, 0, 1) == "+")
1062 {
1063 $key = mb_substr($key, 1);
1064 $strOrNull = "Y";
1065 }
1066
1067 if (mb_substr($key, 0, 2) == ">=")
1068 {
1069 $key = mb_substr($key, 2);
1070 $strOperation = ">=";
1071 }
1072 elseif (mb_substr($key, 0, 1) == ">")
1073 {
1074 $key = mb_substr($key, 1);
1075 $strOperation = ">";
1076 }
1077 elseif (mb_substr($key, 0, 2) == "<=")
1078 {
1079 $key = mb_substr($key, 2);
1080 $strOperation = "<=";
1081 }
1082 elseif (mb_substr($key, 0, 1) == "<")
1083 {
1084 $key = mb_substr($key, 1);
1085 $strOperation = "<";
1086 }
1087 elseif (mb_substr($key, 0, 1) == "@")
1088 {
1089 $key = mb_substr($key, 1);
1090 $strOperation = "IN";
1091 }
1092 elseif (mb_substr($key, 0, 1) == "~")
1093 {
1094 $key = mb_substr($key, 1);
1095 $strOperation = "LIKE";
1096 }
1097 elseif (mb_substr($key, 0, 1) == "%")
1098 {
1099 $key = mb_substr($key, 1);
1100 $strOperation = "QUERY";
1101 }
1102 else
1103 {
1104 $strOperation = "=";
1105 }
1106
1107 return array("FIELD" => $key, "NEGATIVE" => $strNegative, "OPERATION" => $strOperation, "OR_NULL" => $strOrNull);
1108 }
1109
1110 public static function PrepareSql(&$arFields, $arOrder, $arFilter, $arGroupBy, $arSelectFields, $arUF = array()): array
1111 {
1112 global $DB;
1113
1114 $obUserFieldsSql = false;
1115
1116 if (is_array($arUF) && array_key_exists("ENTITY_ID", $arUF))
1117 {
1118 $obUserFieldsSql = new CUserTypeSQL;
1119 $obUserFieldsSql->SetEntity($arUF["ENTITY_ID"], $arFields["ID"]["FIELD"]);
1120 $obUserFieldsSql->SetSelect($arSelectFields);
1121 $obUserFieldsSql->SetFilter($arFilter);
1122 $obUserFieldsSql->SetOrder($arOrder);
1123 }
1124
1125 $strSqlSelect = "";
1126 $strSqlFrom = "";
1127 $strSqlWhere = "";
1128 $strSqlGroupBy = "";
1129
1130 $arGroupByFunct = array("COUNT", "AVG", "MIN", "MAX", "SUM");
1131
1132 $arAlreadyJoined = array();
1133
1134 // GROUP BY -->
1135 if (is_array($arGroupBy) && count($arGroupBy)>0)
1136 {
1137 $arSelectFields = $arGroupBy;
1138 foreach ($arGroupBy as $key => $val)
1139 {
1140 $val = mb_strtoupper($val);
1141 $key = mb_strtoupper($key);
1142 if (array_key_exists($val, $arFields) && !in_array($key, $arGroupByFunct))
1143 {
1144 if ($strSqlGroupBy <> '')
1145 $strSqlGroupBy .= ", ";
1146 $strSqlGroupBy .= $arFields[$val]["FIELD"];
1147
1148 if (isset($arFields[$val]["FROM"])
1149 && $arFields[$val]["FROM"] <> ''
1150 && !in_array($arFields[$val]["FROM"], $arAlreadyJoined))
1151 {
1152 if ($strSqlFrom <> '')
1153 $strSqlFrom .= " ";
1154 $strSqlFrom .= $arFields[$val]["FROM"];
1155 $arAlreadyJoined[] = $arFields[$val]["FROM"];
1156 }
1157 }
1158 }
1159 }
1160 // <-- GROUP BY
1161
1162 // WHERE -->
1163 $arAlreadyJoinedOld = $arAlreadyJoined;
1164
1165 if (
1166 isset($arFilter['ID'])
1167 && is_array($arFilter['ID'])
1168 )
1169 {
1170 $arFilter['@ID'] = $arFilter['ID'];
1171 unset($arFilter['ID']);
1172 }
1173 if (
1174 isset($arFilter['!ID'])
1175 && is_array($arFilter['!ID'])
1176 )
1177 {
1178 $arFilter['!@ID'] = $arFilter['!ID'];
1179 unset($arFilter['!ID']);
1180 }
1181
1182 $strSqlWhere .= CSqlUtil::PrepareWhere($arFields, $arFilter, $arAlreadyJoined);
1183 $arAlreadyJoinedDiff = array_diff($arAlreadyJoined, $arAlreadyJoinedOld);
1184
1185 foreach($arAlreadyJoinedDiff as $from_tmp)
1186 {
1187 if ($strSqlFrom <> '')
1188 $strSqlFrom .= " ";
1189 $strSqlFrom .= $from_tmp;
1190 }
1191
1192 if ($obUserFieldsSql)
1193 {
1194 $r = $obUserFieldsSql->GetFilter();
1195 if($r <> '')
1196 $strSqlWhere .= ($strSqlWhere <> '' ? " AND" : "")." (".$r.") ";
1197 }
1198 // <-- WHERE
1199
1200 // ORDER BY -->
1201 $arSqlOrder = Array();
1202 foreach ($arOrder as $by => $order)
1203 {
1204 $by = mb_strtoupper($by);
1205 $order = mb_strtoupper($order);
1206
1207 if ($order != "ASC")
1208 $order = "DESC";
1209 else
1210 $order = "ASC";
1211
1212 if (array_key_exists($by, $arFields))
1213 {
1214 if ($arFields[$by]["TYPE"] == "datetime" || $arFields[$by]["TYPE"] == "date")
1215 {
1216 $arSqlOrder[] = " ".$by."_X1 ".$order." ";
1217 if (!is_array($arSelectFields) || !in_array($by, $arSelectFields))
1218 $arSelectFields[] = $by;
1219 }
1220 else
1221 $arSqlOrder[] = " ".$arFields[$by]["FIELD"]." ".$order." ";
1222
1223 if (isset($arFields[$by]["FROM"])
1224 && $arFields[$by]["FROM"] <> ''
1225 && !in_array($arFields[$by]["FROM"], $arAlreadyJoined))
1226 {
1227 if ($strSqlFrom <> '')
1228 $strSqlFrom .= " ";
1229 $strSqlFrom .= $arFields[$by]["FROM"];
1230 $arAlreadyJoined[] = $arFields[$by]["FROM"];
1231 }
1232 }
1233 elseif($obUserFieldsSql && $s = $obUserFieldsSql->GetOrder($by))
1234 $arSqlOrder[$by] = " ".$s." ".$order." ";
1235 }
1236
1237 $strSqlOrderBy = "";
1238 DelDuplicateSort($arSqlOrder);
1239 $tmp_count = count($arSqlOrder);
1240 for ($i=0; $i < $tmp_count; $i++)
1241 {
1242 if ($strSqlOrderBy <> '')
1243 $strSqlOrderBy .= ", ";
1244
1245 if($DB->type == "ORACLE")
1246 {
1247 if(mb_substr($arSqlOrder[$i], -3) == "ASC")
1248 $strSqlOrderBy .= $arSqlOrder[$i]." NULLS FIRST";
1249 else
1250 $strSqlOrderBy .= $arSqlOrder[$i]." NULLS LAST";
1251 }
1252 else
1253 $strSqlOrderBy .= $arSqlOrder[$i];
1254 }
1255 // <-- ORDER BY
1256
1257 // SELECT -->
1258 $arFieldsKeys = array_keys($arFields);
1259
1260 if (is_array($arGroupBy) && count($arGroupBy)==0)
1261 $strSqlSelect = "COUNT(%%_DISTINCT_%% ".$arFields[$arFieldsKeys[0]]["FIELD"].") as CNT ";
1262 else
1263 {
1264 if (isset($arSelectFields) && !is_array($arSelectFields) && is_string($arSelectFields) && $arSelectFields <> '' && array_key_exists($arSelectFields, $arFields))
1265 $arSelectFields = array($arSelectFields);
1266
1267 if (!isset($arSelectFields)
1268 || !is_array($arSelectFields)
1269 || count($arSelectFields) <= 0
1270 || in_array("*", $arSelectFields))
1271 {
1272 $tmp_count = count($arFieldsKeys);
1273 for ($i = 0; $i < $tmp_count; $i++)
1274 {
1275 if (isset($arFields[$arFieldsKeys[$i]]["WHERE_ONLY"])
1276 && $arFields[$arFieldsKeys[$i]]["WHERE_ONLY"] == "Y")
1277 continue;
1278
1279 if ($strSqlSelect <> '')
1280 $strSqlSelect .= ", ";
1281
1282 if ($arFields[$arFieldsKeys[$i]]["TYPE"] == "datetime")
1283 {
1284 if (array_key_exists($arFieldsKeys[$i], $arOrder))
1285 $strSqlSelect .= $arFields[$arFieldsKeys[$i]]["FIELD"]." as ".$arFieldsKeys[$i]."_X1, ";
1286
1287 $strSqlSelect .= $DB->DateToCharFunction($arFields[$arFieldsKeys[$i]]["FIELD"])." as ".$arFieldsKeys[$i];
1288 }
1289 elseif ($arFields[$arFieldsKeys[$i]]["TYPE"] == "date")
1290 {
1291 if (array_key_exists($arFieldsKeys[$i], $arOrder))
1292 $strSqlSelect .= $arFields[$arFieldsKeys[$i]]["FIELD"]." as ".$arFieldsKeys[$i]."_X1, ";
1293
1294 $strSqlSelect .= $DB->DateToCharFunction($arFields[$arFieldsKeys[$i]]["FIELD"], "SHORT")." as ".$arFieldsKeys[$i];
1295 }
1296 else
1297 $strSqlSelect .= $arFields[$arFieldsKeys[$i]]["FIELD"]." as ".$arFieldsKeys[$i];
1298
1299 if (isset($arFields[$arFieldsKeys[$i]]["FROM"])
1300 && $arFields[$arFieldsKeys[$i]]["FROM"] <> ''
1301 && !in_array($arFields[$arFieldsKeys[$i]]["FROM"], $arAlreadyJoined))
1302 {
1303 if ($strSqlFrom <> '')
1304 $strSqlFrom .= " ";
1305 $strSqlFrom .= $arFields[$arFieldsKeys[$i]]["FROM"];
1306 $arAlreadyJoined[] = $arFields[$arFieldsKeys[$i]]["FROM"];
1307 }
1308 }
1309 }
1310 else
1311 {
1312 foreach ($arSelectFields as $key => $val)
1313 {
1314 $val = mb_strtoupper($val);
1315 $key = mb_strtoupper($key);
1316 if (array_key_exists($val, $arFields))
1317 {
1318 if ($strSqlSelect <> '')
1319 $strSqlSelect .= ", ";
1320
1321 if (in_array($key, $arGroupByFunct))
1322 $strSqlSelect .= $key."(".$arFields[$val]["FIELD"].") as ".$val;
1323 else
1324 {
1325 if (($arFields[$val]["TYPE"] ?? null) === "datetime")
1326 {
1327 if (array_key_exists($val, $arOrder))
1328 $strSqlSelect .= $arFields[$val]["FIELD"]." as ".$val."_X1, ";
1329
1330 $strSqlSelect .= $DB->DateToCharFunction($arFields[$val]["FIELD"])." as ".$val;
1331 }
1332 elseif (($arFields[$val]["TYPE"] ?? null) === "date")
1333 {
1334 if (array_key_exists($val, $arOrder))
1335 $strSqlSelect .= $arFields[$val]["FIELD"]." as ".$val."_X1, ";
1336
1337 $strSqlSelect .= $DB->DateToCharFunction($arFields[$val]["FIELD"], "SHORT")." as ".$val;
1338 }
1339 else
1340 $strSqlSelect .= $arFields[$val]["FIELD"]." as ".$val;
1341 }
1342
1343 if (isset($arFields[$val]["FROM"])
1344 && $arFields[$val]["FROM"] <> ''
1345 && !in_array($arFields[$val]["FROM"], $arAlreadyJoined))
1346 {
1347 if ($strSqlFrom <> '')
1348 $strSqlFrom .= " ";
1349 $strSqlFrom .= $arFields[$val]["FROM"];
1350 $arAlreadyJoined[] = $arFields[$val]["FROM"];
1351 }
1352 }
1353 }
1354 }
1355
1356 if ($obUserFieldsSql)
1357 $strSqlSelect .= ($strSqlSelect == '' ? $arFields["ID"]["FIELD"] : "").$obUserFieldsSql->GetSelect();
1358
1359 if ($strSqlGroupBy <> '')
1360 {
1361 if ($strSqlSelect <> '')
1362 {
1363 $strSqlSelect .= ", ";
1364 }
1365 $strSqlSelect .= "COUNT(%%_DISTINCT_%% ".$arFields[$arFieldsKeys[0]]["FIELD"].") as CNT";
1366 }
1367 else
1368 {
1369 $strSqlSelect = "%%_DISTINCT_%% ".$strSqlSelect;
1370 }
1371 }
1372 // <-- SELECT
1373
1374 if ($obUserFieldsSql)
1375 {
1376 $strSqlFrom .= " ".$obUserFieldsSql->GetJoin($arFields["ID"]["FIELD"]);
1377 }
1378
1379 return array(
1380 "SELECT" => $strSqlSelect,
1381 "FROM" => $strSqlFrom,
1382 "WHERE" => $strSqlWhere,
1383 "GROUPBY" => $strSqlGroupBy,
1384 "ORDERBY" => $strSqlOrderBy
1385 );
1386 }
1387
1388 /***************************************/
1389 /************* *************/
1390 /***************************************/
1391
1392 public static function GetSite($group_id)
1393 {
1394 global $DB;
1395
1396 if (is_array($group_id))
1397 {
1398 if (empty($group_id))
1399 {
1400 return false;
1401 }
1402
1403 $strVal = "";
1404
1405 foreach ($group_id as $val)
1406 {
1407 if ($strVal <> '')
1408 {
1409 $strVal .= ', ';
1410 }
1411 $strVal .= intval($val);
1412 }
1413 $strSql = "SELECT L.*, SGS.* FROM b_sonet_group_site SGS, b_lang L WHERE L.LID=SGS.SITE_ID AND SGS.GROUP_ID IN (".$strVal.")";
1414 }
1415 else
1416 {
1417 $strSql = "SELECT L.*, SGS.* FROM b_sonet_group_site SGS, b_lang L WHERE L.LID=SGS.SITE_ID AND SGS.GROUP_ID=".intval($group_id);
1418 }
1419
1420 return $DB->Query($strSql);
1421 }
1422
1423 public static function GetDefaultSiteId($groupId, $siteId = false)
1424 {
1425 $groupSiteId = ($siteId ?: SITE_ID);
1426
1427 if (CModule::IncludeModule("extranet"))
1428 {
1429 $extranetSiteId = CExtranet::GetExtranetSiteID();
1430
1431 $rsGroupSite = CSocNetGroup::GetSite($groupId);
1432 while ($arGroupSite = $rsGroupSite->Fetch())
1433 {
1434 if (
1435 !$extranetSiteId
1436 || $arGroupSite["LID"] != $extranetSiteId
1437 )
1438 {
1439 $groupSiteId = $arGroupSite["LID"];
1440 break;
1441 }
1442 }
1443 }
1444
1445 return $groupSiteId;
1446 }
1447
1448 public static function OnBeforeLangDelete($lang): bool
1449 {
1450 global $APPLICATION, $DB;
1451 $r = $DB->Query("
1452 SELECT GROUP_ID
1453 FROM b_sonet_group_site
1454 WHERE SITE_ID='".$DB->ForSQL($lang, 2)."'
1455 ORDER BY GROUP_ID
1456 ");
1457 $arSocNetGroups = array();
1458 while($a = $r->Fetch())
1459 $arSocNetGroups[] = $a["GROUP_ID"];
1460 if(count($arSocNetGroups) > 0)
1461 {
1462 $APPLICATION->ThrowException(GetMessage("SONET_GROUP_SITE_LINKS_EXISTS", array("#ID_LIST#" => implode(", ", $arSocNetGroups))));
1463 return false;
1464 }
1465 else
1466 return true;
1467 }
1468
1469 public static function SearchIndex($groupId, $arSiteID = array(), $arGroupOld = array()): void
1470 {
1471 if (intval($groupId) <= 0)
1472 {
1473 return;
1474 }
1475
1476 if (CModule::IncludeModule("search"))
1477 {
1478 $arGroupNew = CSocNetGroup::GetByID($groupId);
1479 if ($arGroupNew)
1480 {
1481 if (
1482 $arGroupNew["ACTIVE"] == "N"
1483 && isset($arGroupOld)
1484 && is_array($arGroupOld)
1485 && isset($arGroupOld["ACTIVE"])
1486 && $arGroupOld["ACTIVE"] == "Y"
1487 )
1488 {
1489 CSearch::DeleteIndex("socialnetwork", "G".$groupId);
1490 }
1491 elseif ($arGroupNew["ACTIVE"] == "Y")
1492 {
1493 $BODY = CSocNetTextParser::killAllTags($arGroupNew["~DESCRIPTION"]);
1494 $BODY .= $GLOBALS["USER_FIELD_MANAGER"]->OnSearchIndex("SONET_GROUP", $groupId);
1495
1496 $arSearchIndexSiteID = array();
1497 if (
1498 is_array($arSiteID)
1499 && !empty($arSiteID)
1500 )
1501 {
1502 foreach ($arSiteID as $site_id_tmp)
1503 {
1504 $arSearchIndexSiteID[$site_id_tmp] = str_replace("#group_id#", $groupId, Path::get('group_path_template', $site_id_tmp));
1505 }
1506 }
1507 else
1508 {
1509 $rsGroupSite = CSocNetGroup::GetSite($groupId);
1510 while ($arGroupSite = $rsGroupSite->Fetch())
1511 {
1512 $arSearchIndexSiteID[$arGroupSite["LID"]] = str_replace("#group_id#", $groupId, Path::get('group_path_template', $arGroupSite['LID']));
1513 }
1514 }
1515
1516 $arSearchIndex = array(
1517 "SITE_ID" => $arSearchIndexSiteID,
1518 "LAST_MODIFIED" => $arGroupNew["DATE_ACTIVITY"],
1519 "PARAM1" => $arGroupNew["SUBJECT_ID"],
1520 "PARAM2" => $groupId,
1521 "PARAM3" => "GROUP",
1522 "PERMISSIONS" => (
1523 $arGroupNew["VISIBLE"] == "Y"?
1524 array('G2')://public
1525 array(
1526 'SG'.$groupId.'_A',//admins
1527 'SG'.$groupId.'_E',//moderators
1528 'SG'.$groupId.'_K',//members
1529 )
1530 ),
1531 "PARAMS" =>array(
1532 "socnet_group" => $groupId,
1533 "entity" => "socnet_group",
1534 ),
1535 "TITLE" => $arGroupNew["~NAME"],
1536 "BODY" => $BODY,
1537 "TAGS" => $arGroupNew["~KEYWORDS"],
1538 );
1539
1540 CSearch::Index("socialnetwork", "G".$groupId, $arSearchIndex, True);
1541 }
1542 }
1543 }
1544 }
1545
1546 public static function ConfirmAllRequests($groupId, $bAutoSubscribe = true, $currentUserId = 0)
1547 {
1548 $dbRequests = CSocNetUserToGroup::GetList(
1549 array(),
1550 array(
1551 "GROUP_ID" => $groupId,
1552 "ROLE" => SONET_ROLES_REQUEST,
1553 "INITIATED_BY_TYPE" => SONET_INITIATED_BY_USER
1554 ),
1555 false,
1556 false,
1557 array("ID")
1558 );
1559 if ($dbRequests)
1560 {
1561 $arIDs = array();
1562 while ($arRequests = $dbRequests->GetNext())
1563 {
1564 $arIDs[] = $arRequests["ID"];
1565 }
1566
1567 if (!$currentUserId)
1568 {
1570 }
1571
1572 CSocNetUserToGroup::ConfirmRequestToBeMember(
1573 $currentUserId,
1574 $groupId,
1575 $arIDs,
1576 $bAutoSubscribe,
1577 );
1578 }
1579 }
1580
1581 private static function getTypeByFields(array $fields): Type
1582 {
1583 if (isset($fields['SCRUM_MASTER_ID']))
1584 {
1585 return Type::Scrum;
1586 }
1587
1588 if (($fields['PROJECT'] ?? 'N') === 'Y')
1589 {
1590 return Type::Project;
1591 }
1592
1593 return Type::getDefault();
1594 }
1595
1596}
global $APPLICATION
Определения include.php:80
$strVal
Определения options.php:1786
$arResult
Определения generate_coupon.php:16
static getValue($name)
Определения configuration.php:24
Определения loader.php:13
static includeModule($moduleName)
Определения loader.php:67
static isModuleInstalled($moduleName)
Определения modulemanager.php:125
Определения emoji.php:10
static encode($text)
Определения emoji.php:17
static decode($text)
Определения emoji.php:24
Определения tag.php:9
static get(string $key='', $siteId=SITE_ID)
Определения path.php:17
static getCurrentUserId()
Определения user.php:18
static addEvent(string $type, array $data)
Определения service.php:45
static deleteByGroupId($params=array())
Определения workgrouptag.php:54
static DeleteIndex($MODULE_ID, $ITEM_ID=false, $PARAM1=false, $PARAM2=false, $SITE_ID=false)
Определения search.php:2922
static Index($MODULE_ID, $ITEM_ID, $arFields, $bOverWrite=false, $SEARCH_SESS_ID='')
Определения search.php:1302
Определения group.php:23
static getById($id, $checkPermissions=false, array $options=[])
Определения group.php:603
static PrepareSql(&$arFields, $arOrder, $arFilter, $arGroupBy, $arSelectFields, $arUF=array())
Определения group.php:1110
static GetFilterOperation($key)
Определения group.php:1051
static $staticCache
Определения group.php:24
static Delete($ID)
Определения group.php:273
static SetStat($ID, int $currentUserId=0)
Определения group.php:533
static CanUserInitiate($userID, $groupID)
Определения group.php:785
static setStaticCache($cache=array())
Определения group.php:777
static CanUserReadGroup($userID, $groupID)
Определения group.php:846
static ConfirmAllRequests($groupId, $bAutoSubscribe=true, $currentUserId=0)
Определения group.php:1546
static CheckFields($ACTION, &$arFields, $ID=0)
Определения group.php:29
static getStaticCache()
Определения group.php:772
static GetSite($group_id)
Определения group.php:1392
static createGroup($ownerID, $arFields, $bAutoSubscribe=true)
Определения group.php:870
static GetDefaultSiteId($groupId, $siteId=false)
Определения group.php:1423
static SetLastActivity($ID, $date=false)
Определения group.php:573
static OnBeforeLangDelete($lang)
Определения group.php:1448
static __ValidateID($ID)
Определения group.php:1040
static SearchIndex($groupId, $arSiteID=array(), $arGroupOld=array())
Определения group.php:1469
static DeleteNoDemand($userID)
Определения group.php:502
static CanUserViewGroup($userID, $groupID)
Определения group.php:825
static AutoSubscribe($userID, $entityType, $entityID)
Определения log_events.php:231
Определения cache.php:11
static DeleteSystemEventsByGroupID($group_id=false)
Определения log.php:1223
static GetList($arOrder=Array("ID"=> "DESC"), $arFilter=Array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array(), $arParams=array())
Определения log.php:338
static killAllTags($text)
Определения functions.php:428
static PrepareWhere(&$arFields, &$arFilter, &$arJoins)
Определения sql_util.php:402
Определения usertypesql.php:4
SetEntity($entity_id, $ID)
Определения usertypesql.php:16
global $CACHE_MANAGER
Определения clear_component_cache.php:7
$options
Определения commerceml2.php:49
$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
$result
Определения get_property_values.php:14
if($ajaxMode) $ID
Определения get_user.php:27
$select
Определения iblock_catalog_list.php:194
$filter
Определения iblock_catalog_list.php:54
while($arParentIBlockProperty=$dbParentIBlockProperty->Fetch()) $errorMessage
global $DB
Определения cron_frame.php:29
global $USER
Определения csv_new_run.php:40
$ACTION
Определения csv_new_setup.php:27
if(!defined('SITE_ID')) $lang
Определения include.php:91
$siteId
Определения ajax.php:8
ExecuteModuleEventEx($arEvent, $arParams=[])
Определения tools.php:5214
DelDuplicateSort(&$arSort)
Определения tools.php:2055
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
Определения tools.php:5177
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
Определения tools.php:3778
is_set($a, $k=false)
Определения tools.php:2133
GetMessage($name, $aReplace=null)
Определения tools.php:3397
Определения culture.php:9
Определения collection.php:2
$GLOBALS['____1690880296']
Определения license.php:1
$order
Определения payment.php:8
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
if(empty($signedUserToken)) $key
Определения quickway.php:257
$i
Определения factura.php:643
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
Определения waybill.php:936
else $a
Определения template.php:137
$val
Определения options.php:1793
const SONET_ROLES_USER
Определения include.php:31
const SONET_ENTITY_GROUP
Определения include.php:117
global $arSocNetAllowedSpamPerms
Определения include.php:105
const SONET_ROLES_REQUEST
Определения include.php:33
const SONET_ROLES_MODERATOR
Определения include.php:30
global $arSocNetAllowedInitiatePerms
Определения include.php:102
const SONET_ROLES_OWNER
Определения include.php:29
const SONET_INITIATED_BY_USER
Определения include.php:44
const SITE_ID
Определения sonet_set_content_view.php:12
$dbResult
Определения updtr957.php:3
$arFilter
Определения user_search.php:106
$fields
Определения yandex_run.php:501