34 if ($bEventRes ===
false)
38 $this->LAST_ERROR .= $err->GetString() .
"<br>";
42 $this->LAST_ERROR .=
"Unknown error in OnBeforeGroupAdd handler." .
"<br>";
78 if (COption::GetOptionString(
"main",
"event_log_group_edit",
"N") ===
"Y")
89 foreach ($users as $user)
93 $user = [
"USER_ID" => $user];
95 $userId = (int)($user[
"USER_ID"] ?? 0);
99 CUser::AppendUserGroup(
102 'GROUP_ID' => $groupId,
103 'DATE_ACTIVE_FROM' => $user[
'DATE_ACTIVE_FROM'] ??
null,
104 'DATE_ACTIVE_TO' => $user[
'DATE_ACTIVE_TO'] ??
null,
114 public static function GetDropDownList($strSqlSearch =
"and ACTIVE='Y'", $strSqlOrder =
"ORDER BY C_SORT, NAME, ID")
123 " . $helper->getConcatFunction(
"NAME",
"' ['",
"ID",
"']'") .
" as REFERENCE
142 $arSqlSearch = $arSqlSearch_h = [];
143 $strSqlSearch_h =
"";
157 if ((
string)
$val ==
'' ||
$val ==
"NOT_REF")
163 $match_value_set = array_key_exists(
$key .
"_EXACT_MATCH",
$arFilter);
167 $match = ($match_value_set &&
$arFilter[
$key .
"_EXACT_MATCH"] ==
"N") ?
"Y" :
"N";
171 $arSqlSearch[] =
"G.TIMESTAMP_X >= FROM_UNIXTIME('" .
MkDateTime(
FmtDate(
$val,
"D.M.Y"),
"d.m.Y") .
"')";
174 $arSqlSearch[] =
"G.TIMESTAMP_X <= FROM_UNIXTIME('" .
MkDateTime(
FmtDate(
$val,
"D.M.Y") .
" 23:59:59",
"d.m.Y") .
"')";
177 $arSqlSearch[] = (
$val ==
"Y") ?
"G.ACTIVE='Y'" :
"G.ACTIVE='N'";
180 if (COption::GetOptionString(
"main",
"controller_member",
"N") ==
"Y" && COption::GetOptionString(
"main",
"~controller_limited_admin",
"N") ==
"Y")
184 $arSqlSearch[] =
"G.ID=0";
190 $arSqlSearch[] = (
$val ==
"Y") ?
"G.ID=1" :
"G.ID>1";
194 $match = ($match_value_set &&
$arFilter[
$key .
"_EXACT_MATCH"] ==
"Y") ?
"N" :
"Y";
198 $match = ($match_value_set &&
$arFilter[
$key .
"_EXACT_MATCH"] ==
"N") ?
"Y" :
"N";
202 $match = ($match_value_set &&
$arFilter[
$key .
"_EXACT_MATCH"] ==
"Y") ?
"N" :
"Y";
206 $SHOW_USERS_AMOUNT =
"Y";
207 $arSqlSearch_h[] =
"USERS>=" . intval(
$val);
210 $SHOW_USERS_AMOUNT =
"Y";
211 $arSqlSearch_h[] =
"USERS<=" . intval(
$val);
216 $arSqlSearch[] =
"G.ANONYMOUS='" .
$val .
"'";
221 foreach ($arSqlSearch_h as $condition)
223 $strSqlSearch_h .=
" and (" . $condition .
") ";
227 $by = strtolower($by);
231 $strSqlOrder =
" ORDER BY G.ID ";
235 $strSqlOrder =
" ORDER BY G.ACTIVE ";
237 elseif ($by ==
"timestamp_x")
239 $strSqlOrder =
" ORDER BY G.TIMESTAMP_X ";
243 $strSqlOrder =
" ORDER BY G.C_SORT ";
247 $strSqlOrder =
" ORDER BY G.C_SORT, G.NAME, G.ID ";
251 $strSqlOrder =
" ORDER BY G.NAME ";
253 elseif ($by ==
"string_id")
255 $strSqlOrder =
" ORDER BY G.STRING_ID ";
257 elseif ($by ==
"description")
259 $strSqlOrder =
" ORDER BY G.DESCRIPTION ";
261 elseif ($by ==
"anonymous")
263 $strSqlOrder =
" ORDER BY G.ANONYMOUS ";
265 elseif ($by ==
"dropdown")
267 $strSqlOrder =
" ORDER BY C_SORT, NAME ";
271 $strSqlOrder =
" ORDER BY USERS ";
272 $SHOW_USERS_AMOUNT =
"Y";
276 $strSqlOrder =
" ORDER BY G.C_SORT ";
279 if (strtolower(
$order) ==
"desc")
281 $strSqlOrder .=
" desc ";
285 $strSqlOrder .=
" asc ";
288 $str_USERS = $str_TABLE =
"";
289 if ($SHOW_USERS_AMOUNT ==
"Y")
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() .
")))";
297 G.ID, G.ACTIVE, G.C_SORT, G.ANONYMOUS, G.NAME, G.DESCRIPTION, G.STRING_ID,
300 " . $helper->getConcatFunction(
"G.NAME",
"' ['",
"G.ID",
"']'") .
" REFERENCE,
301 " .
$DB->DateToCharFunction(
"G.TIMESTAMP_X") .
" TIMESTAMP_X
306 " . $strSqlSearch .
"
308 G.ID, G.ACTIVE, G.C_SORT, G.TIMESTAMP_X, G.ANONYMOUS, G.NAME, G.STRING_ID, G.DESCRIPTION
311 " . $strSqlSearch_h .
"
315 $res->is_filtered = (
IsFiltered($strSqlSearch) || $strSqlSearch_h <>
'');
323 if (str_starts_with(
$key,
"!"))
330 if (str_starts_with(
$key,
"+"))
336 if (str_starts_with(
$key,
">="))
339 $strOperation =
">=";
349 $strOperation =
"<=";
359 $strOperation =
"IN";
364 $strOperation =
"LIKE";
369 $strOperation =
"QUERY";
376 return [
"FIELD" =>
$key,
"NEGATIVE" => $strNegative,
"OPERATION" => $strOperation,
"OR_NULL" => $strOrNull];
388 $arGroupByFunct = [
"COUNT",
"AVG",
"MIN",
"MAX",
"SUM"];
390 $arAlreadyJoined = [];
393 if (is_array($arGroupBy) && !empty($arGroupBy))
395 $arSelectFields = $arGroupBy;
396 foreach ($arGroupBy as
$key =>
$val)
402 if ($strSqlGroupBy <>
'')
404 $strSqlGroupBy .=
", ";
412 if ($strSqlFrom <>
'')
427 if (is_array($arGroupBy) && empty($arGroupBy))
429 $strSqlSelect =
"COUNT(%%_DISTINCT_%% " .
$arFields[$arFieldsKeys[0]][
"FIELD"] .
") as CNT ";
433 if (isset($arSelectFields) && is_string($arSelectFields) && $arSelectFields <>
'' && array_key_exists($arSelectFields,
$arFields))
435 $arSelectFields = [$arSelectFields];
438 if (empty($arSelectFields)
439 || !is_array($arSelectFields)
440 || in_array(
"*", $arSelectFields)
443 foreach (
$arFields as $FIELD_ID => $arField)
445 if (isset($arField[
"WHERE_ONLY"])
446 && $arField[
"WHERE_ONLY"] ==
"Y")
451 if ($strSqlSelect <>
'')
453 $strSqlSelect .=
", ";
456 if ($arField[
"TYPE"] ==
"datetime")
458 $strSqlSelect .=
$DB->DateToCharFunction($arField[
"FIELD"]) .
" as " . $FIELD_ID;
460 elseif ($arField[
"TYPE"] ==
"date")
462 $strSqlSelect .=
$DB->DateToCharFunction($arField[
"FIELD"],
"SHORT") .
" as " . $FIELD_ID;
466 $strSqlSelect .= $arField[
"FIELD"] .
" as " . $FIELD_ID;
469 if (isset($arField[
"FROM"])
470 && $arField[
"FROM"] <>
''
471 && !in_array($arField[
"FROM"], $arAlreadyJoined))
473 if ($strSqlFrom <>
'')
477 $strSqlFrom .= $arField[
"FROM"];
478 $arAlreadyJoined[] = $arField[
"FROM"];
484 foreach ($arSelectFields as
$key =>
$val)
490 if ($strSqlSelect <>
'')
492 $strSqlSelect .=
", ";
495 if (in_array(
$key, $arGroupByFunct))
519 if ($strSqlFrom <>
'')
530 if ($strSqlGroupBy <>
'')
532 if ($strSqlSelect <>
'')
534 $strSqlSelect .=
", ";
536 $strSqlSelect .=
"COUNT(%%_DISTINCT_%% " .
$arFields[$arFieldsKeys[0]][
"FIELD"] .
") as CNT";
540 $strSqlSelect =
"%%_DISTINCT_%% " . $strSqlSelect;
552 if (!is_array($vals))
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"];
565 $arSqlSearch_tmp = [];
566 foreach ($vals as
$val)
570 $arSqlSearch_tmp1 = call_user_func_array(
574 if ($arSqlSearch_tmp1 !==
false)
576 $arSqlSearch_tmp[] = $arSqlSearch_tmp1;
583 if (intval(
$val) <= 0)
585 $arSqlSearch_tmp[] = ($strNegative ==
"Y" ?
"NOT" :
"") .
"(" .
$arFields[
$key][
"FIELD"] .
" IS NULL OR " .
$arFields[
$key][
"FIELD"] .
" <= 0)";
589 $arSqlSearch_tmp[] = ($strNegative ==
"Y" ?
" " .
$arFields[
$key][
"FIELD"] .
" IS NULL OR NOT " :
"") .
"(" .
$arFields[
$key][
"FIELD"] .
" " . $strOperation .
" " . intval(
$val) .
" )";
595 if (DoubleVal(
$val) <= 0)
597 $arSqlSearch_tmp[] = ($strNegative ==
"Y" ?
"NOT" :
"") .
"(" .
$arFields[
$key][
"FIELD"] .
" IS NULL OR " .
$arFields[
$key][
"FIELD"] .
" <= 0)";
601 $arSqlSearch_tmp[] = ($strNegative ==
"Y" ?
" " .
$arFields[
$key][
"FIELD"] .
" IS NULL OR NOT " :
"") .
"(" .
$arFields[
$key][
"FIELD"] .
" " . $strOperation .
" " . DoubleVal(
$val) .
" )";
606 if ($strOperation ==
"QUERY")
612 if ((
string)
$val ==
'')
614 $arSqlSearch_tmp[] = ($strNegative ==
"Y" ?
"NOT" :
"") .
"(" .
$arFields[
$key][
"FIELD"] .
" IS NULL OR LENGTH(" .
$arFields[
$key][
"FIELD"] .
")<=0)";
618 $arSqlSearch_tmp[] = ($strNegative ==
"Y" ?
" " .
$arFields[
$key][
"FIELD"] .
" IS NULL OR NOT " :
"") .
"(" .
$arFields[
$key][
"FIELD"] .
" " . $strOperation .
" '" .
$DB->ForSql(
$val) .
"' )";
624 if ((
string)
$val ==
'')
626 $arSqlSearch_tmp[] = ($strNegative ==
"Y" ?
"NOT" :
"") .
"(" .
$arFields[
$key][
"FIELD"] .
" IS NULL)";
630 $arSqlSearch_tmp[] = ($strNegative ==
"Y" ?
" " .
$arFields[
$key][
"FIELD"] .
" IS NULL OR NOT " :
"") .
"(" .
$arFields[
$key][
"FIELD"] .
" " . $strOperation .
" " .
$DB->CharToDateFunction(
$DB->ForSql(
$val)) .
")";
635 if ((
string)
$val ==
'')
637 $arSqlSearch_tmp[] = ($strNegative ==
"Y" ?
"NOT" :
"") .
"(" .
$arFields[
$key][
"FIELD"] .
" IS NULL)";
641 $arSqlSearch_tmp[] = ($strNegative ==
"Y" ?
" " .
$arFields[
$key][
"FIELD"] .
" IS NULL OR NOT " :
"") .
"(" .
$arFields[
$key][
"FIELD"] .
" " . $strOperation .
" " .
$DB->CharToDateFunction(
$DB->ForSql(
$val),
"SHORT") .
")";
651 if ($strSqlFrom <>
'')
659 $strSqlSearch_tmp =
"";
660 foreach ($arSqlSearch_tmp as $condition)
662 if ($strSqlSearch_tmp !=
"")
664 $strSqlSearch_tmp .= ($strNegative ==
"Y" ?
" AND " :
" OR ");
666 $strSqlSearch_tmp .=
"(" . $condition .
")";
668 if ($strOrNull ==
"Y")
670 if ($strSqlSearch_tmp !=
"")
672 $strSqlSearch_tmp .= ($strNegative ==
"Y" ?
" AND " :
" OR ");
674 $strSqlSearch_tmp .=
"(" .
$arFields[
$key][
"FIELD"] .
" IS " . ($strNegative ==
"Y" ?
"NOT " :
"") .
"NULL)";
677 if ($strSqlSearch_tmp !=
"")
679 $arSqlSearch[] =
"(" . $strSqlSearch_tmp .
")";
685 foreach ($arSqlSearch as $condition)
687 if ($strSqlWhere !=
"")
689 $strSqlWhere .=
" AND ";
691 $strSqlWhere .=
"(" . $condition .
")";
697 foreach ($arOrder as $by =>
$order)
699 $by = strtoupper($by);
712 && !in_array(
$arFields[$by][
"FROM"], $arAlreadyJoined))
714 if ($strSqlFrom <>
'')
719 $arAlreadyJoined[] =
$arFields[$by][
"FROM"];
724 $strSqlOrderBy = implode(
", ", $arSqlOrder);
728 "SELECT" => $strSqlSelect,
729 "FROM" => $strSqlFrom,
730 "WHERE" => $strSqlWhere,
731 "GROUPBY" => $strSqlGroupBy,
732 "ORDERBY" => $strSqlOrderBy,
736 public static function GetListEx($arOrder = [
"ID" =>
"DESC"],
$arFilter = [], $arGroupBy =
false, $arNavStartParams =
false, $arSelectFields = [])
740 if (empty($arSelectFields))
742 $arSelectFields = [
"ID",
"TIMESTAMP_X",
"ACTIVE",
"C_SORT",
"ANONYMOUS",
"NAME",
"DESCRIPTION"];
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)"],
762 $arSqls = static::PrepareSql(
$arFields, $arOrder,
$arFilter, $arGroupBy, $arSelectFields);
764 $arSqls[
"SELECT"] = str_replace(
"%%_DISTINCT_%%",
"DISTINCT", $arSqls[
"SELECT"]);
766 if (is_array($arGroupBy) && empty($arGroupBy))
769 "SELECT " . $arSqls[
"SELECT"] .
" " .
771 " " . $arSqls[
"FROM"] .
" ";
772 if ($arSqls[
"WHERE"] <>
'')
774 $strSql .=
"WHERE " . $arSqls[
"WHERE"] .
" ";
776 if ($arSqls[
"GROUPBY"] <>
'')
778 $strSql .=
"GROUP BY " . $arSqls[
"GROUPBY"] .
" ";
793 "SELECT " . $arSqls[
"SELECT"] .
" " .
795 " " . $arSqls[
"FROM"] .
" ";
796 if ($arSqls[
"WHERE"] <>
'')
798 $strSql .=
"WHERE " . $arSqls[
"WHERE"] .
" ";
800 if ($arSqls[
"GROUPBY"] <>
'')
802 $strSql .=
"GROUP BY " . $arSqls[
"GROUPBY"] .
" ";
804 if ($arSqls[
"ORDERBY"] <>
'')
806 $strSql .=
"ORDER BY " . $arSqls[
"ORDERBY"] .
" ";
809 if (is_array($arNavStartParams) && intval($arNavStartParams[
"nTopCount"]) <= 0)
812 "SELECT COUNT('x') as CNT " .
814 " " . $arSqls[
"FROM"] .
" ";
815 if ($arSqls[
"WHERE"] <>
'')
817 $strSql_tmp .=
"WHERE " . $arSqls[
"WHERE"] .
" ";
819 if ($arSqls[
"GROUPBY"] <>
'')
821 $strSql_tmp .=
"GROUP BY " . $arSqls[
"GROUPBY"] .
" ";
826 if ($arSqls[
"GROUPBY"] ==
'')
835 $cnt =
$dbRes->SelectedRowsCount();
839 $dbRes->NavQuery($strSql, $cnt, $arNavStartParams);
843 if (is_array($arNavStartParams) && intval($arNavStartParams[
"nTopCount"]) > 0)
845 $strSql .=
"LIMIT " . intval($arNavStartParams[
"nTopCount"]);
853 public static function GetByID(
$ID, $SHOW_USERS_AMOUNT =
"N")
856 'select' => [
'ID',
'ACTIVE',
'C_SORT',
'ANONYMOUS',
'NAME',
'STRING_ID',
'DESCRIPTION',
'TIMESTAMP_X'],
859 if ($SHOW_USERS_AMOUNT ==
"Y")
866 $params[
'select'][] =
'SECURITY_POLICY';
876 $this->LAST_ERROR =
"";
880 $this->LAST_ERROR .=
GetMessage(
"BAD_GROUP_NAME") .
"<br>";
887 foreach (
$arFields[
"USER_ID"] as $arUser)
889 if ($arUser[
"DATE_ACTIVE_FROM"] <>
'' && !
CheckDateTime($arUser[
"DATE_ACTIVE_FROM"]))
891 $this->LAST_ERROR .=
GetMessage(
"WRONG_USER_DATE_ACTIVE_FROM", [
"#USER_ID#" => $arUser[
"USER_ID"]]) .
"<br>";
894 if ($arUser[
"DATE_ACTIVE_TO"] <>
'' && !
CheckDateTime($arUser[
"DATE_ACTIVE_TO"]))
896 $this->LAST_ERROR .=
GetMessage(
"WRONG_USER_DATE_ACTIVE_TO", [
"#USER_ID#" => $arUser[
"USER_ID"]]) .
"<br>";
904 $res = GroupTable::getRow([
906 'filter' => [
'=STRING_ID' =>
$arFields[
'STRING_ID']],
912 $this->LAST_ERROR .=
GetMessage(
'MAIN_ERROR_STRING_ID') .
"<br>";
919 $this->LAST_ERROR .=
GetMessage(
'MAIN_GROUP_INCORRECT_TIMESTAMP') .
"<br>";
922 if ($this->LAST_ERROR <>
'')
941 foreach (
GetModuleEvents(
"main",
"OnBeforeGroupUpdate",
true) as $arEvent)
944 if ($bEventRes ===
false)
948 $this->LAST_ERROR .= $err->GetString() .
"<br>";
952 $this->LAST_ERROR .=
"Unknown error in OnBeforeGroupUpdate handler." .
"<br>";
963 $activeChanged =
false;
972 $res = GroupTable::getRowById(
$ID, [
'select' => [
'ACTIVE']]);
976 $activeChanged =
true;
984 if (COption::GetOptionString(
"main",
"event_log_group_policy",
"N") ===
"Y")
988 $res = GroupTable::getRowById(
$ID, [
'select' => [
'SECURITY_POLICY']]);
989 if (
$res &&
$res[
"SECURITY_POLICY"] !=
'')
991 $aPrevPolicy = unserialize(
$res[
"SECURITY_POLICY"], [
'allowed_classes' =>
false]);
997 $aNewPolicy = unserialize(
$arFields[
"SECURITY_POLICY"], [
'allowed_classes' =>
false]);
999 $aDiff = array_diff_assoc($aNewPolicy, $aPrevPolicy);
1002 $aDiff = array_diff_assoc($aPrevPolicy, $aNewPolicy);
1018 $prevUsers = UserGroupTable::getList([
1019 'select' => [
'USER_ID'],
1020 'filter' => [
'=GROUP_ID' =>
$ID],
1023 $added = static::AddUsersToGroup(
$ID,
$arFields[
"USER_ID"]);
1025 foreach ($prevUsers as $user)
1027 if (!isset($added[(
int)$user[
'USER_ID']]))
1029 if (!(
$ID == 1 && $user[
'USER_ID'] == 1))
1031 CUser::RemoveUserGroup((
int)$user[
'USER_ID'], [
$ID]);
1037 foreach (
GetModuleEvents(
"main",
"OnAfterGroupUpdate",
true) as $arEvent)
1045 ModuleGroupTable::cleanCache();
1048 if (COption::GetOptionString(
"main",
"event_log_group_edit",
"N") ===
"Y")
1066 foreach (
GetModuleEvents(
"main",
"OnBeforeGroupDelete",
true) as $arEvent)
1070 $err =
GetMessage(
"MAIN_BEFORE_DEL_ERR1") .
' ' . $arEvent[
'TO_NAME'];
1073 $err .=
': ' . $ex->GetString();
1085 CMain::DelGroupRight(
"", [
$ID]);
1089 UserGroupTable::deleteByFilter([
'=GROUP_ID' =>
$ID]);
1091 CUser::clearUserGroupCache();
1093 GroupTable::delete(
$ID);
1095 if (COption::GetOptionString(
"main",
"event_log_group_edit",
"N") ===
"Y")
1105 $res = static::GetGroupUserEx(
$ID);
1107 while ($r =
$res->Fetch())
1109 $arr[] = $r[
"USER_ID"];
1115 public static function GetGroupUserEx(
$ID)
1121 trigger_error(
"Group 2 contains all the users, the call was ignored.", E_USER_WARNING);
1128 $users = UserGroupTable::getList([
1129 'filter' => [
'=GROUP_ID' =>
$ID],
1130 'cache' => [
'ttl' => 3600],
1135 while ($user = $users->fetch())
1138 $dateFrom =
$user[
'DATE_ACTIVE_FROM'];
1140 $dateTo =
$user[
'DATE_ACTIVE_TO'];
1143 (empty($dateFrom) || $dateFrom->getTimestamp() <= $now)
1144 && (empty($dateTo) || $dateTo->getTimestamp() >= $now)
1149 'USER_ID' =>
$user[
'USER_ID'],
1150 'DATE_ACTIVE_FROM' => (string)$dateFrom,
1151 'DATE_ACTIVE_TO' => (
string)$dateTo,
1163 if (!is_array($grId))
1168 Collection::normalizeArrayValuesByInt($grId,
false);
1173 $groups = GroupSubordinateTable::query()
1174 ->setSelect([
'ID',
'AR_SUBGROUP_ID'])
1175 ->setCacheTtl(86400)
1180 while ($group =
$groups->fetch())
1182 $cache[$group[
'ID']] = explode(
',', $group[
'AR_SUBGROUP_ID']);
1185 foreach ($cache as $groupId => $subordinateGroups)
1187 if (in_array($groupId, $grId))
1194 Collection::normalizeArrayValuesByInt(
$result,
false);
1203 GroupSubordinateTable::delete($grId);
1205 if (is_array($arSubGroups))
1207 GroupSubordinateTable::add([
1209 'AR_SUBGROUP_ID' => implode(
',', $arSubGroups),
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);
1224 $sql_str .=
' AND T.MODULE_ID="' .
$DB->ForSQL(
$module_id) .
'"';
1227 $z =
$DB->Query($sql_str);
1230 while ($r =
$z->Fetch())
1232 if (!$r[
'EXTERNAL_ID'])
1234 $arr[$r[
'MODULE_ID']] = $r[
'TASK_ID'];
1247 return [
$arr, $ex_arr];
1256 if (COption::GetOptionString(
"main",
"event_log_module_access",
"N") ===
"Y")
1260 $rsTask =
$DB->Query(
"SELECT TASK_ID FROM b_group_task WHERE GROUP_ID=" .
$ID);
1261 while ($arTask = $rsTask->Fetch())
1263 $arOldTasks[] = $arTask[
"TASK_ID"];
1267 foreach (
$arr as $task_id)
1271 $aNewTasks[] = $task_id;
1274 $aDiff = array_diff($arOldTasks, $aNewTasks);
1277 $aDiff = array_diff($aNewTasks, $arOldTasks);
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);
1292 foreach (
$arr as $task_id)
1294 $sID .=
"," . intval($task_id);
1299 "INSERT INTO b_group_task (GROUP_ID, TASK_ID, EXTERNAL_ID) " .
1300 "SELECT '" .
$ID .
"', ID, '' " .
1302 "WHERE ID IN (" . $sID .
") "
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)
1315 $z =
$DB->Query($sql_str);
1319 while ($r =
$z->Fetch())
1321 if (!$r[
'EXTERNAL_ID'])
1323 $main_arr[$r[
'GROUP_ID']] = [
'ID' => $r[
'TASK_ID'],
'NAME' => $r[
'NAME']];
1327 if (!isset($ext_arr[$r[
'GROUP_ID']]))
1329 $ext_arr[$r[
'GROUP_ID']] = [];
1331 $ext_arr[$r[
'GROUP_ID']][] = [
'ID' => $r[
'TASK_ID'],
'NAME' => $r[
'NAME'],
'EXTERNAL_ID' => $r[
'EXTERNAL_ID']];
1340 return [$main_arr, $ext_arr];
1349 $sql_str =
"SELECT T.ID
1352 $r =
$DB->Query($sql_str);
1354 while ($arR = $r->Fetch())
1356 $arIds[] = $arR[
'ID'];
1359 if (COption::GetOptionString(
"main",
"event_log_module_access",
"N") ===
"Y")
1365 $rsTask =
$DB->Query(
"SELECT GROUP_ID, TASK_ID FROM b_group_task WHERE TASK_ID IN (" . implode(
",", $arIds) .
")");
1366 while ($arTask = $rsTask->Fetch())
1368 $arOldTasks[$arTask[
"GROUP_ID"]] = $arTask[
"TASK_ID"];
1372 foreach ($arOldTasks as $gr_id => $task_id)
1374 if ($task_id <> $arGroupTask[$gr_id][
'ID'])
1379 foreach ($arGroupTask as $gr_id => $oTask)
1381 if (intval($oTask[
'ID']) > 0 && !array_key_exists($gr_id, $arOldTasks))
1390 $sql_str =
"DELETE FROM b_group_task WHERE TASK_ID IN (" . implode(
",", $arIds) .
")";
1391 $DB->Query($sql_str);
1394 foreach ($arGroupTask as $gr_id => $oTask)
1396 if (intval($oTask[
'ID']) > 0)
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'])
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())
1421 if ($ar_task[
"TASK_ID"] > 0)
1423 return $ar_task[
"TASK_ID"];
1426 while ($ar_task = $dbr_tasks->Fetch());
1439 if (intval($permission) <= 0 && $permission !==
false)
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())
1445 $permission = $ar_task[
'ID'];
1449 $permission_letter =
'';
1450 if (intval($permission) > 0 || $permission ===
false)
1452 $DB->StartTransaction();
1454 $strSql =
"SELECT T.ID FROM b_task T WHERE T.MODULE_ID='" .
$DB->ForSql(
$module_id) .
"'";
1455 $dbr_tasks =
$DB->Query($strSql);
1457 while ($arTask = $dbr_tasks->Fetch())
1459 $arIds[] = $arTask[
'ID'];
1464 $strSql =
"DELETE FROM b_group_task WHERE GROUP_ID=" . intval($group_id) .
" AND TASK_ID IN (" . implode(
",", $arIds) .
")";
1465 $DB->Query($strSql);
1468 if (intval($permission) > 0)
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)
1484 $permission_letter = $permission;
1487 if ($permission_letter <>
'')
1509 if (strtolower(
$code) ==
'administrators')
1514 if (strtolower(
$code) ==
'everyone')
1519 $res = GroupTable::getRow([
1521 'filter' => [
'=STRING_ID' =>
$code],
1522 'cache' => [
'ttl' => 86400],
1527 return (
int)
$res[
'ID'];
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
static getConnection($name="")
static GetTasksForModule($module_id, $onlyMainTasks=true)
static SetTasksForModule($module_id, $arGroupTask)
CheckFields($arFields, $ID=false)
static GetFilterOperation($key)
static AddUsersToGroup(int $groupId, array $users)
static GetTasks($ID, $onlyMainTasks=true, $module_id=false)
static GetIDByCode($code)
static GetListEx($arOrder=["ID"=> "DESC"], $arFilter=[], $arGroupBy=false, $arNavStartParams=false, $arSelectFields=[])
static PrepareSql($arFields, $arOrder, $arFilter, $arGroupBy, $arSelectFields)
static GetList($by='c_sort', $order='asc', $arFilter=[], $SHOW_USERS_AMOUNT="N")
static GetModulePermission($group_id, $module_id)
static SetSubordinateGroups($grId, $arSubGroups=false)
static SetModulePermission($group_id, $module_id, $permission)
static SetTasks($ID, $arr)
static GetDropDownList($strSqlSearch="and ACTIVE='Y'", $strSqlOrder="ORDER BY C_SORT, NAME, ID")
static GetByID($ID, $SHOW_USERS_AMOUNT="N")
static GetSubordinateGroups($grId)
static Log($SEVERITY, $AUDIT_TYPE_ID, $MODULE_ID, $ITEM_ID, $DESCRIPTION=false, $SITE_ID=false)
static RecalculateForGroup($ID, $checkTime=true)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
if(!is_null($config))($config as $configItem)(! $configItem->isVisible()) $code
ExecuteModuleEventEx($arEvent, $arParams=[])
FmtDate($str_date, $format=false, $site=false, $bSearchInSitesOnly=false)
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
GetMessage($name, $aReplace=null)
CheckDateTime($datetime, $format=false)
MkDateTime($strDT, $format="d.m.Y H:i:s")
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
if(empty($signedUserToken)) $key
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']