• Модуль: socialnetwork
  • Путь к файлу: ~/bitrix/modules/socialnetwork/classes/general/log_comments.php
  • Класс: CAllSocNetLogComments
  • Вызов: CAllSocNetLogComments::SendEvent
static function SendEvent($ID, $mailTemplate = "SONET_NEW_EVENT", $bTransport = false)
{
	global $DB;

	$arSocNetAllowedSubscribeEntityTypesDesc = CSocNetAllowed::GetAllowedEntityTypesDesc();

	$ID = intval($ID);
	if ($ID <= 0)
		return false;

	$arFilter = array("ID" => $ID);

	$dbLogComments = CSocNetLogComments::GetList(
		array(),
		$arFilter,
		false,
		false,
		array("ID", "LOG_ID", "ENTITY_TYPE", "ENTITY_ID", "USER_ID", "USER_NAME", "USER_LAST_NAME", "USER_SECOND_NAME", "USER_LOGIN", "EVENT_ID", "LOG_DATE", "MESSAGE", "TEXT_MESSAGE", "URL", "MODULE_ID", "GROUP_NAME", "CREATED_BY_NAME", "CREATED_BY_SECOND_NAME", "CREATED_BY_LAST_NAME", "CREATED_BY_LOGIN", "LOG_SITE_ID", "SOURCE_ID", "LOG_SOURCE_ID")
	);
	$arLogComment = $dbLogComments->Fetch();
	if (!$arLogComment)
		return false;

	$arLog = array();
	if (intval($arLogComment["LOG_ID"]) > 0)
	{
		$dbLog = CSocNetLog::GetList(
			array(),
			array("ID" => $arLogComment["LOG_ID"])
		);
		$arLog = $dbLog->Fetch();
		if (!$arLog)
			$arLog = array();
	}

	$arEvent = CSocNetLogTools::FindLogCommentEventByID($arLogComment["EVENT_ID"]);

	if (
		$arEvent
		&& array_key_exists("CLASS_FORMAT", $arEvent)
		&& array_key_exists("METHOD_FORMAT", $arEvent)
		&& $arEvent["CLASS_FORMAT"] <> ''
		&& $arEvent["METHOD_FORMAT"] <> ''
	)
	{
		$dbSiteCurrent = CSite::GetByID(SITE_ID);
		if ($arSiteCurrent = $dbSiteCurrent->Fetch())
			if ($arSiteCurrent["LANGUAGE_ID"] != LANGUAGE_ID)
				$arLogComment["MAIL_LANGUAGE_ID"] = $arSiteCurrent["LANGUAGE_ID"];

		$arLogComment["FIELDS_FORMATTED"] = call_user_func(array($arEvent["CLASS_FORMAT"], $arEvent["METHOD_FORMAT"]), $arLogComment, array(), true, $arLog);
	}

	if (
		array_key_exists($arLogComment["ENTITY_TYPE"], $arSocNetAllowedSubscribeEntityTypesDesc)
		&& array_key_exists("HAS_MY", $arSocNetAllowedSubscribeEntityTypesDesc[$arLogComment["ENTITY_TYPE"]])
		&& $arSocNetAllowedSubscribeEntityTypesDesc[$arLogComment["ENTITY_TYPE"]]["HAS_MY"] == "Y"
		&& array_key_exists("CLASS_OF", $arSocNetAllowedSubscribeEntityTypesDesc[$arLogComment["ENTITY_TYPE"]])
		&& array_key_exists("METHOD_OF", $arSocNetAllowedSubscribeEntityTypesDesc[$arLogComment["ENTITY_TYPE"]])
		&& $arSocNetAllowedSubscribeEntityTypesDesc[$arLogComment["ENTITY_TYPE"]]["CLASS_OF"] <> ''
		&& $arSocNetAllowedSubscribeEntityTypesDesc[$arLogComment["ENTITY_TYPE"]]["METHOD_OF"] <> ''
		&& method_exists($arSocNetAllowedSubscribeEntityTypesDesc[$arLogComment["ENTITY_TYPE"]]["CLASS_OF"], $arSocNetAllowedSubscribeEntityTypesDesc[$arLogComment["ENTITY_TYPE"]]["METHOD_OF"])
	)
	{
		$arOfEntities = call_user_func(array($arSocNetAllowedSubscribeEntityTypesDesc[$arLogComment["ENTITY_TYPE"]]["CLASS_OF"], $arSocNetAllowedSubscribeEntityTypesDesc[$arLogComment["ENTITY_TYPE"]]["METHOD_OF"]), $arLogComment["ENTITY_ID"]);
	}

	if ($bTransport)
	{
		$arListParams = array(
			"USE_SUBSCRIBE" => "Y",
			"ENTITY_TYPE" => $arLogComment["ENTITY_TYPE"],
			"ENTITY_ID" => $arLogComment["ENTITY_ID"],
			"EVENT_ID" => $arLogComment["EVENT_ID"],
			"USER_ID" => $arLogComment["USER_ID"],
			"OF_ENTITIES" => $arOfEntities,
			"TRANSPORT" => array("M", "X")
		);

		$arLogSites = array();
		$rsLogSite = CSocNetLog::GetSite($arLog["ID"]);
		while($arLogSite = $rsLogSite->Fetch())
		{
			$arLogSites[] = $arLogSite["LID"];
		}

		if (CModule::IncludeModule("extranet"))
		{
			if ($arLogComment["ENTITY_TYPE"] == SONET_ENTITY_GROUP)
			{
				$arSites = array();
				$dbSite = CSite::GetList("sort", "desc", array("ACTIVE" => "Y"));
				while($arSite = $dbSite->Fetch())
				{
					$arSites[$arSite["ID"]] = array(
						"DIR" => (trim($arSite["DIR"]) <> '' ? $arSite["DIR"] : "/"),
						"SERVER_NAME" => (trim($arSite["SERVER_NAME"]) <> '' ? $arSite["SERVER_NAME"] : COption::GetOptionString("main", "server_name", $_SERVER["HTTP_HOST"]))
					);
				}

				$intranet_site_id = CSite::GetDefSite();
			}
			$arIntranetUsers = CExtranet::GetIntranetUsers();
			$extranet_site_id = CExtranet::GetExtranetSiteID();
		}

		$dbSubscribers = CSocNetLogEvents::GetList(
			array(
				"TRANSPORT" => "DESC"
			),
			array(
				"USER_ACTIVE" => "Y",
				"SITE_ID" => array_merge($arLogSites, array(false))
			),
			false,
			false,
			array("USER_ID", "ENTITY_TYPE", "ENTITY_ID", "ENTITY_CB", "ENTITY_MY", "USER_NAME", "USER_LAST_NAME", "USER_LOGIN", "USER_LID", "USER_EMAIL", "TRANSPORT"),
			$arListParams
		);

		$arListParams = array(
			"USE_SUBSCRIBE" => "Y",
			"ENTITY_TYPE" => $arLogComment["ENTITY_TYPE"],
			"ENTITY_ID" => $arLogComment["ENTITY_ID"],
			"EVENT_ID" => $arLogComment["EVENT_ID"],
			"USER_ID" => $arLogComment["USER_ID"],
			"OF_ENTITIES" => $arOfEntities,
			"TRANSPORT" => "N"
		);

		$dbUnSubscribers = CSocNetLogEvents::GetList(
			array(
				"TRANSPORT" => "DESC"
			),
			array(
				"USER_ACTIVE" => "Y",
				"SITE_ID" => array_merge($arLogSites, array(false))
			),
			false,
			false,
			array("USER_ID", "SITE_ID", "ENTITY_TYPE", "ENTITY_ID", "ENTITY_CB", "ENTITY_MY", "TRANSPORT", "EVENT_ID"),
			$arListParams
		);

		$arUnSubscribers = array();
		while ($arUnSubscriber = $dbUnSubscribers->Fetch())
		{
			$arUnSubscribers[] = $arUnSubscriber["USER_ID"]."_".$arUnSubscriber["ENTITY_TYPE"]."_".$arUnSubscriber["ENTITY_ID"]."_".$arUnSubscriber["ENTITY_MY"]."_".$arUnSubscriber["ENTITY_CB"]."_".$arUnSubscriber["EVENT_ID"];
		}

		$bHasAccessAll = CSocNetLogRights::CheckForUserAll(($arLog["ID"] ? $arLog["ID"] : $arLogComment["LOG_ID"]));

		$arSentUserID = array("M" => array(), "X" => array());
		while ($arSubscriber = $dbSubscribers->Fetch())
		{
			if (
				is_array($arIntranetUsers)
				&& !in_array($arSubscriber["USER_ID"], $arIntranetUsers)
				&& !in_array($extranet_site_id, $arLogSites)
			)
			{
				continue;
			}

			if (
				array_key_exists($arSubscriber["TRANSPORT"], $arSentUserID)
				&& in_array($arSubscriber["USER_ID"], $arSentUserID[$arSubscriber["TRANSPORT"]])
			)
			{
				continue;
			}

			if (
				intval($arSubscriber["ENTITY_ID"]) != 0
				&& $arSubscriber["EVENT_ID"] == "all"
				&&
				(
					in_array($arSubscriber["USER_ID"]."_".$arSubscriber["ENTITY_TYPE"]."_".$arSubscriber["ENTITY_ID"]."_N_".$arSubscriber["ENTITY_CB"]."_".$arLogComment["EVENT_ID"], $arUnSubscribers)
					|| in_array($arSubscriber["USER_ID"]."_".$arSubscriber["ENTITY_TYPE"]."_".$arSubscriber["ENTITY_ID"]."_Y_".$arSubscriber["ENTITY_CB"]."_".$arLogComment["EVENT_ID"], $arUnSubscribers)
				)
			)
			{
				continue;
			}
			elseif (
				intval($arSubscriber["ENTITY_ID"]) == 0
				&& $arSubscriber["ENTITY_CB"] == "N"
				&& $arSubscriber["EVENT_ID"] != "all"
				&&
				(
					in_array($arSubscriber["USER_ID"]."_".$arSubscriber["ENTITY_TYPE"]."_".$arLogComment["ENTITY_ID"]."_Y_N_all", $arUnSubscribers)
					|| in_array($arSubscriber["USER_ID"]."_".$arSubscriber["ENTITY_TYPE"]."_".$arLogComment["ENTITY_ID"]."_N_N_all", $arUnSubscribers)
					|| in_array($arSubscriber["USER_ID"]."_".$arSubscriber["ENTITY_TYPE"]."_".$arLogComment["ENTITY_ID"]."_Y_N_".$arLogComment["EVENT_ID"], $arUnSubscribers)
					|| in_array($arSubscriber["USER_ID"]."_".$arSubscriber["ENTITY_TYPE"]."_".$arLogComment["ENTITY_ID"]."_N_N_".$arLogComment["EVENT_ID"], $arUnSubscribers)
				)
			)
			{
				continue;
			}

			$arSentUserID[$arSubscriber["TRANSPORT"]][] = $arSubscriber["USER_ID"];

			if (!$bHasAccessAll)
			{
				$bHasAccess = CSocNetLogRights::CheckForUserOnly(($arLog["ID"] ? $arLog["ID"] : $arLogComment["LOG_ID"]), $arSubscriber["USER_ID"]);
				if (!$bHasAccess)
				{
					continue;
				}
			}

			if (
				$arLogComment["ENTITY_TYPE"] == SONET_ENTITY_GROUP
				&& is_array($arIntranetUsers)
				&& CModule::IncludeModule("extranet")
			)
			{
				$server_name = $arSites[((!in_array($arSubscriber["USER_ID"], $arIntranetUsers) && $extranet_site_id) ? $extranet_site_id : $intranet_site_id)]["SERVER_NAME"];
				$arLogComment["FIELDS_FORMATTED"]["EVENT_FORMATTED"]["URL_TO_SEND"] = str_replace(
					array("#SERVER_NAME#", "#GROUPS_PATH#"),
					array(
						$server_name,
						COption::GetOptionString("socialnetwork", "workgroups_page", false, ((!in_array($arSubscriber["USER_ID"], $arIntranetUsers) && $extranet_site_id) ? $extranet_site_id : $intranet_site_id))
					),
					$arLogComment["FIELDS_FORMATTED"]["EVENT_FORMATTED"]["URL"]
				);
			}
			else
			{
				$arLogComment["FIELDS_FORMATTED"]["EVENT_FORMATTED"]["URL_TO_SEND"] = $arLogComment["FIELDS_FORMATTED"]["EVENT_FORMATTED"]["URL"];
			}

			switch ($arSubscriber["TRANSPORT"])
			{
				case "X":
					$link = (
						array_key_exists("URL_TO_SEND", $arLogComment["FIELDS_FORMATTED"]["EVENT_FORMATTED"])
						&& $arLogComment["FIELDS_FORMATTED"]["EVENT_FORMATTED"]["URL_TO_SEND"] <> ''
							? GetMessage("SONET_GLC_SEND_EVENT_LINK").$arLogComment["FIELDS_FORMATTED"]["EVENT_FORMATTED"]["URL_TO_SEND"]
							: ""
					);

					$arMessageFields = array(
						"FROM_USER_ID" => (intval($arLogComment["USER_ID"]) > 0 ? $arLogComment["USER_ID"] : 1),
						"TO_USER_ID" => $arSubscriber["USER_ID"],
						"MESSAGE" => $arLogComment["FIELDS_FORMATTED"]["EVENT_FORMATTED"]["TITLE"]." #BR# ".$arLogComment["FIELDS_FORMATTED"]["EVENT_FORMATTED"]["MESSAGE"].($link <> '' ? "#BR# ".$link : ""),
						"=DATE_CREATE" => $DB->CurrentTimeFunction(),
						"MESSAGE_TYPE" => SONET_MESSAGE_SYSTEM,
						"IS_LOG" => "Y"
					);
					CSocNetMessages::Add($arMessageFields);
					break;
				case "M":
					$arFields["SUBSCRIBER_ID"] = $arSubscriber["USER_ID"];
					$arFields["SUBSCRIBER_NAME"] = $arSubscriber["USER_NAME"];
					$arFields["SUBSCRIBER_LAST_NAME"] = $arSubscriber["USER_LAST_NAME"];
					$arFields["SUBSCRIBER_LOGIN"] = $arSubscriber["USER_LOGIN"];
					$arFields["SUBSCRIBER_EMAIL"] = $arSubscriber["USER_EMAIL"];
					$arFields["EMAIL_TO"] = $arSubscriber["USER_EMAIL"];
					$arFields["TITLE"] = str_replace("#BR#", "n", $arLogComment["FIELDS_FORMATTED"]["EVENT_FORMATTED"]["TITLE"]);
					$arFields["MESSAGE"] = str_replace("#BR#", "n", $arLogComment["FIELDS_FORMATTED"]["EVENT_FORMATTED"]["MESSAGE"]);
					$arFields["ENTITY"] = $arLogComment["FIELDS_FORMATTED"]["ENTITY"]["FORMATTED"];
					$arFields["ENTITY_TYPE"] = $arLogComment["FIELDS_FORMATTED"]["ENTITY"]["TYPE_MAIL"];

					$arFields["URL"] = (
						array_key_exists("URL_TO_SEND", $arLogComment["FIELDS_FORMATTED"]["EVENT_FORMATTED"])
						&& $arLogComment["FIELDS_FORMATTED"]["EVENT_FORMATTED"]["URL_TO_SEND"] <> ''
							? $arLogComment["FIELDS_FORMATTED"]["EVENT_FORMATTED"]["URL_TO_SEND"]
							: $arLogComment["URL"]
					);

					if (CModule::IncludeModule("extranet"))
					{
						$arUserGroup = CUser::GetUserGroup($arSubscriber["USER_ID"]);
					}

					foreach ($arLogSites as $site_id_tmp)
					{
						if (IsModuleInstalled("extranet"))
						{
							if (
								(
									CExtranet::IsExtranetSite($site_id_tmp)
									&& in_array(CExtranet::GetExtranetUserGroupID(), $arUserGroup)
								)
								||
								(
									!CExtranet::IsExtranetSite($site_id_tmp)
									&& !in_array(CExtranet::GetExtranetUserGroupID(), $arUserGroup)
								)
							)
							{
								$siteID = $site_id_tmp;
								break;
							}
							else
							{
								continue;
							}
						}
						else
						{
							$siteID = $site_id_tmp;
							break;
						}
					}

					if (!$siteID)
						$siteID = (defined("SITE_ID") ? SITE_ID : $arSubscriber["SITE_ID"]);

					if ($siteID == '')
						$siteID = $arSubscriber["USER_LID"];
					if ($siteID == '')
						break;

					$event = new CEvent;
					$event->Send($mailTemplate, $siteID, $arFields, "N");
					break;
				default:
			}
		}
	}

	if (!(
		$arLogComment["EVENT_ID"] === "tasks_comment"
		&& !BitrixSocialnetworkComponentHelper::checkLivefeedTasksAllowed()
	))
	{
		if (!$bHasAccessAll)
		{
			CUserCounter::IncrementWithSelect(
				CSocNetLogCounter::GetSubSelect2(
					$arLogComment["ID"],
					array(
						"TYPE" => "LC",
						"FOR_ALL_ACCESS" => $bHasAccessAll
					)
				),
				true,
				[
					'SET_ENTITY' => 'Y',
					'SET_ENTRY' => 'Y',
				]
			);
		}
		else // for all, mysql only
		{
			$tag = time();
			CUserCounter::IncrementWithSelect(
				CSocNetLogCounter::GetSubSelect2(
					$arLogComment["ID"],
					array(
						"TYPE" => "LC",
						"FOR_ALL_ACCESS_ONLY" => true,
						"TAG_SET" => $tag
					)
				),
				false, // sendpull
				array(
					"TAG_SET" => $tag,
					'SET_ENTITY' => 'Y',
					'SET_ENTRY' => 'Y',
				)
			);

			CUserCounter::IncrementWithSelect(
				CSocNetLogCounter::GetSubSelect2(
					$arLogComment["ID"],
					array(
						"TYPE" => "LC",
						"FOR_ALL_ACCESS_ONLY" => false
					)
				),
				true, // sendpull
				array(
					"TAG_CHECK" => $tag,
					'SET_ENTITY' => 'Y',
					'SET_ENTRY' => 'Y',
				)
			);
		}
	}

	return true;
}