- Модуль: extranet
- Путь к файлу: ~/bitrix/modules/extranet/classes/general/extranet.php
- Класс: CExtranet
- Вызов: CExtranet::GetSitesByLogDestinations
static function GetSitesByLogDestinations($arRights, $authorId = false, $explicit_site_id = false): array
{
static $extranet_site_id = null;
static $default_site_id = null;
static $arIntranetSiteID = null;
$arSiteID = array();
if (!is_array($arRights))
{
return $arSiteID;
}
if ($extranet_site_id === null)
{
$extranet_site_id = self::GetExtranetSiteID();
$arIntranetSiteID = array();
$rsSite = CSite::GetList("sort", "desc", array("ACTIVE" => "Y"));
while ($arSite = $rsSite->Fetch())
{
if ($arSite["LID"] == $extranet_site_id)
{
continue;
}
$arIntranetSiteID[] = $arSite["LID"];
}
$default_site_id = CSite::GetDefSite();
}
$default_site_id = (
$explicit_site_id
&& $explicit_site_id != $extranet_site_id
? $explicit_site_id
: $default_site_id
);
$arUserId = array();
$arSonetGroupId = array();
foreach ($arRights as $right_tmp)
{
if (preg_match('/^U(d+)$/', $right_tmp, $matches))
{
$arUserId[] = $matches[1];
}
elseif (
preg_match('/^SG(d+)$/', $right_tmp, $matches)
|| preg_match('/^SG(d+)_'.SONET_ROLES_OWNER.'$/', $right_tmp, $matches)
|| preg_match('/^SG(d+)_'.SONET_ROLES_MODERATOR.'$/', $right_tmp, $matches)
|| preg_match('/^SG(d+)_'.SONET_ROLES_USER.'$/', $right_tmp, $matches)
)
{
$arSonetGroupId[] = $matches[1];
}
}
if (!empty($arUserId))
{
$rsUser = CUser::GetList(
'',
'',
[
'UF_DEPARTMENT' => false,
'ID' => implode('|', $arUserId),
'=IS_REAL_USER' => 'Y',
],
[
'FIELDS' => [ 'ID' ]
]
);
$i = 0;
$arExtranetUserId = array();
while ($arUser = $rsUser->Fetch()) // if any extranet user
{
if ($i == 0)
{
$arSiteID[] = $extranet_site_id; // only once
}
$arExtranetUserId[] = $arUser["ID"];
}
$ar = array_diff($arUserId, $arExtranetUserId);
if (!empty($ar)) // there are non-extranet_users
{
$arSiteID[] = $default_site_id;
}
}
if (
!empty($arSonetGroupId)
&& Loader::includeModule('socialnetwork')
)
{
$rsGroupSite = CSocNetGroup::GetSite($arSonetGroupId);
while($arGroupSite = $rsGroupSite->Fetch())
{
$ar = array_diff($arIntranetSiteID, $arSiteID);
if (
empty($ar)
&& in_array($extranet_site_id, $arSiteID)
)
{
break;
}
if (!in_array($arGroupSite["LID"], $arSiteID))
{
$arSiteID[] = $arGroupSite["LID"];
}
}
}
$currentSiteId = ($explicit_site_id ?: SITE_ID);
if (
in_array($currentSiteId, $arIntranetSiteID)
&& !in_array($currentSiteId, $arSiteID)
)
{
$arSiteID[] = $currentSiteId;
}
return array_unique($arSiteID);
}