• Модуль: socialnetwork
  • Путь к файлу: ~/bitrix/modules/socialnetwork/lib/integration/ui/entityselector/projectprovider.php
  • Класс: BitrixSocialnetworkIntegrationUIEntitySelectorProjectProvider
  • Вызов: ProjectProvider::filterByFeatures
static function filterByFeatures(
	EO_Workgroup_Collection $projects, array $features, int $userId, string $siteId
)
{
	if (empty($features))
	{
		return $projects;
	}

	$projectIds = $projects->getIdList();
	foreach ($features as $feature => $operations)
	{
		$availableIds = CSocNetFeatures::isActiveFeature(SONET_ENTITY_GROUP, $projectIds, $feature);
		if (!is_array($availableIds))
		{
			return new EO_Workgroup_Collection();
		}

		$hasUnavailableId = false;
		foreach ($availableIds as $projectId => $isAvailable)
		{
			if (!$isAvailable)
			{
				$hasUnavailableId = true;
				$projects->removeByPrimary($projectId);
			}
		}

		if ($hasUnavailableId)
		{
			$projectIds = $projects->getIdList();
		}
	}

	$isUserModuleAdmin = CSocNetUser::isUserModuleAdmin($userId, $siteId);
	$availableIdsByFeature = [];

	// Features have logic 'AND', whereas operations have logic 'OR'.
	foreach ($features as $feature => $operations)
	{
		if (!is_array($operations) || empty($operations))
		{
			$availableIdsByFeature[] = $projectIds;
			continue;
		}

		$availableFeatureIds = [];
		$ids = $projectIds;
		foreach ($operations as $operation)
		{
			if (empty($ids))
			{
				break;
			}

			$availableIds = CSocNetFeaturesPerms::canPerformOperation(
				$userId,
				SONET_ENTITY_GROUP,
				$ids,
				$feature,
				$operation,
				$isUserModuleAdmin
			);

			if (!is_array($availableIds))
			{
				continue;
			}

			foreach ($availableIds as $projectId => $isAvailable)
			{
				if ($isAvailable)
				{
					$availableFeatureIds[] = $projectId;
				}
			}

			$ids = array_diff($ids, $availableFeatureIds);
		}

		$availableIdsByFeature[] = $availableFeatureIds;
	}

	$availableIds = [];
	if (!empty($availableIdsByFeature))
	{
		$availableIds = (
			count($availableIdsByFeature) > 1
				? call_user_func_array('array_intersect', $availableIdsByFeature)
				: $availableIdsByFeature[0]
		);
	}

	if (empty($availableIds))
	{
		return new EO_Workgroup_Collection();
	}

	$wrongIds = array_diff($projects->getIdList(), $availableIds);
	foreach ($wrongIds as $wrongId)
	{
		$projects->removeByPrimary($wrongId);
	}

	return $projects;
}