static function FormatDestinationFromRights($arRights, $arParams, &$iMoreCount = false)
{
static $arDepartmentsStaticCache = array();
if (empty($arRights))
{
return array();
}
$arDestination = array();
$arSonetGroups = array();
$bCheckPermissions = (
!array_key_exists("CHECK_PERMISSIONS_DEST", $arParams)
|| $arParams["CHECK_PERMISSIONS_DEST"] !== "N"
);
$htmlEncode = (
!array_key_exists("HTML_ENCODE", $arParams)
|| $arParams["HTML_ENCODE"] !== "N"
);
if (!function_exists("__DestinationRightsSort"))
{
function __DestinationRightsSort($a, $b)
{
if ($a == $b)
{
return 0;
}
if (preg_match('/^USd+$/', $a))
{
return -1;
}
elseif (in_array($a, array("G2", "AU")))
{
if (in_array($b, array("G2", "AU")))
{
return 0;
}
if (preg_match('/^USd+$/', $b))
{
return 1;
}
return -1;
}
elseif (preg_match('/^CRMDEALd+$/', $a))
{
if (preg_match('/^CRMDEALd+$/', $b))
{
return 0;
}
if (
preg_match('/^USd+$/', $b)
|| in_array($b, array("G2", "AU"))
)
{
return 1;
}
return -1;
}
elseif (preg_match('/^CRMCONTACTd+$/', $a))
{
if (preg_match('/^CRMCONTACTd+$/', $b))
{
return 0;
}
if (
preg_match('/^USd+$/', $b)
|| in_array($b, array("G2", "AU"))
|| preg_match('/^CRMDEALd+$/', $b)
)
{
return 1;
}
return -1;
}
elseif (preg_match('/^CRMCOMPANYd+$/', $a))
{
if (preg_match('/^CRMCOMPANYd+$/', $b))
{
return 0;
}
if (
preg_match('/^USd+$/', $b)
|| in_array($b, array("G2", "AU"))
|| preg_match('/^CRMDEALd+$/', $b)
|| preg_match('/^CRMCONTACTd+$/', $b)
)
{
return 1;
}
return -1;
}
elseif (preg_match('/^CRMLEADd+$/', $a))
{
if (preg_match('/^CRMLEADd+$/', $b))
{
return 0;
}
if (
preg_match('/^USd+$/', $b)
|| in_array($b, array("G2", "AU"))
|| preg_match('/^CRMDEALd+$/', $b)
|| preg_match('/^CRMCONTACTd+$/', $b)
|| preg_match('/^CRMCOMPANYd+$/', $b)
)
{
return 1;
}
return -1;
}
elseif (preg_match('/^CRMDYNAMICd+ENTITYd+$/', $a))
{
if (preg_match('/^CRMDYNAMICd+ENTITYd+$/', $b))
{
return 0;
}
if (
preg_match('/^USd+$/', $b)
|| in_array($b, array("G2", "AU"))
|| preg_match('/^CRMDEALd+$/', $b)
|| preg_match('/^CRMCONTACTd+$/', $b)
|| preg_match('/^CRMCOMPANYd+$/', $b)
|| preg_match('/^CRMLEADd+$/', $b)
)
{
return 1;
}
return -1;
}
elseif (preg_match('/^CRMSUSDYNAMICd+ENTITYd+$/', $a))
{
if (preg_match('/^CRMSUSDYNAMICd+ENTITYd+$/', $b))
{
return 0;
}
if (
preg_match('/^USd+$/', $b)
|| in_array($b, array("G2", "AU"))
|| preg_match('/^CRMDEALd+$/', $b)
|| preg_match('/^CRMCONTACTd+$/', $b)
|| preg_match('/^CRMCOMPANYd+$/', $b)
|| preg_match('/^CRMLEADd+$/', $b)
|| preg_match('/^CRMDYNAMICd+ENTITYd+$/', $b)
)
{
return 1;
}
return -1;
}
elseif (preg_match('/^SGd+_'.SONET_ROLES_USER.'$/', $a))
{
if (preg_match('/^SGd+_'.SONET_ROLES_USER.'$/', $b))
{
return 0;
}
if (
preg_match('/^USd+$/', $b)
|| in_array($b, array("G2", "AU"))
|| preg_match('/^CRMDEALd+$/', $b)
|| preg_match('/^CRMCONTACTd+$/', $b)
|| preg_match('/^CRMCOMPANYd+$/', $b)
|| preg_match('/^CRMLEADd+$/', $b)
|| preg_match('/^CRMDYNAMICd+ENTITYd+$/', $b)
|| preg_match('/^CRMSUSDYNAMICd+ENTITYd+$/', $b)
)
{
return 1;
}
return -1;
}
elseif (preg_match('/^SGd+_'.SONET_ROLES_MODERATOR.'$/', $a))
{
if (preg_match('/^SGd+_'.SONET_ROLES_MODERATOR.'$/', $b))
{
return 0;
}
if (
preg_match('/^USd+$/', $b)
|| in_array($b, array("G2", "AU"))
|| preg_match('/^SGd+_'.SONET_ROLES_USER.'$/', $b)
|| preg_match('/^CRMDEALd+$/', $b)
|| preg_match('/^CRMCONTACTd+$/', $b)
|| preg_match('/^CRMCOMPANYd+$/', $b)
|| preg_match('/^CRMLEADd+$/', $b)
|| preg_match('/^CRMDYNAMICd+ENTITYd+$/', $b)
|| preg_match('/^CRMSUSDYNAMICd+ENTITYd+$/', $b)
)
{
return 1;
}
return -1;
}
elseif (preg_match('/^SGd+_'.SONET_ROLES_OWNER.'$/', $a))
{
if (preg_match('/^SGd+_'.SONET_ROLES_OWNER.'$/', $b))
{
return 0;
}
if (
preg_match('/^USd+$/', $b)
|| in_array($b, array("G2", "AU"))
|| preg_match('/^SGd+_'.SONET_ROLES_USER.'$/', $b)
|| preg_match('/^SGd+_'.SONET_ROLES_MODERATOR.'$/', $b)
|| preg_match('/^CRMDEALd+$/', $b)
|| preg_match('/^CRMCONTACTd+$/', $b)
|| preg_match('/^CRMCOMPANYd+$/', $b)
|| preg_match('/^CRMLEADd+$/', $b)
|| preg_match('/^CRMDYNAMICd+ENTITYd+$/', $b)
|| preg_match('/^CRMSUSDYNAMICd+ENTITYd+$/', $b)
)
{
return 1;
}
return -1;
}
elseif (preg_match('/^Dd+$/', $a))
{
if (preg_match('/^Dd+$/', $b))
{
return 0;
}
if (
preg_match('/^USd+$/', $b)
|| in_array($b, array("G2", "AU"))
|| preg_match('/^SGd+_'.SONET_ROLES_USER.'$/', $b)
|| preg_match('/^SGd+_'.SONET_ROLES_MODERATOR.'$/', $b)
|| preg_match('/^SGd+_'.SONET_ROLES_OWNER.'$/', $b)
|| preg_match('/^CRMDEALd+$/', $b)
|| preg_match('/^CRMCONTACTd+$/', $b)
|| preg_match('/^CRMCOMPANYd+$/', $b)
|| preg_match('/^CRMLEADd+$/', $b)
|| preg_match('/^CRMDYNAMICd+ENTITYd+$/', $b)
|| preg_match('/^CRMSUSDYNAMICd+ENTITYd+$/', $b)
)
{
return 1;
}
return -1;
}
elseif (preg_match('/^DRd+$/', $a))
{
if (preg_match('/^DRd+$/', $b))
{
return 0;
}
if (
preg_match('/^USd+$/', $b)
|| in_array($b, array("G2", "AU"))
|| preg_match('/^SGd+_'.SONET_ROLES_USER.'$/', $b)
|| preg_match('/^SGd+_'.SONET_ROLES_MODERATOR.'$/', $b)
|| preg_match('/^SGd+_'.SONET_ROLES_OWNER.'$/', $b)
|| preg_match('/^Dd+$/', $b)
|| preg_match('/^CRMDEALd+$/', $b)
|| preg_match('/^CRMCONTACTd+$/', $b)
|| preg_match('/^CRMCOMPANYd+$/', $b)
|| preg_match('/^CRMLEADd+$/', $b)
|| preg_match('/^CRMDYNAMICd+ENTITYd+$/', $b)
|| preg_match('/^CRMSUSDYNAMICd+ENTITYd+$/', $b)
)
{
return 1;
}
return -1;
}
elseif(preg_match('/^Ud+$/', $a))
{
if (preg_match('/^Ud+$/', $b))
{
return 0;
}
if (
preg_match('/^USd+$/', $b)
|| in_array($b, [ "G2", "AU" ])
|| preg_match('/^SGd+_'.SONET_ROLES_USER.'$/', $b)
|| preg_match('/^SGd+_'.SONET_ROLES_MODERATOR.'$/', $b)
|| preg_match('/^SGd+_'.SONET_ROLES_OWNER.'$/', $b)
|| preg_match('/^Dd+$/', $b)
|| preg_match('/^DRd+$/', $b)
|| preg_match('/^CRMDEALd+$/', $b)
|| preg_match('/^CRMCONTACTd+$/', $b)
|| preg_match('/^CRMCOMPANYd+$/', $b)
|| preg_match('/^CRMLEADd+$/', $b)
|| preg_match('/^CRMDYNAMICd+ENTITYd+$/', $b)
|| preg_match('/^CRMSUSDYNAMICd+ENTITYd+$/', $b)
)
{
return 1;
}
return -1;
}
elseif(preg_match('/^Gd+$/', $a))
{
if (preg_match('/^Gd+$/', $b))
{
return 0;
}
if (
preg_match('/^USd+$/', $b)
|| in_array($b, [ "G2", "AU" ])
|| preg_match('/^SGd+_'.SONET_ROLES_USER.'$/', $b)
|| preg_match('/^SGd+_'.SONET_ROLES_MODERATOR.'$/', $b)
|| preg_match('/^SGd+_'.SONET_ROLES_OWNER.'$/', $b)
|| preg_match('/^Dd+$/', $b)
|| preg_match('/^DRd+$/', $b)
|| preg_match('/^Ud+$/', $b)
|| preg_match('/^CRMDEALd+$/', $b)
|| preg_match('/^CRMCONTACTd+$/', $b)
|| preg_match('/^CRMCOMPANYd+$/', $b)
|| preg_match('/^CRMLEADd+$/', $b)
|| preg_match('/^CRMDYNAMICd+ENTITYd+$/', $b)
|| preg_match('/^CRMSUSDYNAMICd+ENTITYd+$/', $b)
)
{
return 1;
}
return -1;
}
else
{
return 0;
}
}
}
$arRights = array_unique($arRights);
usort($arRights, "__DestinationRightsSort");
$cnt = 0;
$bAll = false;
$bJustCount = false;
$arGroupIdToGet = array();
$arUserIdToGet = array();
$arDepartmentIdToGet = array();
$arSonetGroupIdToGet = array();
$avatarSize = (isset($arParams['AVATAR_SIZE']) ? (int)$arParams['AVATAR_SIZE'] : 100);
$arParams["DESTINATION_LIMIT"] = !isset($arParams["DESTINATION_LIMIT"]) || intval($arParams["DESTINATION_LIMIT"]) <= 0 ? 3 : $arParams["DESTINATION_LIMIT"];
$arModuleEvents = array();
$db_events = GetModuleEvents("socialnetwork", "OnSocNetLogFormatDestination");
while ($arEvent = $db_events->Fetch())
{
$arModuleEvents[] = $arEvent;
}
foreach ($arRights as $right_tmp)
{
if ($cnt >= $arParams["DESTINATION_LIMIT"])
{
$bJustCount = true;
}
if (
$right_tmp === "G1"
&& count($arRights) > 1
)
{
continue;
}
if (
preg_match('/^USd+$/', $right_tmp, $matches)
|| in_array($right_tmp, array("G2", "AU"))
)
{
if ($bAll)
{
continue;
}
if (
isset($arParams["USE_ALL_DESTINATION"])
&& $arParams["USE_ALL_DESTINATION"]
&& in_array($right_tmp, array("G2", "AU"))
)
{
continue;
}
if (!$bJustCount)
{
$destinationTitle = (
ModuleManager::isModuleInstalled('intranet')
? GetMessage("SONET_GL_DESTINATION_G2")
: GetMessage("SONET_GL_DESTINATION_G2_BSM")
);
$arDestination[] = array(
"STYLE" => "all-users",
"TITLE" => ($htmlEncode ? htmlspecialcharsEx($destinationTitle) : $destinationTitle)
);
}
$bAll = true;
$cnt++;
}
elseif (preg_match('/^G(d+)$/', $right_tmp, $matches))
{
$cnt++;
if (!$bJustCount)
{
$arGroupIdToGet[] = $matches[1];
}
}
elseif (preg_match('/^U(d+)$/', $right_tmp, $matches))
{
if (
array_key_exists("CREATED_BY", $arParams)
&& intval($arParams["CREATED_BY"]) > 0
&& $arParams["CREATED_BY"] == $matches[1]
)
{
continue;
}
$cnt++;
if (!$bJustCount)
{
$arUserIdToGet[] = $matches[1];
}
}
elseif (
(
preg_match('/^D(d+)$/', $right_tmp, $matches)
|| preg_match('/^DR(d+)$/', $right_tmp, $matches)
)
&& CModule::IncludeModule("iblock")
)
{
$cnt++;
if (!$bJustCount)
{
$arDepartmentIdToGet[] = $matches[1];
}
}
elseif (
preg_match('/^SG(d+)_'.SONET_ROLES_USER.'$/', $right_tmp, $matches)
|| preg_match('/^SG(d+)$/', $right_tmp, $matches)
)
{
if (
array_key_exists($matches[1], $arSonetGroups)
&& is_array($arSonetGroups[$matches[1]])
&& in_array(SONET_ROLES_USER, $arSonetGroups[$matches[1]])
)
{
continue;
}
$cnt++;
if (!$bJustCount)
{
// already cached
$workgroupFields = CSocNetGroup::getById($matches[1], $bCheckPermissions);
if ($workgroupFields)
{
$avatarUrl = (
isset($arParams['GET_AVATARS']) && (bool)$arParams['GET_AVATARS']
? self::getResizedAvatarUrl([
'fileId' => (int)$workgroupFields['IMAGE_ID'],
'avatarSize' => $avatarSize,
])
: ''
);
$arDestination[] = array(
"TYPE" => "SG",
"ID" => $workgroupFields["ID"],
"STYLE" => "sonetgroups",
"TITLE" => ($htmlEncode ?
$workgroupFields["NAME"]
: htmlspecialcharsback($workgroupFields["NAME"])
),
"URL" => str_replace(
"#group_id#",
$workgroupFields["ID"],
$arParams["PATH_TO_GROUP"] ?? ''
),
"IS_EXTRANET" => (
is_array($GLOBALS["arExtranetGroupID"] ?? null)
&& in_array($workgroupFields["ID"], $GLOBALS["arExtranetGroupID"])
? "Y"
: "N"
),
'AVATAR' => $avatarUrl,
);
if (!array_key_exists($workgroupFields["ID"], $arSonetGroups))
{
$arSonetGroups[$workgroupFields["ID"]] = array();
}
$arSonetGroups[$workgroupFields["ID"]][] = SONET_ROLES_USER;
}
}
}
elseif (preg_match('/^SG(d+)_'.SONET_ROLES_MODERATOR.'$/', $right_tmp, $matches))
{
if (!in_array("SG".$matches[1]."_".SONET_ROLES_USER, $arRights))
{
$cnt++;
if (!$bJustCount)
{
$workgroupFields = CSocNetGroup::getById($matches[1], $bCheckPermissions);
if ($workgroupFields)
{
$avatarUrl = (
isset($arParams['GET_AVATARS']) && (bool)$arParams['GET_AVATARS']
? self::getResizedAvatarUrl([
'fileId' => (int)$workgroupFields['IMAGE_ID'],
'avatarSize' => $avatarSize,
])
: ''
);
$arDestination[] = array(
"TYPE" => "SG",
"ID" => $workgroupFields["ID"],
"STYLE" => "sonetgroups",
"TITLE" => ($htmlEncode ? $workgroupFields["NAME"] : htmlspecialcharsback($workgroupFields["NAME"])).GetMessage("SONET_GL_DESTINATION_SG_MODERATOR"),
"URL" => str_replace("#group_id#", $workgroupFields["ID"], $arParams["PATH_TO_GROUP"]),
"IS_EXTRANET" => (is_array($GLOBALS["arExtranetGroupID"]) && in_array($workgroupFields["ID"], $GLOBALS["arExtranetGroupID"]) ? "Y" : "N"),
'AVATAR' => $avatarUrl,
);
if (!array_key_exists($workgroupFields["ID"], $arSonetGroups))
{
$arSonetGroups[$workgroupFields["ID"]] = array();
}
$arSonetGroups[$workgroupFields["ID"]][] = SONET_ROLES_MODERATOR;
}
}
}
}
elseif (preg_match('/^SG(d+)_'.SONET_ROLES_OWNER.'$/', $right_tmp, $matches))
{
if (!in_array("SG".$matches[1]."_".SONET_ROLES_USER, $arRights) && !in_array("SG".$matches[1]."_".SONET_ROLES_MODERATOR, $arRights))
{
$cnt++;
if (!$bJustCount)
{
$workgroupFields = CSocNetGroup::getById($matches[1], $bCheckPermissions);
if ($workgroupFields)
{
$avatarUrl = (
isset($arParams['GET_AVATARS']) && (bool)$arParams['GET_AVATARS']
? self::getResizedAvatarUrl([
'fileId' => (int)$workgroupFields['IMAGE_ID'],
'avatarSize' => $avatarSize,
])
: ''
);
$arDestination[] = array(
"TYPE" => "SG",
"ID" => $workgroupFields["ID"],
"STYLE" => "sonetgroups",
"TITLE" => ($htmlEncode ? $workgroupFields["NAME"] : htmlspecialcharsback($workgroupFields["NAME"])).GetMessage("SONET_GL_DESTINATION_SG_OWNER"),
"URL" => str_replace(
"#group_id#",
$workgroupFields["ID"],
$arParams["PATH_TO_GROUP"] ?? ''
),
"IS_EXTRANET" => (
is_array($GLOBALS["arExtranetGroupID"] ?? null)
&& in_array($workgroupFields["ID"], $GLOBALS["arExtranetGroupID"])
? "Y"
: "N"
),
'AVATAR' => $avatarUrl,
);
if (!array_key_exists($workgroupFields["ID"], $arSonetGroups))
{
$arSonetGroups[$workgroupFields["ID"]] = array();
}
$arSonetGroups[$workgroupFields["ID"]][] = SONET_ROLES_OWNER;
}
}
}
}
else
{
$cnt++;
if (!$bJustCount)
{
foreach ($arModuleEvents as $arEvent)
{
ExecuteModuleEventEx($arEvent, array(&$arDestination, $right_tmp, $arRights, $arParams, $bCheckPermissions));
}
}
}
}
if (!empty($arGroupIdToGet))
{
$rsGroupTmp = BitrixMainGroupTable::getList([
'select' => [ 'ID', 'NAME' ],
'filter' => [
'ID' => $arGroupIdToGet
],
]);
while ($groupFields = $rsGroupTmp->fetch())
{
$arDestination[] = array(
"TYPE" => "G",
"ID" => $groupFields["ID"],
"STYLE" => "groups",
"TITLE" => ($htmlEncode ? htmlspecialcharsEx($groupFields["NAME"]) : $groupFields["NAME"]),
"URL" => "",
);
}
}
if (!empty($arUserIdToGet))
{
$select = [ 'ID', 'NAME', 'LAST_NAME', 'SECOND_NAME', 'LOGIN', 'EMAIL', 'PERSONAL_PHOTO' ];
if (ModuleManager::isModuleInstalled('mail'))
{
$select[] = 'EXTERNAL_AUTH_ID';
}
if (ModuleManager::isModuleInstalled('crm'))
{
$select[] = 'UF_USER_CRM_ENTITY';
}
$rsUserTmp = BitrixMainUserTable::getList(array(
'order' => array(),
'filter' => array(
"ID" => $arUserIdToGet
),
'select' => $select
));
while ($arUserTmp = $rsUserTmp->fetch())
{
$avatarUrl = (
isset($arParams['GET_AVATARS']) && (bool)$arParams['GET_AVATARS']
? self::getResizedAvatarUrl([
'fileId' => (int)$arUserTmp['PERSONAL_PHOTO'],
'avatarSize' => $avatarSize,
])
: ''
);
$isEmail = (isset($arUserTmp['EXTERNAL_AUTH_ID']) && $arUserTmp['EXTERNAL_AUTH_ID'] === 'email');
$url = str_replace("#user_id#", $arUserTmp["ID"], $arParams["PATH_TO_USER"] ?? '');
if (
$isEmail
&& !empty($arParams['LOG_ID'])
&& (int)$arParams['LOG_ID'] > 0
)
{
$url = (new BitrixMainWebUri($url))->addParams([
'entityType' => 'LOG_ENTRY',
'entityId' => (int)$arParams['LOG_ID'],
])->getUri();
}
$arDestination[] = [
"TYPE" => "U",
"ID" => $arUserTmp["ID"],
"STYLE" => "users",
"TITLE" => CUser::FormatName($arParams["NAME_TEMPLATE"], $arUserTmp, ($arParams["SHOW_LOGIN"] === "Y"), $htmlEncode),
'SHORT_TITLE' => trim($htmlEncode ? htmlspecialcharsEx($arUserTmp['NAME']) : $arUserTmp['NAME']),
'URL' => $url,
"IS_EXTRANET" => (isset($GLOBALS["arExtranetUserID"]) && is_array($GLOBALS["arExtranetUserID"]) && in_array($arUserTmp["ID"], $GLOBALS["arExtranetUserID"]) ? "Y" : "N"),
'IS_EMAIL' => ($isEmail ? 'Y' : 'N'),
"CRM_ENTITY" => (!empty($arUserTmp["UF_USER_CRM_ENTITY"]) ? $arUserTmp["UF_USER_CRM_ENTITY"] : false),
'AVATAR' => $avatarUrl,
];
}
}
if (!empty($arDepartmentIdToGet))
{
foreach ($arDepartmentIdToGet as $key => $value)
{
if (array_key_exists($value, $arDepartmentsStaticCache))
{
$arDestination[] = array(
"TYPE" => "D",
"ID" => $arDepartmentsStaticCache[$value]["ID"],
"STYLE" => "department",
"TITLE" => $arDepartmentsStaticCache[$value]["NAME"],
"URL" => str_replace(array("#ID#", "#id#"), $arDepartmentsStaticCache[$value]["ID"], $arParams["PATH_TO_CONPANY_DEPARTMENT"])
);
unset($arDepartmentIdToGet[$key]);
}
}
if (!empty($arDepartmentIdToGet))
{
$rsDepartmentTmp = CIBlockSection::GetList(
array(),
array(
"ID" => $arDepartmentIdToGet
),
false,
array('ID', 'NAME')
);
while ($arDepartmentTmp = $rsDepartmentTmp->fetch())
{
$arDestination[] = array(
"TYPE" => "D",
"ID" => $arDepartmentTmp["ID"],
"STYLE" => "department",
"TITLE" => ($htmlEncode ? htmlspecialcharsEx($arDepartmentTmp["NAME"]) : $arDepartmentTmp["NAME"]),
"URL" => str_replace(array("#ID#", "#id#"), $arDepartmentTmp["ID"], $arParams["PATH_TO_CONPANY_DEPARTMENT"])
);
$arDepartmentsStaticCache[$arDepartmentTmp["ID"]] = $arDepartmentTmp;
}
}
}
$db_events = GetModuleEvents("socialnetwork", "OnAfterSocNetLogFormatDestination");
while ($arEvent = $db_events->Fetch())
{
ExecuteModuleEventEx($arEvent, array(&$arDestination));
}
if ($cnt > $arParams["DESTINATION_LIMIT"])
{
$iMoreCount = $cnt - $arParams["DESTINATION_LIMIT"];
}
return $arDestination;
}