- Модуль: main
- Путь к файлу: ~/bitrix/modules/main/classes/general/user.php
- Класс: CAllUser
- Вызов: CAllUser::SetUserGroup
static function SetUserGroup($USER_ID, $arGroups, $newUser = false)
{
$connection = MainApplication::getConnection();
$USER_ID = intval($USER_ID);
if ($USER_ID === 0)
{
return false;
}
//remember previous groups of the user
$aPrevGroups = [];
$res = static::GetUserGroupList($USER_ID);
while ($res_arr = $res->Fetch())
{
if ($res_arr["GROUP_ID"] != 2)
{
$aPrevGroups[$res_arr["GROUP_ID"]] = $res_arr;
}
}
$inserted = [];
$values = [];
if (is_array($arGroups))
{
foreach ($arGroups as $group)
{
if (!is_array($group))
{
$group = ["GROUP_ID" => $group];
}
//we must preserve fields order for the insertion sql
$groupFields = [
"GROUP_ID" => $group["GROUP_ID"],
"DATE_ACTIVE_FROM" => ($group["DATE_ACTIVE_FROM"] ?? ''),
"DATE_ACTIVE_TO" => ($group["DATE_ACTIVE_TO"] ?? ''),
];
$group_id = intval($groupFields["GROUP_ID"]);
if ($group_id > 0 && $group_id != 2 && !isset($inserted[$group_id]))
{
$arInsert = $GLOBALS['DB']->PrepareInsert("b_user_group", $groupFields);
$values[] = "(" . $USER_ID . ", " . $arInsert[1] . ")";
$inserted[$group_id] = $groupFields;
}
}
}
$connection->startTransaction();
$connection->query("DELETE FROM b_user_group WHERE USER_ID=" . $USER_ID);
if (!empty($values))
{
$strSql = $connection->getSqlHelper()->getInsertIgnore("b_user_group", "(USER_ID, GROUP_ID, DATE_ACTIVE_FROM, DATE_ACTIVE_TO)", "VALUES " . implode(", ", $values));
$connection->query($strSql);
}
$connection->commitTransaction();
static::clearUserGroupCache($USER_ID);
foreach (GetModuleEvents('main', 'OnAfterSetUserGroup', true) as $arEvent)
{
ExecuteModuleEventEx($arEvent, [$USER_ID, $inserted]);
}
if ($aPrevGroups != $inserted)
{
if (!$newUser)
{
$authActionCommon = false;
$now = new MainTypeDateTime();
foreach ($inserted as $group)
{
foreach (["DATE_ACTIVE_FROM", "DATE_ACTIVE_TO"] as $field)
{
if ($group[$field] != '')
{
$date = MainTypeDateTime::createFromUserTime($group[$field]);
if ($date->getTimestamp() > $now->getTimestamp())
{
//group membership is in the future, we need separate records for each group
MainUserAuthActionTable::addUpdateAction($USER_ID, $date);
}
else
{
$authActionCommon = true;
}
}
else
{
$authActionCommon = true;
}
}
}
if ($authActionCommon)
{
//one action for all groups without dates in the future
MainUserAuthActionTable::addUpdateAction($USER_ID);
}
}
if (Option::get('main', 'event_log_user_groups', 'N') === 'Y')
{
$UserName = '';
$rsUser = static::GetByID($USER_ID);
if ($arUser = $rsUser->GetNext())
{
$UserName = ($arUser["NAME"] != '' || $arUser["LAST_NAME"] != '') ? trim($arUser["NAME"] . ' ' . $arUser["LAST_NAME"]) : $arUser["LOGIN"];
}
$res_log = [
"groups" => serialize($aPrevGroups) . " => " . serialize($inserted),
"user" => $UserName,
];
CEventLog::Log('SECURITY', 'USER_GROUP_CHANGED', 'main', $USER_ID, serialize($res_log));
}
}
return null;
}