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