• Модуль: socialnetwork
  • Путь к файлу: ~/bitrix/modules/socialnetwork/lib/controller/workgroup.php
  • Класс: BitrixSocialnetworkControllerWorkgroup
  • Вызов: Workgroup::getGridPopupMembersAction
public function getGridPopupMembersAction(
	int $groupId,
	string $type,
	int $page,
	string $componentName = '',
	string $signedParameters = ''
): ?array
{
	if (!Loader::includeModule('socialnetwork'))
	{
		$this->addError(new Error('SONET_CONTROLLER_MODULE_NOT_INSTALLED', 'SONET_CONTROLLER_MODULE_NOT_INSTALLED'));
		return null;
	}

	if (
		$groupId <= 0
		|| !HelperWorkgroupAccess::canView([
			'groupId' => $groupId,
			'checkAdminSession' => ($this->getScope() !== Controller::SCOPE_REST),
		])
	)
	{
		$this->addError(
			new Error(
				Loc::getMessage('SONET_CONTROLLER_WORKGROUP_EMPTY'),
				'SONET_CONTROLLER_WORKGROUP_EMPTY'
			)
		);

		return null;
	}

	$unsignedParameters = [];
	if (
		$componentName !== ''
		&& $signedParameters !== ''
	)
	{
		$unsignedParameters = BitrixMainComponentParameterSigner::unsignParameters(
			$componentName,
			$signedParameters
		);
		if (!is_array($unsignedParameters))
		{
			$unsignedParameters = [];
		}
	}

	$rolesMap = [
		'all' => [
			UserToGroupTable::ROLE_OWNER,
			UserToGroupTable::ROLE_MODERATOR,
			UserToGroupTable::ROLE_USER,
		],
		'heads' => [
			UserToGroupTable::ROLE_OWNER,
			UserToGroupTable::ROLE_MODERATOR,
		],
		'members' => [
			UserToGroupTable::ROLE_USER,
		],
		'scrumTeam' => [
			UserToGroupTable::ROLE_OWNER,
			UserToGroupTable::ROLE_MODERATOR,
		],
	];
	$limit = 10;

	$query = new Query(UserToGroupTable::getEntity());
	$records = $query
		->setSelect([
			'GROUP_ID',
			'GROUP',
			'USER_ID',
			'ROLE',
			'INITIATED_BY_TYPE',
			'AUTO_MEMBER',
			'NAME' => 'USER.NAME',
			'LAST_NAME' => 'USER.LAST_NAME',
			'SECOND_NAME' => 'USER.SECOND_NAME',
			'LOGIN' => 'USER.LOGIN',
			'PERSONAL_PHOTO' => 'USER.PERSONAL_PHOTO',
		])
		->where('GROUP_ID', $groupId)
		->whereIn('ROLE', $rolesMap[$type])
		->setLimit($limit)
		->setOffset(($page - 1) * $limit)
		->exec()->fetchCollection();

	$isScrumMembers = ($type === 'scrumTeam');
	if ($isScrumMembers)
	{
		$query->addSelect('GROUP.SCRUM_MASTER_ID', 'SCRUM_MASTER_ID');
	}

	$imageIds = [];
	$resultMembers = [];

	foreach ($records as $member)
	{
		$imageIds[$member->get('USER_ID')] = $member->get('USER')->get('PERSONAL_PHOTO');
		$resultMembers[] = $member;
	}

	$imageIds = array_filter(
		$imageIds,
		static function ($id) { return (int)$id > 0; }
	);
	$avatars = HelperUIGridWorkgroupMembers::getUserAvatars($imageIds);
	$pathToUser = ($unsignedParameters['PATH_TO_USER'] ?? HelperPath::get('user_profile'));
	$userNameTemplate = ($unsignedParameters['NAME_TEMPLATE'] ?? CSite::getNameFormat());
	$isIntranetInstalled = ModuleManager::isModuleInstalled('intranet');

	$members = [];

	foreach ($resultMembers as $member)
	{
		$id = $member->get('USER_ID');
		$userNameFormatted = CUser::formatName($userNameTemplate, [
			'NAME' => $member->get('USER')->get('NAME'),
			'LAST_NAME' => $member->get('USER')->get('LAST_NAME'),
			'SECOND_NAME' => $member->get('USER')->get('SECOND_NAME'),
			'LOGIN' => $member->get('USER')->get('LOGIN'),
		], $isIntranetInstalled);

		$userUrl = CComponentEngine::makePathFromTemplate($pathToUser, [
			'user_id' => $id,
			'id' => $id,
		]);

		$members[] = [
			'ID' => $id,
			'PHOTO' => $avatars[$imageIds[$id] ?? null] ?? '',
			'HREF' => $userUrl,
			'FORMATTED_NAME' => $userNameFormatted,
			'ROLE' => ($isScrumMembers ? $this->getScrumRole($member) : $member->get('ROLE')),
		];

		if ($isScrumMembers)
		{
			if (
				$member->get('ROLE') === UserToGroupTable::ROLE_OWNER
				&& $member->get('USER_ID') === $member->get('GROUP')->get('SCRUM_MASTER_ID')
			)
			{
				$members[] = [
					'ID' => $id,
					'PHOTO' => $avatars[$imageIds[$id] ?? null] ?? '',
					'HREF' => $userUrl,
					'FORMATTED_NAME' => $userNameFormatted,
					'ROLE' => 'M',
				];
			}
		}
	}

	return $members;
}