• Модуль: socialnetwork
  • Путь к файлу: ~/bitrix/modules/socialnetwork/classes/general/user_group.php
  • Класс: CAllSocNetUserToGroup
  • Вызов: CAllSocNetUserToGroup::SendRequestToJoinGroup
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;
}