1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
group.php
См. документацию.
1<?php
2
9
17
19{
21
22 public function Add($arFields)
23 {
24 global $APPLICATION;
25
26 if (!$this->CheckFields($arFields))
27 {
28 return false;
29 }
30
31 foreach (GetModuleEvents("main", "OnBeforeGroupAdd", true) as $arEvent)
32 {
33 $bEventRes = ExecuteModuleEventEx($arEvent, [&$arFields]);
34 if ($bEventRes === false)
35 {
36 if ($err = $APPLICATION->GetException())
37 {
38 $this->LAST_ERROR .= $err->GetString() . "<br>";
39 }
40 else
41 {
42 $this->LAST_ERROR .= "Unknown error in OnBeforeGroupAdd handler." . "<br>";
43 }
44 return false;
45 }
46 }
47
48 if (isset($arFields["ACTIVE"]) && $arFields["ACTIVE"] != "Y")
49 {
50 $arFields["ACTIVE"] = "N";
51 }
52
54
55 unset($fields['~ID']);
56 unset($fields['USER_ID']);
57
58 if (isset($arFields['~ID']))
59 {
60 $fields['ID'] = $arFields['~ID'];
61 }
62
63 $result = GroupTable::add($fields);
64 $ID = $result->getId();
65
66 if (!empty($arFields["USER_ID"]) && is_array($arFields["USER_ID"]))
67 {
68 static::AddUsersToGroup($ID, $arFields["USER_ID"]);
69 }
70
71 $arFields["ID"] = $ID;
72
73 foreach (GetModuleEvents("main", "OnAfterGroupAdd", true) as $arEvent)
74 {
76 }
77
78 if (COption::GetOptionString("main", "event_log_group_edit", "N") === "Y")
79 {
80 CEventLog::Log(CEventLog::SEVERITY_SECURITY, "GROUP_ADDED", "main", $ID);
81 }
82
83 return $ID;
84 }
85
86 protected static function AddUsersToGroup(int $groupId, array $users): array
87 {
88 $added = [];
89 foreach ($users as $user)
90 {
91 if (!is_array($user))
92 {
93 $user = ["USER_ID" => $user];
94 }
95 $userId = (int)($user["USER_ID"] ?? 0);
96
97 if ($userId > 0 && !isset($added[$userId]))
98 {
99 CUser::AppendUserGroup(
100 $userId,
101 [[
102 'GROUP_ID' => $groupId,
103 'DATE_ACTIVE_FROM' => $user['DATE_ACTIVE_FROM'] ?? null,
104 'DATE_ACTIVE_TO' => $user['DATE_ACTIVE_TO'] ?? null,
105 ]]
106 );
107 $added[$userId] = $userId;
108 }
109 }
110
111 return $added;
112 }
113
114 public static function GetDropDownList($strSqlSearch = "and ACTIVE='Y'", $strSqlOrder = "ORDER BY C_SORT, NAME, ID")
115 {
116 global $DB;
118 $helper = $connection->getSqlHelper();
119
120 $strSql = "
121 SELECT
122 ID as REFERENCE_ID,
123 " . $helper->getConcatFunction("NAME", "' ['", "ID", "']'") . " as REFERENCE
124 FROM
125 b_group
126 WHERE
127 1=1
128 $strSqlSearch
129 $strSqlOrder
130 ";
131 $res = $DB->Query($strSql);
132
133 return $res;
134 }
135
136 public static function GetList($by = 'c_sort', $order = 'asc', $arFilter = [], $SHOW_USERS_AMOUNT = "N")
137 {
138 global $DB;
140 $helper = $connection->getSqlHelper();
141
142 $arSqlSearch = $arSqlSearch_h = [];
143 $strSqlSearch_h = "";
144 if (is_array($arFilter))
145 {
146 foreach ($arFilter as $key => $val)
147 {
148 if (is_array($val))
149 {
150 if (empty($val))
151 {
152 continue;
153 }
154 }
155 else
156 {
157 if ((string)$val == '' || $val == "NOT_REF")
158 {
159 continue;
160 }
161 }
162 $key = strtoupper($key);
163 $match_value_set = array_key_exists($key . "_EXACT_MATCH", $arFilter);
164 switch ($key)
165 {
166 case "ID":
167 $match = ($match_value_set && $arFilter[$key . "_EXACT_MATCH"] == "N") ? "Y" : "N";
168 $arSqlSearch[] = GetFilterQuery("G.ID", $val, $match);
169 break;
170 case "TIMESTAMP_1":
171 $arSqlSearch[] = "G.TIMESTAMP_X >= FROM_UNIXTIME('" . MkDateTime(FmtDate($val, "D.M.Y"), "d.m.Y") . "')";
172 break;
173 case "TIMESTAMP_2":
174 $arSqlSearch[] = "G.TIMESTAMP_X <= FROM_UNIXTIME('" . MkDateTime(FmtDate($val, "D.M.Y") . " 23:59:59", "d.m.Y") . "')";
175 break;
176 case "ACTIVE":
177 $arSqlSearch[] = ($val == "Y") ? "G.ACTIVE='Y'" : "G.ACTIVE='N'";
178 break;
179 case "ADMIN":
180 if (COption::GetOptionString("main", "controller_member", "N") == "Y" && COption::GetOptionString("main", "~controller_limited_admin", "N") == "Y")
181 {
182 if ($val == "Y")
183 {
184 $arSqlSearch[] = "G.ID=0";
185 }
186 break;
187 }
188 else
189 {
190 $arSqlSearch[] = ($val == "Y") ? "G.ID=1" : "G.ID>1";
191 }
192 break;
193 case "NAME":
194 $match = ($match_value_set && $arFilter[$key . "_EXACT_MATCH"] == "Y") ? "N" : "Y";
195 $arSqlSearch[] = GetFilterQuery("G.NAME", $val, $match);
196 break;
197 case "STRING_ID":
198 $match = ($match_value_set && $arFilter[$key . "_EXACT_MATCH"] == "N") ? "Y" : "N";
199 $arSqlSearch[] = GetFilterQuery("G.STRING_ID", $val, $match);
200 break;
201 case "DESCRIPTION":
202 $match = ($match_value_set && $arFilter[$key . "_EXACT_MATCH"] == "Y") ? "N" : "Y";
203 $arSqlSearch[] = GetFilterQuery("G.DESCRIPTION", $val, $match);
204 break;
205 case "USERS_1":
206 $SHOW_USERS_AMOUNT = "Y";
207 $arSqlSearch_h[] = "USERS>=" . intval($val);
208 break;
209 case "USERS_2":
210 $SHOW_USERS_AMOUNT = "Y";
211 $arSqlSearch_h[] = "USERS<=" . intval($val);
212 break;
213 case "ANONYMOUS":
214 if ($val == 'Y' || $val == 'N')
215 {
216 $arSqlSearch[] = "G.ANONYMOUS='" . $val . "'";
217 }
218 break;
219 }
220 }
221 foreach ($arSqlSearch_h as $condition)
222 {
223 $strSqlSearch_h .= " and (" . $condition . ") ";
224 }
225 }
226
227 $by = strtolower($by);
228
229 if ($by == "id")
230 {
231 $strSqlOrder = " ORDER BY G.ID ";
232 }
233 elseif ($by == "active")
234 {
235 $strSqlOrder = " ORDER BY G.ACTIVE ";
236 }
237 elseif ($by == "timestamp_x")
238 {
239 $strSqlOrder = " ORDER BY G.TIMESTAMP_X ";
240 }
241 elseif ($by == "c_sort")
242 {
243 $strSqlOrder = " ORDER BY G.C_SORT ";
244 }
245 elseif ($by == "sort")
246 {
247 $strSqlOrder = " ORDER BY G.C_SORT, G.NAME, G.ID ";
248 }
249 elseif ($by == "name")
250 {
251 $strSqlOrder = " ORDER BY G.NAME ";
252 }
253 elseif ($by == "string_id")
254 {
255 $strSqlOrder = " ORDER BY G.STRING_ID ";
256 }
257 elseif ($by == "description")
258 {
259 $strSqlOrder = " ORDER BY G.DESCRIPTION ";
260 }
261 elseif ($by == "anonymous")
262 {
263 $strSqlOrder = " ORDER BY G.ANONYMOUS ";
264 }
265 elseif ($by == "dropdown")
266 {
267 $strSqlOrder = " ORDER BY C_SORT, NAME ";
268 }
269 elseif ($by == "users")
270 {
271 $strSqlOrder = " ORDER BY USERS ";
272 $SHOW_USERS_AMOUNT = "Y";
273 }
274 else
275 {
276 $strSqlOrder = " ORDER BY G.C_SORT ";
277 }
278
279 if (strtolower($order) == "desc")
280 {
281 $strSqlOrder .= " desc ";
282 }
283 else
284 {
285 $strSqlOrder .= " asc ";
286 }
287
288 $str_USERS = $str_TABLE = "";
289 if ($SHOW_USERS_AMOUNT == "Y")
290 {
291 $str_USERS = "count(distinct U.USER_ID) USERS,";
292 $str_TABLE = "LEFT JOIN b_user_group U ON (U.GROUP_ID=G.ID AND ((U.DATE_ACTIVE_FROM IS NULL) OR (U.DATE_ACTIVE_FROM <= " . $DB->CurrentTimeFunction() . ")) AND ((U.DATE_ACTIVE_TO IS NULL) OR (U.DATE_ACTIVE_TO >= " . $DB->CurrentTimeFunction() . ")))";
293 }
294 $strSqlSearch = GetFilterSqlSearch($arSqlSearch);
295 $strSql = "
296 SELECT
297 G.ID, G.ACTIVE, G.C_SORT, G.ANONYMOUS, G.NAME, G.DESCRIPTION, G.STRING_ID,
298 " . $str_USERS . "
299 G.ID REFERENCE_ID,
300 " . $helper->getConcatFunction("G.NAME", "' ['", "G.ID", "']'") . " REFERENCE,
301 " . $DB->DateToCharFunction("G.TIMESTAMP_X") . " TIMESTAMP_X
302 FROM
303 b_group G
304 " . $str_TABLE . "
305 WHERE
306 " . $strSqlSearch . "
307 GROUP BY
308 G.ID, G.ACTIVE, G.C_SORT, G.TIMESTAMP_X, G.ANONYMOUS, G.NAME, G.STRING_ID, G.DESCRIPTION
309 HAVING
310 1=1
311 " . $strSqlSearch_h . "
312 " . $strSqlOrder;
313
314 $res = $DB->Query($strSql);
315 $res->is_filtered = (IsFiltered($strSqlSearch) || $strSqlSearch_h <> '');
316 return $res;
317 }
318
319 //*************** COMMON UTILS *********************/
320 public static function GetFilterOperation($key)
321 {
322 $strNegative = "N";
323 if (str_starts_with($key, "!"))
324 {
325 $key = substr($key, 1);
326 $strNegative = "Y";
327 }
328
329 $strOrNull = "N";
330 if (str_starts_with($key, "+"))
331 {
332 $key = substr($key, 1);
333 $strOrNull = "Y";
334 }
335
336 if (str_starts_with($key, ">="))
337 {
338 $key = substr($key, 2);
339 $strOperation = ">=";
340 }
341 elseif (str_starts_with($key, ">"))
342 {
343 $key = substr($key, 1);
344 $strOperation = ">";
345 }
346 elseif (str_starts_with($key, "<="))
347 {
348 $key = substr($key, 2);
349 $strOperation = "<=";
350 }
351 elseif (str_starts_with($key, "<"))
352 {
353 $key = substr($key, 1);
354 $strOperation = "<";
355 }
356 elseif (str_starts_with($key, "@"))
357 {
358 $key = substr($key, 1);
359 $strOperation = "IN";
360 }
361 elseif (str_starts_with($key, "~"))
362 {
363 $key = substr($key, 1);
364 $strOperation = "LIKE";
365 }
366 elseif (str_starts_with($key, "%"))
367 {
368 $key = substr($key, 1);
369 $strOperation = "QUERY";
370 }
371 else
372 {
373 $strOperation = "=";
374 }
375
376 return ["FIELD" => $key, "NEGATIVE" => $strNegative, "OPERATION" => $strOperation, "OR_NULL" => $strOrNull];
377 }
378
379 public static function PrepareSql($arFields, $arOrder, $arFilter, $arGroupBy, $arSelectFields)
380 {
381 global $DB;
382
383 $strSqlSelect = "";
384 $strSqlFrom = "";
385 $strSqlWhere = "";
386 $strSqlGroupBy = "";
387
388 $arGroupByFunct = ["COUNT", "AVG", "MIN", "MAX", "SUM"];
389
390 $arAlreadyJoined = [];
391
392 // GROUP BY -->
393 if (is_array($arGroupBy) && !empty($arGroupBy))
394 {
395 $arSelectFields = $arGroupBy;
396 foreach ($arGroupBy as $key => $val)
397 {
398 $val = strtoupper($val);
399 $key = strtoupper($key);
400 if (array_key_exists($val, $arFields) && !in_array($key, $arGroupByFunct))
401 {
402 if ($strSqlGroupBy <> '')
403 {
404 $strSqlGroupBy .= ", ";
405 }
406 $strSqlGroupBy .= $arFields[$val]["FIELD"];
407
408 if (isset($arFields[$val]["FROM"])
409 && $arFields[$val]["FROM"] <> ''
410 && !in_array($arFields[$val]["FROM"], $arAlreadyJoined))
411 {
412 if ($strSqlFrom <> '')
413 {
414 $strSqlFrom .= " ";
415 }
416 $strSqlFrom .= $arFields[$val]["FROM"];
417 $arAlreadyJoined[] = $arFields[$val]["FROM"];
418 }
419 }
420 }
421 }
422 // <-- GROUP BY
423
424 // SELECT -->
425 $arFieldsKeys = array_keys($arFields);
426
427 if (is_array($arGroupBy) && empty($arGroupBy))
428 {
429 $strSqlSelect = "COUNT(%%_DISTINCT_%% " . $arFields[$arFieldsKeys[0]]["FIELD"] . ") as CNT ";
430 }
431 else
432 {
433 if (isset($arSelectFields) && is_string($arSelectFields) && $arSelectFields <> '' && array_key_exists($arSelectFields, $arFields))
434 {
435 $arSelectFields = [$arSelectFields];
436 }
437
438 if (empty($arSelectFields)
439 || !is_array($arSelectFields)
440 || in_array("*", $arSelectFields)
441 )
442 {
443 foreach ($arFields as $FIELD_ID => $arField)
444 {
445 if (isset($arField["WHERE_ONLY"])
446 && $arField["WHERE_ONLY"] == "Y")
447 {
448 continue;
449 }
450
451 if ($strSqlSelect <> '')
452 {
453 $strSqlSelect .= ", ";
454 }
455
456 if ($arField["TYPE"] == "datetime")
457 {
458 $strSqlSelect .= $DB->DateToCharFunction($arField["FIELD"]) . " as " . $FIELD_ID;
459 }
460 elseif ($arField["TYPE"] == "date")
461 {
462 $strSqlSelect .= $DB->DateToCharFunction($arField["FIELD"], "SHORT") . " as " . $FIELD_ID;
463 }
464 else
465 {
466 $strSqlSelect .= $arField["FIELD"] . " as " . $FIELD_ID;
467 }
468
469 if (isset($arField["FROM"])
470 && $arField["FROM"] <> ''
471 && !in_array($arField["FROM"], $arAlreadyJoined))
472 {
473 if ($strSqlFrom <> '')
474 {
475 $strSqlFrom .= " ";
476 }
477 $strSqlFrom .= $arField["FROM"];
478 $arAlreadyJoined[] = $arField["FROM"];
479 }
480 }
481 }
482 else
483 {
484 foreach ($arSelectFields as $key => $val)
485 {
486 $val = strtoupper($val);
487 $key = strtoupper($key);
488 if (array_key_exists($val, $arFields))
489 {
490 if ($strSqlSelect <> '')
491 {
492 $strSqlSelect .= ", ";
493 }
494
495 if (in_array($key, $arGroupByFunct))
496 {
497 $strSqlSelect .= $key . "(" . $arFields[$val]["FIELD"] . ") as " . $val;
498 }
499 else
500 {
501 if ($arFields[$val]["TYPE"] == "datetime")
502 {
503 $strSqlSelect .= $DB->DateToCharFunction($arFields[$val]["FIELD"]) . " as " . $val;
504 }
505 elseif ($arFields[$val]["TYPE"] == "date")
506 {
507 $strSqlSelect .= $DB->DateToCharFunction($arFields[$val]["FIELD"], "SHORT") . " as " . $val;
508 }
509 else
510 {
511 $strSqlSelect .= $arFields[$val]["FIELD"] . " as " . $val;
512 }
513 }
514
515 if (isset($arFields[$val]["FROM"])
516 && $arFields[$val]["FROM"] <> ''
517 && !in_array($arFields[$val]["FROM"], $arAlreadyJoined))
518 {
519 if ($strSqlFrom <> '')
520 {
521 $strSqlFrom .= " ";
522 }
523 $strSqlFrom .= $arFields[$val]["FROM"];
524 $arAlreadyJoined[] = $arFields[$val]["FROM"];
525 }
526 }
527 }
528 }
529
530 if ($strSqlGroupBy <> '')
531 {
532 if ($strSqlSelect <> '')
533 {
534 $strSqlSelect .= ", ";
535 }
536 $strSqlSelect .= "COUNT(%%_DISTINCT_%% " . $arFields[$arFieldsKeys[0]]["FIELD"] . ") as CNT";
537 }
538 else
539 {
540 $strSqlSelect = "%%_DISTINCT_%% " . $strSqlSelect;
541 }
542 }
543 // <-- SELECT
544
545 // WHERE -->
546 $arSqlSearch = [];
547
548 if (is_array($arFilter))
549 {
550 foreach ($arFilter as $key => $vals)
551 {
552 if (!is_array($vals))
553 {
554 $vals = [$vals];
555 }
556
557 $key_res = static::GetFilterOperation($key);
558 $key = $key_res["FIELD"];
559 $strNegative = $key_res["NEGATIVE"];
560 $strOperation = $key_res["OPERATION"];
561 $strOrNull = $key_res["OR_NULL"];
562
563 if (array_key_exists($key, $arFields))
564 {
565 $arSqlSearch_tmp = [];
566 foreach ($vals as $val)
567 {
568 if (isset($arFields[$key]["WHERE"]))
569 {
570 $arSqlSearch_tmp1 = call_user_func_array(
571 $arFields[$key]["WHERE"],
572 [$val, $key, $strOperation, $strNegative, $arFields[$key]["FIELD"], $arFields, $arFilter]
573 );
574 if ($arSqlSearch_tmp1 !== false)
575 {
576 $arSqlSearch_tmp[] = $arSqlSearch_tmp1;
577 }
578 }
579 else
580 {
581 if ($arFields[$key]["TYPE"] == "int")
582 {
583 if (intval($val) <= 0)
584 {
585 $arSqlSearch_tmp[] = ($strNegative == "Y" ? "NOT" : "") . "(" . $arFields[$key]["FIELD"] . " IS NULL OR " . $arFields[$key]["FIELD"] . " <= 0)";
586 }
587 else
588 {
589 $arSqlSearch_tmp[] = ($strNegative == "Y" ? " " . $arFields[$key]["FIELD"] . " IS NULL OR NOT " : "") . "(" . $arFields[$key]["FIELD"] . " " . $strOperation . " " . intval($val) . " )";
590 }
591 }
592 elseif ($arFields[$key]["TYPE"] == "double")
593 {
594 $val = str_replace(",", ".", $val);
595 if (DoubleVal($val) <= 0)
596 {
597 $arSqlSearch_tmp[] = ($strNegative == "Y" ? "NOT" : "") . "(" . $arFields[$key]["FIELD"] . " IS NULL OR " . $arFields[$key]["FIELD"] . " <= 0)";
598 }
599 else
600 {
601 $arSqlSearch_tmp[] = ($strNegative == "Y" ? " " . $arFields[$key]["FIELD"] . " IS NULL OR NOT " : "") . "(" . $arFields[$key]["FIELD"] . " " . $strOperation . " " . DoubleVal($val) . " )";
602 }
603 }
604 elseif ($arFields[$key]["TYPE"] == "string" || $arFields[$key]["TYPE"] == "char")
605 {
606 if ($strOperation == "QUERY")
607 {
608 $arSqlSearch_tmp[] = GetFilterQuery($arFields[$key]["FIELD"], $val);
609 }
610 else
611 {
612 if ((string)$val == '')
613 {
614 $arSqlSearch_tmp[] = ($strNegative == "Y" ? "NOT" : "") . "(" . $arFields[$key]["FIELD"] . " IS NULL OR LENGTH(" . $arFields[$key]["FIELD"] . ")<=0)";
615 }
616 else
617 {
618 $arSqlSearch_tmp[] = ($strNegative == "Y" ? " " . $arFields[$key]["FIELD"] . " IS NULL OR NOT " : "") . "(" . $arFields[$key]["FIELD"] . " " . $strOperation . " '" . $DB->ForSql($val) . "' )";
619 }
620 }
621 }
622 elseif ($arFields[$key]["TYPE"] == "datetime")
623 {
624 if ((string)$val == '')
625 {
626 $arSqlSearch_tmp[] = ($strNegative == "Y" ? "NOT" : "") . "(" . $arFields[$key]["FIELD"] . " IS NULL)";
627 }
628 else
629 {
630 $arSqlSearch_tmp[] = ($strNegative == "Y" ? " " . $arFields[$key]["FIELD"] . " IS NULL OR NOT " : "") . "(" . $arFields[$key]["FIELD"] . " " . $strOperation . " " . $DB->CharToDateFunction($DB->ForSql($val)) . ")";
631 }
632 }
633 elseif ($arFields[$key]["TYPE"] == "date")
634 {
635 if ((string)$val == '')
636 {
637 $arSqlSearch_tmp[] = ($strNegative == "Y" ? "NOT" : "") . "(" . $arFields[$key]["FIELD"] . " IS NULL)";
638 }
639 else
640 {
641 $arSqlSearch_tmp[] = ($strNegative == "Y" ? " " . $arFields[$key]["FIELD"] . " IS NULL OR NOT " : "") . "(" . $arFields[$key]["FIELD"] . " " . $strOperation . " " . $DB->CharToDateFunction($DB->ForSql($val), "SHORT") . ")";
642 }
643 }
644 }
645 }
646
647 if (isset($arFields[$key]["FROM"])
648 && $arFields[$key]["FROM"] <> ''
649 && !in_array($arFields[$key]["FROM"], $arAlreadyJoined))
650 {
651 if ($strSqlFrom <> '')
652 {
653 $strSqlFrom .= " ";
654 }
655 $strSqlFrom .= $arFields[$key]["FROM"];
656 $arAlreadyJoined[] = $arFields[$key]["FROM"];
657 }
658
659 $strSqlSearch_tmp = "";
660 foreach ($arSqlSearch_tmp as $condition)
661 {
662 if ($strSqlSearch_tmp != "")
663 {
664 $strSqlSearch_tmp .= ($strNegative == "Y" ? " AND " : " OR ");
665 }
666 $strSqlSearch_tmp .= "(" . $condition . ")";
667 }
668 if ($strOrNull == "Y")
669 {
670 if ($strSqlSearch_tmp != "")
671 {
672 $strSqlSearch_tmp .= ($strNegative == "Y" ? " AND " : " OR ");
673 }
674 $strSqlSearch_tmp .= "(" . $arFields[$key]["FIELD"] . " IS " . ($strNegative == "Y" ? "NOT " : "") . "NULL)";
675 }
676
677 if ($strSqlSearch_tmp != "")
678 {
679 $arSqlSearch[] = "(" . $strSqlSearch_tmp . ")";
680 }
681 }
682 }
683 }
684
685 foreach ($arSqlSearch as $condition)
686 {
687 if ($strSqlWhere != "")
688 {
689 $strSqlWhere .= " AND ";
690 }
691 $strSqlWhere .= "(" . $condition . ")";
692 }
693 // <-- WHERE
694
695 // ORDER BY -->
696 $arSqlOrder = [];
697 foreach ($arOrder as $by => $order)
698 {
699 $by = strtoupper($by);
700 $order = strtoupper($order);
701 if ($order != "ASC")
702 {
703 $order = "DESC";
704 }
705
706 if (array_key_exists($by, $arFields))
707 {
708 $arSqlOrder[] = " " . $arFields[$by]["FIELD"] . " " . $order . " ";
709
710 if (isset($arFields[$by]["FROM"])
711 && $arFields[$by]["FROM"] <> ''
712 && !in_array($arFields[$by]["FROM"], $arAlreadyJoined))
713 {
714 if ($strSqlFrom <> '')
715 {
716 $strSqlFrom .= " ";
717 }
718 $strSqlFrom .= $arFields[$by]["FROM"];
719 $arAlreadyJoined[] = $arFields[$by]["FROM"];
720 }
721 }
722 }
723
724 $strSqlOrderBy = implode(", ", $arSqlOrder);
725 // <-- ORDER BY
726
727 return [
728 "SELECT" => $strSqlSelect,
729 "FROM" => $strSqlFrom,
730 "WHERE" => $strSqlWhere,
731 "GROUPBY" => $strSqlGroupBy,
732 "ORDERBY" => $strSqlOrderBy,
733 ];
734 }
735
736 public static function GetListEx($arOrder = ["ID" => "DESC"], $arFilter = [], $arGroupBy = false, $arNavStartParams = false, $arSelectFields = [])
737 {
738 global $DB;
739
740 if (empty($arSelectFields))
741 {
742 $arSelectFields = ["ID", "TIMESTAMP_X", "ACTIVE", "C_SORT", "ANONYMOUS", "NAME", "DESCRIPTION"];
743 }
744
745 // FIELDS -->
746 $arFields = [
747 "ID" => ["FIELD" => "G.ID", "TYPE" => "int"],
748 "TIMESTAMP_X" => ["FIELD" => "G.TIMESTAMP_X", "TYPE" => "datetime"],
749 "ACTIVE" => ["FIELD" => "G.ACTIVE", "TYPE" => "char"],
750 "C_SORT" => ["FIELD" => "G.C_SORT", "TYPE" => "int"],
751 "ANONYMOUS" => ["FIELD" => "G.ANONYMOUS", "TYPE" => "char"],
752 "NAME" => ["FIELD" => "G.NAME", "TYPE" => "string"],
753 "STRING_ID" => ["FIELD" => "G.STRING_ID", "TYPE" => "string"],
754 "DESCRIPTION" => ["FIELD" => "G.DESCRIPTION", "TYPE" => "string"],
755 "USER_USER_ID" => ["FIELD" => "UG.USER_ID", "TYPE" => "int", "FROM" => "INNER JOIN b_user_group UG ON (G.ID = UG.GROUP_ID)"],
756 "USER_GROUP_ID" => ["FIELD" => "UG.GROUP_ID", "TYPE" => "string", "FROM" => "INNER JOIN b_user_group UG ON (G.ID = UG.GROUP_ID)"],
757 "USER_DATE_ACTIVE_FROM" => ["FIELD" => "UG.DATE_ACTIVE_FROM", "TYPE" => "datetime", "FROM" => "INNER JOIN b_user_group UG ON (G.ID = UG.GROUP_ID)"],
758 "USER_DATE_ACTIVE_TO" => ["FIELD" => "UG.DATE_ACTIVE_TO", "TYPE" => "datetime", "FROM" => "INNER JOIN b_user_group UG ON (G.ID = UG.GROUP_ID)"],
759 ];
760 // <-- FIELDS
761
762 $arSqls = static::PrepareSql($arFields, $arOrder, $arFilter, $arGroupBy, $arSelectFields);
763
764 $arSqls["SELECT"] = str_replace("%%_DISTINCT_%%", "DISTINCT", $arSqls["SELECT"]);
765
766 if (is_array($arGroupBy) && empty($arGroupBy))
767 {
768 $strSql =
769 "SELECT " . $arSqls["SELECT"] . " " .
770 "FROM b_group G " .
771 " " . $arSqls["FROM"] . " ";
772 if ($arSqls["WHERE"] <> '')
773 {
774 $strSql .= "WHERE " . $arSqls["WHERE"] . " ";
775 }
776 if ($arSqls["GROUPBY"] <> '')
777 {
778 $strSql .= "GROUP BY " . $arSqls["GROUPBY"] . " ";
779 }
780
781 $dbRes = $DB->Query($strSql);
782 if ($arRes = $dbRes->Fetch())
783 {
784 return $arRes["CNT"];
785 }
786 else
787 {
788 return false;
789 }
790 }
791
792 $strSql =
793 "SELECT " . $arSqls["SELECT"] . " " .
794 "FROM b_group G " .
795 " " . $arSqls["FROM"] . " ";
796 if ($arSqls["WHERE"] <> '')
797 {
798 $strSql .= "WHERE " . $arSqls["WHERE"] . " ";
799 }
800 if ($arSqls["GROUPBY"] <> '')
801 {
802 $strSql .= "GROUP BY " . $arSqls["GROUPBY"] . " ";
803 }
804 if ($arSqls["ORDERBY"] <> '')
805 {
806 $strSql .= "ORDER BY " . $arSqls["ORDERBY"] . " ";
807 }
808
809 if (is_array($arNavStartParams) && intval($arNavStartParams["nTopCount"]) <= 0)
810 {
811 $strSql_tmp =
812 "SELECT COUNT('x') as CNT " .
813 "FROM b_group G " .
814 " " . $arSqls["FROM"] . " ";
815 if ($arSqls["WHERE"] <> '')
816 {
817 $strSql_tmp .= "WHERE " . $arSqls["WHERE"] . " ";
818 }
819 if ($arSqls["GROUPBY"] <> '')
820 {
821 $strSql_tmp .= "GROUP BY " . $arSqls["GROUPBY"] . " ";
822 }
823
824 $dbRes = $DB->Query($strSql_tmp);
825 $cnt = 0;
826 if ($arSqls["GROUPBY"] == '')
827 {
828 if ($arRes = $dbRes->Fetch())
829 {
830 $cnt = $arRes["CNT"];
831 }
832 }
833 else
834 {
835 $cnt = $dbRes->SelectedRowsCount();
836 }
837
838 $dbRes = new CDBResult();
839 $dbRes->NavQuery($strSql, $cnt, $arNavStartParams);
840 }
841 else
842 {
843 if (is_array($arNavStartParams) && intval($arNavStartParams["nTopCount"]) > 0)
844 {
845 $strSql .= "LIMIT " . intval($arNavStartParams["nTopCount"]);
846 }
847 $dbRes = $DB->Query($strSql);
848 }
849
850 return $dbRes;
851 }
852
853 public static function GetByID($ID, $SHOW_USERS_AMOUNT = "N")
854 {
855 $params = [
856 'select' => ['ID', 'ACTIVE', 'C_SORT', 'ANONYMOUS', 'NAME', 'STRING_ID', 'DESCRIPTION', 'TIMESTAMP_X'],
857 ];
858
859 if ($SHOW_USERS_AMOUNT == "Y")
860 {
861 $params['select'][] = 'USERS';
862 $params['runtime'] = [new ExpressionField('USERS', 'COUNT(%s)', 'USER_GROUP.USER_ID')];
863 }
864 else
865 {
866 $params['select'][] = 'SECURITY_POLICY';
867 }
868
869 $result = GroupTable::getByPrimary($ID, $params);
870
871 return new CDBResult($result);
872 }
873
874 public function CheckFields($arFields, $ID = false)
875 {
876 $this->LAST_ERROR = "";
877
878 if (isset($arFields["NAME"]) && $arFields["NAME"] == '')
879 {
880 $this->LAST_ERROR .= GetMessage("BAD_GROUP_NAME") . "<br>";
881 }
882
883 if (is_array($arFields["USER_ID"]) && !empty($arFields["USER_ID"]))
884 {
885 if (is_array($arFields["USER_ID"][0]) && !empty($arFields["USER_ID"][0]))
886 {
887 foreach ($arFields["USER_ID"] as $arUser)
888 {
889 if ($arUser["DATE_ACTIVE_FROM"] <> '' && !CheckDateTime($arUser["DATE_ACTIVE_FROM"]))
890 {
891 $this->LAST_ERROR .= GetMessage("WRONG_USER_DATE_ACTIVE_FROM", ["#USER_ID#" => $arUser["USER_ID"]]) . "<br>";
892 }
893
894 if ($arUser["DATE_ACTIVE_TO"] <> '' && !CheckDateTime($arUser["DATE_ACTIVE_TO"]))
895 {
896 $this->LAST_ERROR .= GetMessage("WRONG_USER_DATE_ACTIVE_TO", ["#USER_ID#" => $arUser["USER_ID"]]) . "<br>";
897 }
898 }
899 }
900 }
901
902 if (isset($arFields['STRING_ID']) && $arFields['STRING_ID'] <> '')
903 {
904 $res = GroupTable::getRow([
905 'select' => ['ID'],
906 'filter' => ['=STRING_ID' => $arFields['STRING_ID']],
907 ]);
908 if ($res)
909 {
910 if ($ID === false || $ID != $res['ID'])
911 {
912 $this->LAST_ERROR .= GetMessage('MAIN_ERROR_STRING_ID') . "<br>";
913 }
914 }
915 }
916
917 if (isset($arFields["TIMESTAMP_X"]) && !CheckDateTime($arFields["TIMESTAMP_X"]))
918 {
919 $this->LAST_ERROR .= GetMessage('MAIN_GROUP_INCORRECT_TIMESTAMP') . "<br>";
920 }
921
922 if ($this->LAST_ERROR <> '')
923 {
924 return false;
925 }
926
927 return true;
928 }
929
930 public function Update($ID, $arFields)
931 {
932 global $APPLICATION;
933
934 $ID = intval($ID);
935
936 if (!$this->CheckFields($arFields, $ID))
937 {
938 return false;
939 }
940
941 foreach (GetModuleEvents("main", "OnBeforeGroupUpdate", true) as $arEvent)
942 {
943 $bEventRes = ExecuteModuleEventEx($arEvent, [$ID, &$arFields]);
944 if ($bEventRes === false)
945 {
946 if ($err = $APPLICATION->GetException())
947 {
948 $this->LAST_ERROR .= $err->GetString() . "<br>";
949 }
950 else
951 {
952 $this->LAST_ERROR .= "Unknown error in OnBeforeGroupUpdate handler." . "<br>";
953 }
954 return false;
955 }
956 }
957
958 if ($ID <= 2)
959 {
960 unset($arFields["ACTIVE"]);
961 }
962
963 $activeChanged = false;
964 if (isset($arFields["ACTIVE"]))
965 {
966 if ($arFields["ACTIVE"] != "Y")
967 {
968 $arFields["ACTIVE"] = "N";
969 }
970
971 // check whether the group was activated or deactivated
972 $res = GroupTable::getRowById($ID, ['select' => ['ACTIVE']]);
973 if ($res && $res["ACTIVE"] != $arFields["ACTIVE"])
974 {
976 $activeChanged = true;
977 }
978 }
979
980 $arFields["TIMESTAMP_X"] = new DateTime($arFields["TIMESTAMP_X"] ?? null);
981
982 if (isset($arFields["SECURITY_POLICY"]))
983 {
984 if (COption::GetOptionString("main", "event_log_group_policy", "N") === "Y")
985 {
986 //get old security policy
987 $aPrevPolicy = [];
988 $res = GroupTable::getRowById($ID, ['select' => ['SECURITY_POLICY']]);
989 if ($res && $res["SECURITY_POLICY"] != '')
990 {
991 $aPrevPolicy = unserialize($res["SECURITY_POLICY"], ['allowed_classes' => false]);
992 }
993 //compare with new one
994 $aNewPolicy = [];
995 if ($arFields["SECURITY_POLICY"] <> '')
996 {
997 $aNewPolicy = unserialize($arFields["SECURITY_POLICY"], ['allowed_classes' => false]);
998 }
999 $aDiff = array_diff_assoc($aNewPolicy, $aPrevPolicy);
1000 if (empty($aDiff))
1001 {
1002 $aDiff = array_diff_assoc($aPrevPolicy, $aNewPolicy);
1003 }
1004 if (!empty($aDiff))
1005 {
1006 CEventLog::Log(CEventLog::SEVERITY_SECURITY, "GROUP_POLICY_CHANGED", "main", $ID, ['before' => $aPrevPolicy, 'after' => $aNewPolicy]);
1007 }
1008 }
1009 }
1010
1012 unset($fields["USER_ID"]);
1013
1014 GroupTable::update($ID, $fields);
1015
1016 if (isset($arFields["USER_ID"]) && is_array($arFields["USER_ID"]) && $ID != 2)
1017 {
1018 $prevUsers = UserGroupTable::getList([
1019 'select' => ['USER_ID'],
1020 'filter' => ['=GROUP_ID' => $ID],
1021 ])->fetchAll();
1022
1023 $added = static::AddUsersToGroup($ID, $arFields["USER_ID"]);
1024
1025 foreach ($prevUsers as $user)
1026 {
1027 if (!isset($added[(int)$user['USER_ID']]))
1028 {
1029 if (!($ID == 1 && $user['USER_ID'] == 1))
1030 {
1031 CUser::RemoveUserGroup((int)$user['USER_ID'], [$ID]);
1032 }
1033 }
1034 }
1035 }
1036
1037 foreach (GetModuleEvents("main", "OnAfterGroupUpdate", true) as $arEvent)
1038 {
1039 ExecuteModuleEventEx($arEvent, [$ID, $arFields]);
1040 }
1041
1042 if ($activeChanged)
1043 {
1044 // cached join with groups and GROUP.ACTIVE='Y'
1045 ModuleGroupTable::cleanCache();
1046 }
1047
1048 if (COption::GetOptionString("main", "event_log_group_edit", "N") === "Y")
1049 {
1050 CEventLog::Log(CEventLog::SEVERITY_SECURITY, "GROUP_UPDATED", "main", $ID);
1051 }
1052
1053 return true;
1054 }
1055
1056 public static function Delete($ID)
1057 {
1058 global $APPLICATION;
1059
1060 $ID = intval($ID);
1061 if ($ID <= 2)
1062 {
1063 return false;
1064 }
1065
1066 foreach (GetModuleEvents("main", "OnBeforeGroupDelete", true) as $arEvent)
1067 {
1068 if (ExecuteModuleEventEx($arEvent, [$ID]) === false)
1069 {
1070 $err = GetMessage("MAIN_BEFORE_DEL_ERR1") . ' ' . $arEvent['TO_NAME'];
1071 if ($ex = $APPLICATION->GetException())
1072 {
1073 $err .= ': ' . $ex->GetString();
1074 }
1075 $APPLICATION->throwException($err);
1076 return false;
1077 }
1078 }
1079
1080 foreach (GetModuleEvents("main", "OnGroupDelete", true) as $arEvent)
1081 {
1082 ExecuteModuleEventEx($arEvent, [$ID]);
1083 }
1084
1085 CMain::DelGroupRight("", [$ID]);
1086
1088
1089 UserGroupTable::deleteByFilter(['=GROUP_ID' => $ID]);
1090
1091 CUser::clearUserGroupCache();
1092
1093 GroupTable::delete($ID);
1094
1095 if (COption::GetOptionString("main", "event_log_group_edit", "N") === "Y")
1096 {
1097 CEventLog::Log(CEventLog::SEVERITY_SECURITY, "GROUP_DELETED", "main", $ID);
1098 }
1099
1100 return true;
1101 }
1102
1103 public static function GetGroupUser($ID)
1104 {
1105 $res = static::GetGroupUserEx($ID);
1106 $arr = [];
1107 while ($r = $res->Fetch())
1108 {
1109 $arr[] = $r["USER_ID"];
1110 }
1111
1112 return $arr;
1113 }
1114
1115 public static function GetGroupUserEx($ID)
1116 {
1117 $ID = intval($ID);
1118
1119 if ($ID == 2)
1120 {
1121 trigger_error("Group 2 contains all the users, the call was ignored.", E_USER_WARNING);
1122
1123 $result = new CDBResult();
1124 $result->InitFromArray([]);
1125 return $result;
1126 }
1127
1128 $users = UserGroupTable::getList([
1129 'filter' => ['=GROUP_ID' => $ID],
1130 'cache' => ['ttl' => 3600],
1131 ]);
1132
1133 $userList = [];
1134 $now = time();
1135 while ($user = $users->fetch())
1136 {
1138 $dateFrom = $user['DATE_ACTIVE_FROM'];
1140 $dateTo = $user['DATE_ACTIVE_TO'];
1141
1142 if (
1143 (empty($dateFrom) || $dateFrom->getTimestamp() <= $now)
1144 && (empty($dateTo) || $dateTo->getTimestamp() >= $now)
1145 )
1146 {
1147 // TZ convertion to string
1148 $userList[] = [
1149 'USER_ID' => $user['USER_ID'],
1150 'DATE_ACTIVE_FROM' => (string)$dateFrom,
1151 'DATE_ACTIVE_TO' => (string)$dateTo,
1152 ];
1153 }
1154 }
1155
1156 $result = new CDBResult();
1157 $result->InitFromArray($userList);
1158 return $result;
1159 }
1160
1161 public static function GetSubordinateGroups($grId)
1162 {
1163 if (!is_array($grId))
1164 {
1165 $grId = [$grId];
1166 }
1167
1168 Collection::normalizeArrayValuesByInt($grId, false);
1169
1170 $result = ['2'];
1171 if (!empty($grId))
1172 {
1173 $groups = GroupSubordinateTable::query()
1174 ->setSelect(['ID', 'AR_SUBGROUP_ID'])
1175 ->setCacheTtl(86400)
1176 ->exec()
1177 ;
1178
1179 $cache = [];
1180 while ($group = $groups->fetch())
1181 {
1182 $cache[$group['ID']] = explode(',', $group['AR_SUBGROUP_ID']);
1183 }
1184
1185 foreach ($cache as $groupId => $subordinateGroups)
1186 {
1187 if (in_array($groupId, $grId))
1188 {
1189 $result = array_merge($result, $subordinateGroups);
1190 }
1191 }
1192 }
1193
1194 Collection::normalizeArrayValuesByInt($result, false);
1195
1196 return $result;
1197 }
1198
1199 public static function SetSubordinateGroups($grId, $arSubGroups = false)
1200 {
1201 $grId = (int)$grId;
1202
1203 GroupSubordinateTable::delete($grId);
1204
1205 if (is_array($arSubGroups))
1206 {
1207 GroupSubordinateTable::add([
1208 'ID' => $grId,
1209 'AR_SUBGROUP_ID' => implode(',', $arSubGroups),
1210 ]);
1211 }
1212 }
1213
1214 public static function GetTasks($ID, $onlyMainTasks = true, $module_id = false)
1215 {
1216 global $DB;
1217
1218 $sql_str = 'SELECT GT.TASK_ID,T.MODULE_ID,GT.EXTERNAL_ID
1219 FROM b_group_task GT
1220 INNER JOIN b_task T ON (T.ID=GT.TASK_ID)
1221 WHERE GT.GROUP_ID=' . intval($ID);
1222 if ($module_id !== false)
1223 {
1224 $sql_str .= ' AND T.MODULE_ID="' . $DB->ForSQL($module_id) . '"';
1225 }
1226
1227 $z = $DB->Query($sql_str);
1228 $arr = [];
1229 $ex_arr = [];
1230 while ($r = $z->Fetch())
1231 {
1232 if (!$r['EXTERNAL_ID'])
1233 {
1234 $arr[$r['MODULE_ID']] = $r['TASK_ID'];
1235 }
1236 else
1237 {
1238 $ex_arr[] = $r;
1239 }
1240 }
1241 if ($onlyMainTasks)
1242 {
1243 return $arr;
1244 }
1245 else
1246 {
1247 return [$arr, $ex_arr];
1248 }
1249 }
1250
1251 public static function SetTasks($ID, $arr)
1252 {
1253 global $DB;
1254 $ID = intval($ID);
1255
1256 if (COption::GetOptionString("main", "event_log_module_access", "N") === "Y")
1257 {
1258 //get old values
1259 $arOldTasks = [];
1260 $rsTask = $DB->Query("SELECT TASK_ID FROM b_group_task WHERE GROUP_ID=" . $ID);
1261 while ($arTask = $rsTask->Fetch())
1262 {
1263 $arOldTasks[] = $arTask["TASK_ID"];
1264 }
1265 //compare with new ones
1266 $aNewTasks = [];
1267 foreach ($arr as $task_id)
1268 {
1269 if ($task_id > 0)
1270 {
1271 $aNewTasks[] = $task_id;
1272 }
1273 }
1274 $aDiff = array_diff($arOldTasks, $aNewTasks);
1275 if (empty($aDiff))
1276 {
1277 $aDiff = array_diff($aNewTasks, $arOldTasks);
1278 }
1279 if (!empty($aDiff))
1280 {
1281 CEventLog::Log(CEventLog::SEVERITY_SECURITY, "MODULE_RIGHTS_CHANGED", "main", $ID, ['before' => $arOldTasks, 'after' => $aNewTasks]);
1282 }
1283 }
1284
1285 $sql_str = "DELETE FROM b_group_task WHERE GROUP_ID=" . $ID .
1286 " AND (EXTERNAL_ID IS NULL OR EXTERNAL_ID = '')";
1287 $DB->Query($sql_str);
1288
1289 $sID = "0";
1290 if (is_array($arr))
1291 {
1292 foreach ($arr as $task_id)
1293 {
1294 $sID .= "," . intval($task_id);
1295 }
1296 }
1297
1298 $DB->Query(
1299 "INSERT INTO b_group_task (GROUP_ID, TASK_ID, EXTERNAL_ID) " .
1300 "SELECT '" . $ID . "', ID, '' " .
1301 "FROM b_task " .
1302 "WHERE ID IN (" . $sID . ") "
1303 );
1304 }
1305
1306 public static function GetTasksForModule($module_id, $onlyMainTasks = true)
1307 {
1308 global $DB;
1309
1310 $sql_str = "SELECT GT.TASK_ID,GT.GROUP_ID,GT.EXTERNAL_ID,T.NAME
1311 FROM b_group_task GT
1312 INNER JOIN b_task T ON (T.ID=GT.TASK_ID)
1313 WHERE T.MODULE_ID='" . $DB->ForSQL($module_id) . "'";
1314
1315 $z = $DB->Query($sql_str);
1316
1317 $main_arr = [];
1318 $ext_arr = [];
1319 while ($r = $z->Fetch())
1320 {
1321 if (!$r['EXTERNAL_ID'])
1322 {
1323 $main_arr[$r['GROUP_ID']] = ['ID' => $r['TASK_ID'], 'NAME' => $r['NAME']];
1324 }
1325 elseif (!$onlyMainTasks)
1326 {
1327 if (!isset($ext_arr[$r['GROUP_ID']]))
1328 {
1329 $ext_arr[$r['GROUP_ID']] = [];
1330 }
1331 $ext_arr[$r['GROUP_ID']][] = ['ID' => $r['TASK_ID'], 'NAME' => $r['NAME'], 'EXTERNAL_ID' => $r['EXTERNAL_ID']];
1332 }
1333 }
1334 if ($onlyMainTasks)
1335 {
1336 return $main_arr;
1337 }
1338 else
1339 {
1340 return [$main_arr, $ext_arr];
1341 }
1342 }
1343
1344 public static function SetTasksForModule($module_id, $arGroupTask)
1345 {
1346 global $DB;
1347
1348 $module_id = $DB->ForSql($module_id);
1349 $sql_str = "SELECT T.ID
1350 FROM b_task T
1351 WHERE T.MODULE_ID='" . $module_id . "'";
1352 $r = $DB->Query($sql_str);
1353 $arIds = [];
1354 while ($arR = $r->Fetch())
1355 {
1356 $arIds[] = $arR['ID'];
1357 }
1358
1359 if (COption::GetOptionString("main", "event_log_module_access", "N") === "Y")
1360 {
1361 //get old values
1362 $arOldTasks = [];
1363 if (!empty($arIds))
1364 {
1365 $rsTask = $DB->Query("SELECT GROUP_ID, TASK_ID FROM b_group_task WHERE TASK_ID IN (" . implode(",", $arIds) . ")");
1366 while ($arTask = $rsTask->Fetch())
1367 {
1368 $arOldTasks[$arTask["GROUP_ID"]] = $arTask["TASK_ID"];
1369 }
1370 }
1371 //compare with new ones
1372 foreach ($arOldTasks as $gr_id => $task_id)
1373 {
1374 if ($task_id <> $arGroupTask[$gr_id]['ID'])
1375 {
1376 CEventLog::Log(CEventLog::SEVERITY_SECURITY, "MODULE_RIGHTS_CHANGED", "main", $gr_id, ['before' => [$module_id => $task_id], 'after' => [$module_id => $arGroupTask[$gr_id]['ID']]]);
1377 }
1378 }
1379 foreach ($arGroupTask as $gr_id => $oTask)
1380 {
1381 if (intval($oTask['ID']) > 0 && !array_key_exists($gr_id, $arOldTasks))
1382 {
1383 CEventLog::Log(CEventLog::SEVERITY_SECURITY, "MODULE_RIGHTS_CHANGED", "main", $gr_id, ['before' => [$module_id => ''], 'after' => [$module_id => $oTask['ID']]]);
1384 }
1385 }
1386 }
1387
1388 if (!empty($arIds))
1389 {
1390 $sql_str = "DELETE FROM b_group_task WHERE TASK_ID IN (" . implode(",", $arIds) . ")";
1391 $DB->Query($sql_str);
1392 }
1393
1394 foreach ($arGroupTask as $gr_id => $oTask)
1395 {
1396 if (intval($oTask['ID']) > 0)
1397 {
1398 $DB->Query(
1399 "INSERT INTO b_group_task (GROUP_ID, TASK_ID, EXTERNAL_ID) " .
1400 "SELECT G.ID, T.ID, '' " .
1401 "FROM b_group G, b_task T " .
1402 "WHERE G.ID = " . intval($gr_id) . " AND
1403 T.ID = " . intval($oTask['ID'])
1404 );
1405 }
1406 }
1407 }
1408
1409 public static function GetModulePermission($group_id, $module_id)
1410 {
1412 global $APPLICATION, $DB;
1413
1414 // check module permissions mode
1415 $strSql = "SELECT T.ID, GT.TASK_ID FROM b_task T LEFT JOIN b_group_task GT ON T.ID=GT.TASK_ID AND GT.GROUP_ID=" . intval($group_id) . " WHERE T.MODULE_ID='" . $DB->ForSql($module_id) . "'";
1416 $dbr_tasks = $DB->Query($strSql);
1417 if ($ar_task = $dbr_tasks->Fetch())
1418 {
1419 do
1420 {
1421 if ($ar_task["TASK_ID"] > 0)
1422 {
1423 return $ar_task["TASK_ID"];
1424 }
1425 }
1426 while ($ar_task = $dbr_tasks->Fetch());
1427
1428 return false;
1429 }
1430
1431 return $APPLICATION->GetGroupRight($module_id, [$group_id], "N", "N");
1432 }
1433
1434 public static function SetModulePermission($group_id, $module_id, $permission)
1435 {
1437 global $DB, $APPLICATION;
1438
1439 if (intval($permission) <= 0 && $permission !== false)
1440 {
1441 $strSql = "SELECT T.ID FROM b_task T WHERE T.MODULE_ID='" . $DB->ForSql($module_id) . "' AND NAME='" . $DB->ForSql($permission) . "'";
1442 $db_task = $DB->Query($strSql);
1443 if ($ar_task = $db_task->Fetch())
1444 {
1445 $permission = $ar_task['ID'];
1446 }
1447 }
1448
1449 $permission_letter = '';
1450 if (intval($permission) > 0 || $permission === false)
1451 {
1452 $DB->StartTransaction();
1453
1454 $strSql = "SELECT T.ID FROM b_task T WHERE T.MODULE_ID='" . $DB->ForSql($module_id) . "'";
1455 $dbr_tasks = $DB->Query($strSql);
1456 $arIds = [];
1457 while ($arTask = $dbr_tasks->Fetch())
1458 {
1459 $arIds[] = $arTask['ID'];
1460 }
1461
1462 if (!empty($arIds))
1463 {
1464 $strSql = "DELETE FROM b_group_task WHERE GROUP_ID=" . intval($group_id) . " AND TASK_ID IN (" . implode(",", $arIds) . ")";
1465 $DB->Query($strSql);
1466 }
1467
1468 if (intval($permission) > 0)
1469 {
1470 $DB->Query(
1471 "INSERT INTO b_group_task (GROUP_ID, TASK_ID, EXTERNAL_ID) " .
1472 "SELECT G.ID, T.ID, '' " .
1473 "FROM b_group G, b_task T " .
1474 "WHERE G.ID = " . intval($group_id) . " AND T.ID = " . intval($permission)
1475 );
1476
1477 $permission_letter = CTask::GetLetter($permission);
1478 }
1479
1480 $DB->Commit();
1481 }
1482 else
1483 {
1484 $permission_letter = $permission;
1485 }
1486
1487 if ($permission_letter <> '')
1488 {
1489 $APPLICATION->SetGroupRight($module_id, $group_id, $permission_letter);
1490 }
1491 else
1492 {
1493 $APPLICATION->DelGroupRight($module_id, [$group_id]);
1494 }
1495 }
1496
1502 public static function GetIDByCode($code)
1503 {
1504 if (strval(intval($code)) == $code && $code > 0)
1505 {
1506 return (int)$code;
1507 }
1508
1509 if (strtolower($code) == 'administrators')
1510 {
1511 return 1;
1512 }
1513
1514 if (strtolower($code) == 'everyone')
1515 {
1516 return 2;
1517 }
1518
1519 $res = GroupTable::getRow([
1520 'select' => ['ID'],
1521 'filter' => ['=STRING_ID' => $code],
1522 'cache' => ['ttl' => 86400],
1523 ]);
1524
1525 if ($res)
1526 {
1527 return (int)$res['ID'];
1528 }
1529
1530 return false;
1531 }
1532}
1533
1534class CGroup extends CAllGroup
1535{
1536}
$connection
Определения actionsdefinitions.php:38
global $APPLICATION
Определения include.php:80
$module_id
Определения options.php:6
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
Определения check_mail.php:18
static getConnection($name="")
Определения application.php:638
Определения group.php:32
Определения group.php:19
static GetTasksForModule($module_id, $onlyMainTasks=true)
Определения group.php:1306
static SetTasksForModule($module_id, $arGroupTask)
Определения group.php:1344
CheckFields($arFields, $ID=false)
Определения group.php:874
static GetFilterOperation($key)
Определения group.php:320
static AddUsersToGroup(int $groupId, array $users)
Определения group.php:86
static GetTasks($ID, $onlyMainTasks=true, $module_id=false)
Определения group.php:1214
static Delete($ID)
Определения group.php:1056
static GetIDByCode($code)
Определения group.php:1502
static GetListEx($arOrder=["ID"=> "DESC"], $arFilter=[], $arGroupBy=false, $arNavStartParams=false, $arSelectFields=[])
Определения group.php:736
static PrepareSql($arFields, $arOrder, $arFilter, $arGroupBy, $arSelectFields)
Определения group.php:379
$LAST_ERROR
Определения group.php:20
static GetList($by='c_sort', $order='asc', $arFilter=[], $SHOW_USERS_AMOUNT="N")
Определения group.php:136
static GetModulePermission($group_id, $module_id)
Определения group.php:1409
static SetSubordinateGroups($grId, $arSubGroups=false)
Определения group.php:1199
static SetModulePermission($group_id, $module_id, $permission)
Определения group.php:1434
static SetTasks($ID, $arr)
Определения group.php:1251
static GetGroupUser($ID)
Определения group.php:1103
static GetDropDownList($strSqlSearch="and ACTIVE='Y'", $strSqlOrder="ORDER BY C_SORT, NAME, ID")
Определения group.php:114
Add($arFields)
Определения group.php:22
Update($ID, $arFields)
Определения group.php:930
static GetByID($ID, $SHOW_USERS_AMOUNT="N")
Определения group.php:853
static GetSubordinateGroups($grId)
Определения group.php:1161
static GetLetter($ID)
Определения task.php:438
Определения dbresult.php:88
const SEVERITY_SECURITY
Определения event_log.php:22
static Log($SEVERITY, $AUDIT_TYPE_ID, $MODULE_ID, $ITEM_ID, $DESCRIPTION=false, $SITE_ID=false)
Определения event_log.php:32
static RecalculateForGroup($ID, $checkTime=true)
Определения authproviders.php:107
Определения group.php:1535
$arFields
Определения dblapprove.php:5
$userList
Определения discount_coupon_list.php:276
$arr
Определения file_new.php:624
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$res
Определения filter_act.php:7
GetFilterSqlSearch($arSqlSearch=array(), $FilterLogic="FILTER_logic")
Определения filter_tools.php:397
GetFilterQuery($field, $val, $procent="Y", $ex_sep=array(), $clob="N", $div_fields="Y", $clob_upper="N")
Определения filter_tools.php:383
IsFiltered($strSqlSearch)
Определения filter_tools.php:337
$result
Определения get_property_values.php:14
if($ajaxMode) $ID
Определения get_user.php:27
global $DB
Определения cron_frame.php:29
if(!is_null($config))($config as $configItem)(! $configItem->isVisible()) $code
Определения options.php:195
$groups
Определения options.php:30
$z
Определения options.php:31
ExecuteModuleEventEx($arEvent, $arParams=[])
Определения tools.php:5214
FmtDate($str_date, $format=false, $site=false, $bSearchInSitesOnly=false)
Определения tools.php:745
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
Определения tools.php:5177
GetMessage($name, $aReplace=null)
Определения tools.php:3397
CheckDateTime($datetime, $format=false)
Определения tools.php:398
MkDateTime($strDT, $format="d.m.Y H:i:s")
Определения tools.php:1977
$user
Определения mysql_to_pgsql.php:33
$order
Определения payment.php:8
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
if(empty($signedUserToken)) $key
Определения quickway.php:257
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
Определения template.php:799
$val
Определения options.php:1793
$arRes
Определения options.php:104
$arFilter
Определения user_search.php:106
$dbRes
Определения yandex_detail.php:168
$fields
Определения yandex_run.php:501