• Модуль: socialnetwork
  • Путь к файлу: ~/bitrix/modules/socialnetwork/classes/general/user_group.php
  • Класс: CAllSocNetUserToGroup
  • Вызов: CAllSocNetUserToGroup::SendRequestToBeMember
static function SendRequestToBeMember($userId, $groupId, $message, $requestConfirmUrl = "", $autoSubscribe = true): bool
{
	global $APPLICATION;

	$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)
		|| $groupFields["ACTIVE"] !== "Y"
		/* || $arGroup["VISIBLE"] != "Y"*/)
	{
		$APPLICATION->ThrowException(Loc::getMessage('SONET_UG_ERROR_NO_GROUP_ID'), 'ERROR_NO_GROUP');
		return false;
	}

	$relationFields = [
		"USER_ID" => $userId,
		"GROUP_ID" => $groupId,
		"ROLE" => UserToGroupTable::ROLE_REQUEST,
		"=DATE_CREATE" => CDatabase::CurrentTimeFunction(),
		"=DATE_UPDATE" => CDatabase::CurrentTimeFunction(),
		"MESSAGE" => $message,
		"INITIATED_BY_TYPE" => SONET_INITIATED_BY_USER,
		"INITIATED_BY_USER_ID" => $userId
	];
	if ($groupFields["OPENED"] === "Y")
	{
		$relationFields["ROLE"] = UserToGroupTable::ROLE_USER;
	}

	$ID = CSocNetUserToGroup::Add($relationFields);
	if (!$ID)
	{
		$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;
	}

	BitrixSocialnetworkHelperUserToGroupRequestPopup::unsetHideRequestPopup([
		'groupId' => $groupId,
		'userId' => $userId,
	]);

	if ($groupFields["OPENED"] === "Y")
	{
		if ($autoSubscribe)
		{
			CSocNetLogEvents::AutoSubscribe($userId, SONET_ENTITY_GROUP, $groupId);
		}

		if (ModuleManager::isModuleInstalled('im'))
		{
			$chatNotificationResult = UserToGroup::addInfoToChat([
				'group_id' => $groupId,
				'user_id' => $userId,
				'action' => UserToGroup::CHAT_ACTION_IN,
				'role' => $relationFields['ROLE'],
			]);

			if (!$chatNotificationResult)
			{
				CSocNetUserToGroup::notifyImToModerators([
					"TYPE" => "join",
					"RELATION_ID" => $ID,
					"USER_ID" => $userId,
					"GROUP_ID" => $groupId,
					"GROUP_NAME" => $groupFields["NAME"],
				]);
			}
		}
	}
	elseif (
		trim($requestConfirmUrl) !== ''
		&& Loader::includeModule('im')
	)
	{
		static $serverName;
		if (!$serverName)
		{
			$dbSite = CSite::GetByID(SITE_ID);
			$arSite = $dbSite->Fetch();
			$serverName = htmlspecialcharsEx($arSite["SERVER_NAME"]);
			if ($serverName === '')
			{
				if (defined("SITE_SERVER_NAME") && SITE_SERVER_NAME !== '')
				{
					$serverName = SITE_SERVER_NAME;
				}
				else
				{
					$serverName = Option::get("main", "server_name");
				}

				if ($serverName === '')
				{
					$serverName = $_SERVER["SERVER_NAME"];
				}
			}
			$serverName = (CMain::IsHTTPS() ? "https" : "http")."://".$serverName;
		}

		// send sonet system messages to owner and (may be) moderators to accept or refuse request
		$FilterRole = (
			$groupFields['INITIATE_PERMS'] === UserToGroupTable::ROLE_OWNER
				? UserToGroupTable::ROLE_OWNER
				: UserToGroupTable::ROLE_MODERATOR
		);

		$res = CSocNetUserToGroup::GetList(
			array("USER_ID" => "ASC"),
			array(
				"GROUP_ID" => $groupId,
				"<=ROLE" => $FilterRole,
				"USER_ACTIVE" => "Y"
			),
			false,
			false,
			array("ID", "USER_ID", "USER_NAME", "USER_LAST_NAME", "USER_EMAIL")
		);
		if ($res)
		{
			$groupSiteId = CSocNetGroup::GetDefaultSiteId($groupId, $groupFields["SITE_ID"]);
			$workgroupsPage = COption::GetOptionString("socialnetwork", "workgroups_page", "/workgroups/", SITE_ID);
			$groupUrlTemplate = Path::get('group_path_template');
			$groupUrlTemplate = "#GROUPS_PATH#" . mb_substr($groupUrlTemplate, mb_strlen($workgroupsPage));
			$groupUrl = str_replace(array("#group_id#", "#GROUP_ID#"), $groupId, $groupUrlTemplate);

			while ($recipientRelationFields = $res->fetch())
			{
				$arTmp = CSocNetLogTools::ProcessPath(
					[
						"GROUP_URL" => $groupUrl,
					],
					$recipientRelationFields["USER_ID"],
					$groupSiteId
				);
				$groupUrl = $arTmp["URLS"]["GROUP_URL"];
				$domainName = (
					mb_strpos($groupUrl, "http://") === 0
					|| mb_strpos($groupUrl, "https://") === 0
						? ""
						: (
							isset($arTmp["DOMAIN"])
							&& !empty($arTmp["DOMAIN"])
								? "//".$arTmp["DOMAIN"]
								: ""
						)
				);

				$messageFields = array(
					"TO_USER_ID" => $recipientRelationFields["USER_ID"],
					"FROM_USER_ID" => $userId,
					"NOTIFY_TYPE" => IM_NOTIFY_CONFIRM,
					"NOTIFY_MODULE" => "socialnetwork",
					"NOTIFY_EVENT" => "invite_group_btn",
					"NOTIFY_TAG" => "SOCNET|REQUEST_GROUP|" . $userId . "|" . $groupId . "|" . $ID . "|" . $recipientRelationFields["USER_ID"],
					"NOTIFY_SUB_TAG" => "SOCNET|REQUEST_GROUP|" . $userId."|" . $groupId . "|" . $ID,
					"NOTIFY_TITLE" => str_replace(
						"#GROUP_NAME#",
						truncateText($groupFields["NAME"], 150),
						Loc::getMessage('SONET_UG_REQUEST_CONFIRM_TEXT_EMPTY')
					),
					"NOTIFY_MESSAGE" => str_replace(
						[
							"#TEXT#",
							"#GROUP_NAME#",
						],
						[
							$message,
							"".$groupFields["NAME"].""
						],
						(empty($message)
							? Loc::getMessage('SONET_UG_REQUEST_CONFIRM_TEXT_EMPTY')
							: Loc::getMessage('SONET_UG_REQUEST_CONFIRM_TEXT')
						)
					),
					"NOTIFY_BUTTONS" => [
						[
							"TITLE" => Loc::getMessage('SONET_UG_REQUEST_CONFIRM'),
							"VALUE" => "Y",
							"TYPE" => "accept",
						],
						[
							"TITLE" => Loc::getMessage('SONET_UG_REQUEST_REJECT'),
							"VALUE" => "N",
							"TYPE" => "cancel",
						],
					],
				);

				$groupUrl = $serverName.str_replace("#group_id#", $groupId, Path::get('group_path_template'));

				$messageFields["NOTIFY_MESSAGE_OUT"] = $messageFields["NOTIFY_MESSAGE"];
				$messageFields["NOTIFY_MESSAGE_OUT"] .= "nn".GetMessage("SONET_UG_GROUP_LINK").$groupUrl;
				$messageFields['NOTIFY_MESSAGE_OUT'] .= "nn".GetMessage("SONET_UG_REQUEST_CONFIRM_REJECT").": ".$requestConfirmUrl;

				CIMNotify::Add($messageFields);
			}
		}
	}

	return true;
}