static function SendRequestToJoinGroup($senderUserId, $userId, $groupId, $message, $sendMail = true): bool
{
global $APPLICATION, $USER;
$senderUserId = (int)$senderUserId;
if ($senderUserId <= 0)
{
$APPLICATION->ThrowException(Loc::getMessage('SONET_UR_EMPTY_USERID'), "ERROR_SENDERID");
return false;
}
$userId = (int)$userId;
if ($userId <= 0)
{
$APPLICATION->ThrowException(Loc::getMessage("SONET_UR_EMPTY_USERID"), "ERROR_USERID");
return false;
}
$groupId = (int)$groupId;
if ($groupId <= 0)
{
$APPLICATION->ThrowException(Loc::getMessage("SONET_UR_EMPTY_GROUPID"), "ERROR_GROUPID");
return false;
}
$groupFields = CSocNetGroup::getById($groupId);
if (!$groupFields || !is_array($groupFields))
{
$APPLICATION->ThrowException(Loc::getMessage("SONET_UG_ERROR_NO_GROUP_ID"), "ERROR_NO_GROUP");
return false;
}
$arGroupSites = array();
$rsGroupSite = CSocNetGroup::GetSite($groupId);
while ($arGroupSite = $rsGroupSite->Fetch())
{
$arGroupSites[] = $arGroupSite["LID"];
}
$userRole = CSocNetUserToGroup::GetUserRole($senderUserId, $groupId);
$userIsMember = ($userRole && in_array($userRole, UserToGroupTable::getRolesMember(), true));
$canInitiate = (
$USER->IsAdmin()
|| CSocNetUser::IsCurrentUserModuleAdmin($arGroupSites)
|| (
$userRole
&& (
(
$groupFields["INITIATE_PERMS"] === UserToGroupTable::ROLE_OWNER
&& $senderUserId === (int)$groupFields["OWNER_ID"]
)
|| (
$groupFields["INITIATE_PERMS"] === UserToGroupTable::ROLE_MODERATOR
&& in_array($userRole, [ UserToGroupTable::ROLE_OWNER, UserToGroupTable::ROLE_MODERATOR ], true)
)
|| (
$groupFields["INITIATE_PERMS"] === UserToGroupTable::ROLE_USER
&& $userIsMember
)
)
)
);
if (!$canInitiate)
{
$APPLICATION->ThrowException(Loc::getMessage("SONET_UG_ERROR_NO_PERMS"), "ERROR_NO_PERMS");
return false;
}
$relationFields = array(
"USER_ID" => $userId,
"GROUP_ID" => $groupId,
"ROLE" => UserToGroupTable::ROLE_REQUEST,
"=DATE_CREATE" => CDatabase::CurrentTimeFunction(),
"=DATE_UPDATE" => CDatabase::CurrentTimeFunction(),
"MESSAGE" => str_replace(
[ "#TEXT#", "#GROUP_NAME#" ],
[ $message, $groupFields["NAME"] ],
(
empty($message)
? Loc::getMessage("SONET_UG_INVITE_CONFIRM_TEXT_EMPTY")
: Loc::getMessage("SONET_UG_INVITE_CONFIRM_TEXT")
)
),
"INITIATED_BY_TYPE" => SONET_INITIATED_BY_GROUP,
"INITIATED_BY_USER_ID" => $senderUserId,
"SEND_MAIL" => ($sendMail ? "Y" : "N")
);
$relationId = CSocNetUserToGroup::Add($relationFields);
if (!$relationId)
{
$errorMessage = "";
if ($e = $APPLICATION->GetException())
{
$errorMessage = $e->GetString();
}
if ($errorMessage === '')
{
$errorMessage = Loc::getMessage('SONET_UR_ERROR_CREATE_USER2GROUP');
}
$APPLICATION->ThrowException($errorMessage, "ERROR_CREATE_USER2GROUP");
return false;
}
$userIsConfirmed = true;
$rsInvitedUser = CUser::GetByID($userId);
$arInvitedUser = $rsInvitedUser->Fetch();
if (
(
!is_array($arInvitedUser["UF_DEPARTMENT"])
|| (int) ($arInvitedUser["UF_DEPARTMENT"][0] ?? null) <= 0
) // extranet
&& ($arInvitedUser["LAST_LOGIN"] <= 0)
&& $arInvitedUser["LAST_ACTIVITY_DATE"] == ''
)
{
$userIsConfirmed = false;
}
if (
$userIsConfirmed
&& Loader::includeModule('im')
)
{
$messageFields = [
"MESSAGE_TYPE" => IM_MESSAGE_SYSTEM,
"TO_USER_ID" => (int)$relationFields['USER_ID'],
"FROM_USER_ID" => (int)$relationFields['INITIATED_BY_USER_ID'],
"NOTIFY_TYPE" => IM_NOTIFY_CONFIRM,
"NOTIFY_MODULE" => "socialnetwork",
"NOTIFY_EVENT" => "invite_group_btn",
"NOTIFY_TAG" => "SOCNET|INVITE_GROUP|" . $userId . "|" . $relationId,
"NOTIFY_TITLE" => str_replace(
"#GROUP_NAME#",
truncateText($groupFields["NAME"], 150),
GetMessage("SONET_UG_INVITE_CONFIRM_TEXT_EMPTY")
),
"NOTIFY_MESSAGE" => str_replace(
[ "#TEXT#", "#GROUP_NAME#" ],
[ $message, $groupFields["NAME"] ],
(
empty($message)
? Loc::getMessage("SONET_UG_INVITE_CONFIRM_TEXT_EMPTY")
: Loc::getMessage("SONET_UG_INVITE_CONFIRM_TEXT")
)
),
"NOTIFY_BUTTONS" => [
[
'TITLE' => Loc::getMessage('SONET_UG_INVITE_CONFIRM'),
'VALUE' => 'Y',
'TYPE' => 'accept',
],
[
'TITLE' => Loc::getMessage('SONET_UG_INVITE_REJECT'),
'VALUE' => 'N',
'TYPE' => 'cancel',
],
],
];
$siteId = (
(
!is_array($arInvitedUser["UF_DEPARTMENT"])
|| (int)$arInvitedUser["UF_DEPARTMENT"][0] <= 0
)
&& Loader::includeModule('extranet')
? CExtranet::GetExtranetSiteID()
: SITE_ID
);
$dbSite = CSite::GetByID($siteId);
$arSite = $dbSite->Fetch();
$serverName = htmlspecialcharsEx($arSite["SERVER_NAME"]);
if ($serverName === '')
{
$serverName = (
defined("SITE_SERVER_NAME")
&& SITE_SERVER_NAME !== ''
? SITE_SERVER_NAME
: Option::get('main', 'server_name')
);
}
if ($serverName === '')
{
$serverName = $_SERVER["SERVER_NAME"];
}
$serverName = (CMain::IsHTTPS() ? "https" : "http")."://".$serverName;
$requestUrl = Option::get(
"socialnetwork",
"user_request_page",
(
ModuleManager::isModuleInstalled('intranet')
? "/company/personal/user/#USER_ID#/requests/"
: "/club/user/#USER_ID#/requests/"
),
$siteId
);
$requestUrl = $serverName.str_replace(array("#USER_ID#", "#user_id#"), $userId, $requestUrl);
$groupUrl = $serverName.str_replace("#group_id#", $groupId, Path::get('group_path_template', $siteId));
$messageFields['NOTIFY_MESSAGE_OUT'] = $messageFields['NOTIFY_MESSAGE'];
$messageFields['NOTIFY_MESSAGE_OUT'] .= "nn" . Loc::getMessage('SONET_UG_GROUP_LINK') . $groupUrl;
$messageFields['NOTIFY_MESSAGE_OUT'] .= "nn" . Loc::getMessage('SONET_UG_INVITE_CONFIRM') . ": " . $requestUrl . '?INVITE_GROUP=' . $relationId . '&CONFIRM=Y';
$messageFields['NOTIFY_MESSAGE_OUT'] .= "nn" . Loc::getMessage('SONET_UG_INVITE_REJECT') . ": " . $requestUrl . '?INVITE_GROUP=' . $relationId . '&CONFIRM=N';
CIMNotify::Add($messageFields);
}
$events = GetModuleEvents("socialnetwork", "OnSocNetSendRequestToJoinGroup");
while ($arEvent = $events->Fetch())
{
ExecuteModuleEventEx($arEvent, [ $relationId, $relationFields ]);
}
CSocNetUserToGroup::__SpeedFileCreate($userId);
return true;
}