static function onAfterUserUpdate(&$userFields): void
{
if (!self::checkUF())
{
return;
}
if (
(int)$userFields['ID'] <= 0
|| !isset($userFields['UF_DEPARTMENT'])
|| !ModuleManager::isModuleInstalled('intranet')
|| !Loader::includeModule('iblock')
)
{
return;
}
$oldGroupList = [];
$oldGroupAutoList = [];
$newGroupList = [];
$res = UserToGroupTable::getList([
'filter' => [
'USER_ID' => (int)$userFields['ID']
],
'select' => [ 'GROUP_ID', 'AUTO_MEMBER' ]
]);
while($relation = $res->fetch())
{
$oldGroupList[] = $relation['GROUP_ID'];
if ($relation['AUTO_MEMBER'] === 'Y')
{
$oldGroupAutoList[] = $relation['GROUP_ID'];
}
}
$oldGroupList = array_unique($oldGroupList);
$oldGroupAutoList = array_unique($oldGroupAutoList);
if (
!empty($userFields['UF_DEPARTMENT'])
&& is_array($userFields['UF_DEPARTMENT'])
)
{
$userFields['UF_DEPARTMENT'] = array_values($userFields['UF_DEPARTMENT']);
}
$departmentList = (
!is_array($userFields['UF_DEPARTMENT'])
|| empty($userFields['UF_DEPARTMENT'])
|| (int)$userFields['UF_DEPARTMENT'][0] <= 0
? []
: $userFields['UF_DEPARTMENT']
);
if (Loader::includeModule('intranet'))
{
$departmentList = array_merge($departmentList, CIntranetUtils::getSubordinateDepartments($userFields['ID'], false));
}
$departmentList = array_unique($departmentList);
if (!empty($departmentList))
{
$newGroupList = self::getConnectedGroups($departmentList);
}
$groupListPlus = array_diff($newGroupList, $oldGroupList);
$groupListMinus = array_diff($oldGroupAutoList, $newGroupList);
$groupListMinus = array_diff($groupListMinus, $groupListPlus);
if (!empty($groupListMinus))
{
$res = UserToGroupTable::getList([
'filter' => [
'=USER_ID' => (int)$userFields['ID'],
'@GROUP_ID' => $groupListMinus,
'@ROLE' => [ UserToGroupTable::ROLE_OWNER, UserToGroupTable::ROLE_MODERATOR, UserToGroupTable::ROLE_USER ],
'AUTO_MEMBER' => 'Y'
],
'select' => [ 'ID' ],
]);
while($relation = $res->fetch())
{
CSocNetUserToGroup::delete($relation['ID']);
}
}
$changeList = $addList = $noChangeList = [];
if (!empty($groupListPlus))
{
$res = UserToGroupTable::getList([
'filter' => [
'=USER_ID' => (int)$userFields["ID"],
'@GROUP_ID' => $groupListPlus,
'@ROLE' => [ UserToGroupTable::ROLE_OWNER, UserToGroupTable::ROLE_MODERATOR, UserToGroupTable::ROLE_USER ],
],
'select' => [ 'ID', 'GROUP_ID', 'AUTO_MEMBER' ],
]);
while ($relation = $res->fetch())
{
if (
$relation['AUTO_MEMBER'] === 'Y'
|| $relation['ROLE'] === UserToGroupTable::ROLE_OWNER
)
{
$noChangeList[] = $relation['GROUP_ID'];
}
else // UserToGroupTable::ROLE_MODERATOR, UserToGroupTable::ROLE_USER, AUTO_MEMBER = 'N'
{
$noChangeList[] = $relation['GROUP_ID'];
self::changeRelationAutoMembership([
'RELATION_ID' => (int)$relation['ID'],
'USER_ID' => (int)$userFields["ID"],
'GROUP_ID' => (int)$relation['GROUP_ID'],
'ROLE' => $relation['ROLE'],
'VALUE' => 'Y',
'NOTIFY' => 'N',
]);
}
}
$groupListPlus = array_diff($groupListPlus, $noChangeList);
}
if (!empty($groupListPlus))
{
$res = UserToGroupTable::getList([
'filter' => [
'=USER_ID' => (int)$userFields['ID'],
'@GROUP_ID' => $groupListPlus,
'@ROLE' => [ UserToGroupTable::ROLE_REQUEST, UserToGroupTable::ROLE_BAN ],
'AUTO_MEMBER' => 'N',
],
'select' => [ 'ID', 'USER_ID', 'GROUP_ID' ],
]);
while ($relation = $res->fetch())
{
$changeList[] = (int)$relation['GROUP_ID'];
self::changeRelationAutoMembership([
'RELATION_ID' => (int)$relation['ID'],
'USER_ID' => (int)$relation['USER_ID'],
'GROUP_ID' => (int)$relation['GROUP_ID'],
'ROLE' => UserToGroupTable::ROLE_USER,
'VALUE' => 'Y',
]);
}
$addList = array_diff($groupListPlus, $changeList);
}
foreach ($addList as $addGroupId)
{
self::addRelationAutoMembership([
'USER_ID' => (int)$userFields['ID'],
'GROUP_ID' => $addGroupId,
'ROLE' => UserToGroupTable::ROLE_USER,
'VALUE' => 'Y',
]);
}
}