• Модуль: 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;
}