• Модуль: socialnetwork
  • Путь к файлу: ~/bitrix/modules/socialnetwork/lib/helper/workgroup.php
  • Класс: BitrixSocialnetworkHelperWorkgroup
  • Вызов: Workgroup::getAdditionalData
static function getAdditionalData(array $params = []): array
{
	global $USER;

	$ids = (
		is_array($params['ids'])
			? array_filter(
				array_map(
					static function($val) { return (int)$val; },
					$params['ids']
				),
				static function ($val) { return $val > 0; }
			)
			: []
	);
	$features = (
		is_array($params['features'])
			? array_filter(
				array_map(
					static function($val) { return trim((string)$val); },
					$params['features']
				),
				static function ($val) { return !empty($val); }
			)
			: []
	);
	$mandatoryFeatures = (
		is_array($params['mandatoryFeatures'])
			? array_filter(
				array_map(
					static function($val) { return trim((string)$val); },
					$params['mandatoryFeatures']
				),
				static function ($val) { return !empty($val); }
			)
		: []
	);
	$currentUserId = (int)($params['currentUserId'] ?? $USER->getId());
	if (empty($ids))
	{
		return $ids;
	}

	$featuresSettings = CSocNetAllowed::getAllowedFeatures();

	$result = [];
	$userRoles = [];

	$res = UserToGroupTable::getList([
		'filter' => [
			'GROUP_ID' => $ids,
			'USER_ID' => $currentUserId,
		],
		'select' => [ 'GROUP_ID', 'ROLE', 'INITIATED_BY_TYPE' ]

	]);
	while ($relationFields = $res->fetch())
	{
		$userRoles[(int)$relationFields['GROUP_ID']] = [
			'ROLE' => $relationFields['ROLE'],
			'INITIATED_BY_TYPE' => $relationFields['INITIATED_BY_TYPE'],
		];
	}

	foreach ($features as $feature)
	{
		$activeFeaturesList = CSocNetFeatures::isActiveFeature(SONET_ENTITY_GROUP, $ids, $feature);
		$filteredIds = array_keys(array_filter($activeFeaturesList, static function($val) { return $val; }));

		if (
			empty($filteredIds)
			|| !isset($featuresSettings[$feature])
		)
		{
			$permissions = [];
		}
		else
		{
			$minOperationList = $featuresSettings[$feature]['minoperation'];
			if (!is_array($minOperationList))
			{
				$minOperationList = [ $minOperationList ];
			}

			$permissions = [];
			foreach ($minOperationList as $minOperation)
			{
				$operationPermissions = CSocNetFeaturesPerms::getOperationPerm(SONET_ENTITY_GROUP, $filteredIds, $feature, $minOperation);
				foreach ($operationPermissions as $groupId => $role)
				{
					if (
						!isset($permissions[$groupId])
						|| $role > $permissions[$groupId]
					)
					{
						$permissions[$groupId] = $role;
					}
				}
			}
		}

		foreach ($ids as $id)
		{
			if (!isset($result[$id]))
			{
				$result[$id] = [];
			}

			if (!isset($result[$id]['FEATURES']))
			{
				$result[$id]['FEATURES'] = [];
			}

			if (
				in_array($feature, $mandatoryFeatures, true)
				|| (
					isset($permissions[$id])
					&& (
						!in_array($permissions[$id], UserToGroupTable::getRolesMember(), true)
						|| (
							isset($userRoles[$id])
							&& $userRoles[$id]['ROLE'] <= $permissions[$id]
						)
					)
				)
			)
			{
				$result[$id]['FEATURES'][] = $feature;
			}
		}
	}

	foreach ($ids as $id)
	{
		$result[$id]['ROLE'] = ($userRoles[$id]['ROLE'] ?? '');
		$result[$id]['INITIATED_BY_TYPE'] = ($userRoles[$id]['INITIATED_BY_TYPE'] ?? '');
	}

	return $result;
}