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