• Модуль: socialnetwork
  • Путь к файлу: ~/bitrix/modules/socialnetwork/classes/general/event_user_view.php
  • Класс: CAllSocNetEventUserView
  • Вызов: CAllSocNetEventUserView::SetFeature
static function SetFeature($entityType, $entityID, $feature, $op = false, $permX = false, $bCheckEmpty = false)
{
	global $APPLICATION, $DB, $arSocNetAllowedEntityTypes;

	$arSocNetFeaturesSettings = CSocNetAllowed::GetAllowedFeatures();
	$arSocNetAllowedSubscribeEntityTypesDesc = CSocNetAllowed::GetAllowedEntityTypesDesc();

	$CacheRelatedUsers = array();
	
	$entityType = trim($entityType);
	if (!in_array($entityType, $arSocNetAllowedEntityTypes))
	{
		$GLOBALS["APPLICATION"]->ThrowException(GetMessage("SONET_EUV_INCORRECT_ENTITY_TYPE"), "ERROR_INCORRECT_ENTITY_TYPE");
		return false;
	}
	
	$entityID = intval($entityID);
	if ($entityID <= 0)
	{
		$GLOBALS["APPLICATION"]->ThrowException(GetMessage("SONET_EUV_EMPTY_ENTITY_ID"), "ERROR_EMPTY_ENTITY_ID");
		return false;
	}

	if (!$bCheckEmpty || !CSocNetEventUserView::IsEntityEmpty($entityType, $entityID))
	{		
		$event_id = array();
		if (!$op || !$permX)
		{
			if (
				array_key_exists($feature, $arSocNetFeaturesSettings) 
				&& array_key_exists("subscribe_events", $arSocNetFeaturesSettings[$feature])
			)
			{
				foreach ($arSocNetFeaturesSettings[$feature]["subscribe_events"] as $event_id_tmp => $arEventIDTmp)
				{
					if (
						array_key_exists("NO_SET", $arEventIDTmp)
						&& $arEventIDTmp["NO_SET"]
					)
						continue;

					if (
						!array_key_exists("ENTITIES", $arEventIDTmp)
						|| !array_key_exists($entityType, $arEventIDTmp["ENTITIES"])
					)
						continue;

					$event_id[$arEventIDTmp["OPERATION"]][] = $event_id_tmp;

					if (
						array_key_exists("COMMENT_EVENT", $arEventIDTmp)
						&& is_array($arEventIDTmp["COMMENT_EVENT"])
						&& array_key_exists("OPERATION", $arEventIDTmp["COMMENT_EVENT"])
						&& $arEventIDTmp["COMMENT_EVENT"]["OPERATION"] <> ''
					)
						$event_id[$arEventIDTmp["OPERATION"]][] = $arEventIDTmp["COMMENT_EVENT"]["EVENT_ID"];
				}
				if (is_array($event_id[$arEventIDTmp["OPERATION"]]))
					$event_id[$arEventIDTmp["OPERATION"]] = array_unique($event_id[$arEventIDTmp["OPERATION"]]);
			}
		}
		else
		{
			$arOpTmp = array();
			if (
				array_key_exists($feature, $arSocNetFeaturesSettings) 
				&& array_key_exists("subscribe_events", $arSocNetFeaturesSettings[$feature])
			)
			{
				foreach ($arSocNetFeaturesSettings[$feature]["subscribe_events"] as $event_id_tmp => $arEventIDTmp)
				{
					if (
						array_key_exists("NO_SET", $arEventIDTmp)
						&& $arEventIDTmp["NO_SET"]
					)
						continue;

					if (
						!array_key_exists("ENTITIES", $arEventIDTmp)
						|| !array_key_exists($entityType, $arEventIDTmp["ENTITIES"])
					)
						continue;

					if (
						!array_key_exists("OPERATION", $arEventIDTmp)
						|| $arEventIDTmp["OPERATION"] == ''
					)
						continue;
						
					$arOpTmp[] = $arEventIDTmp["OPERATION"];
					
					if (
						array_key_exists("COMMENT_EVENT", $arEventIDTmp)
						&& is_array($arEventIDTmp["COMMENT_EVENT"])
						&& array_key_exists("OPERATION", $arEventIDTmp["COMMENT_EVENT"])
						&& $arEventIDTmp["COMMENT_EVENT"]["OPERATION"] <> ''
					)
						$arOpTmp[] = $arEventIDTmp["COMMENT_EVENT"]["OPERATION"];
				}
			}
			if (is_array($arOpTmp))
				$arOpTmp = array_unique($arOpTmp);
		
			if (in_array($op, $arOpTmp))
			{
				foreach ($arSocNetFeaturesSettings[$feature]["subscribe_events"] as $event_id_tmp => $arEventIDTmp)
				{
					if ($arEventIDTmp["OPERATION"] == $op)
						$event_id[$op][] = $event_id_tmp;

					if (
						array_key_exists("COMMENT_EVENT", $arEventIDTmp)
						&& is_array($arEventIDTmp["COMMENT_EVENT"])
						&& array_key_exists("OPERATION", $arEventIDTmp["COMMENT_EVENT"])
						&& $arEventIDTmp["COMMENT_EVENT"]["OPERATION"] == $op
					)
						$event_id[$op][] = $arEventIDTmp["COMMENT_EVENT"]["EVENT_ID"];
				}
				if (is_array($event_id[$op]))
					$event_id[$op] = array_unique($event_id[$op]);
			}
			else
				return true;
		}

		if
		(
			intval($entityID) > 0
			&& array_key_exists($entityType, $arSocNetAllowedSubscribeEntityTypesDesc)
			&& array_key_exists("CLASS_DESC_GET", $arSocNetAllowedSubscribeEntityTypesDesc[$entityType])
			&& array_key_exists("METHOD_DESC_GET", $arSocNetAllowedSubscribeEntityTypesDesc[$entityType])
		)
			$arEntityTmp = call_user_func(
				array(
					$arSocNetAllowedSubscribeEntityTypesDesc[$entityType]["CLASS_DESC_GET"],
					$arSocNetAllowedSubscribeEntityTypesDesc[$entityType]["METHOD_DESC_GET"]
				),
				$entityID
			);

		foreach ($event_id as $op => $arEvent)
		{
			$arRelatedUsers = array();

			if (is_array($arEvent))
			{
				foreach($arEvent as $event)
				{
					if (!CSocNetEventUserView::Delete($entityType, $entityID, $feature, $event))
					{
						$GLOBALS["APPLICATION"]->ThrowException(GetMessage("SONET_EUV_ERROR_DELETE"), "ERROR_DELETE");
						return false;
					}
			
					if (!$feature || !$permX)
						$perm = CSocNetFeaturesPerms::GetOperationPerm($entityType, $entityID, $feature, $op);
					else
						$perm = $permX;

					if (
						$entityType == SONET_SUBSCRIBE_ENTITY_GROUP
						&& $arEntityTmp
						&& $arEntityTmp["VISIBLE"] == "N"
						&& $perm > SONET_ROLES_USER
					)
						$perm = SONET_ROLES_USER;
					elseif ($entityType == SONET_SUBSCRIBE_ENTITY_USER)
					{
						$perm_profile = CSocNetUserPerms::GetOperationPerms($entityID, "viewprofile");
						if ($perm < $perm_profile)
							$perm = $perm_profile;
					}
						
					if (
						array_key_exists($entityType, $CacheRelatedUsers)
						&& array_key_exists($entityID, $CacheRelatedUsers[$entityType])
						&& array_key_exists($perm, $CacheRelatedUsers[$entityType][$entityID])
					)
						$arRelatedUsers = $CacheRelatedUsers[$entityType][$entityID][$perm];
					else
					{
						if ($entityType == SONET_SUBSCRIBE_ENTITY_USER)
						{
							switch($perm)
							{
								case SONET_RELATIONS_TYPE_FRIENDS:
									$arRelatedUsers[] = array("entity_id" => $entityID, "user_id" => $entityID);
									$dbFriends = CSocNetUserRelations::GetRelatedUsers($entityID, SONET_RELATIONS_FRIEND);
									while ($arFriends = $dbFriends->Fetch())
									{
										$friendID = (($entityID == $arFriends["FIRST_USER_ID"]) ? $arFriends["SECOND_USER_ID"] : $arFriends["FIRST_USER_ID"]);
										$arRelatedUsers[] = array("entity_id" => $entityID, "user_id" => $friendID);
									}
									break;			
								case SONET_RELATIONS_TYPE_FRIENDS2:
									$arRelatedUsers[] = array("entity_id" => $entityID, "user_id" => $entityID);
									$dbFriends = CSocNetUserRelations::GetRelatedUsers($entityID, SONET_RELATIONS_FRIEND);
									while ($arFriends = $dbFriends->Fetch())
									{
										$friendID = (($entityID == $arFriends["FIRST_USER_ID"]) ? $arFriends["SECOND_USER_ID"] : $arFriends["FIRST_USER_ID"]);
										$arRelatedUsers[] = array("entity_id" => $entityID, "user_id" => $friendID);
										
										$dbFriends2 = CSocNetUserRelations::GetRelatedUsers($friendID, SONET_RELATIONS_FRIEND);
										while ($arFriends2 = $dbFriends2->Fetch())
										{
											$friendID2 = (($friendID == $arFriends2["FIRST_USER_ID"]) ? $arFriends2["SECOND_USER_ID"] : $arFriends2["FIRST_USER_ID"]);
											if ($friendID2 != $entityID)
												$arRelatedUsers[] = array("entity_id" => $entityID, "user_id" => $friendID2, "user_im_id" => $friendID);
										}
									}
									break;
								case SONET_RELATIONS_TYPE_NONE:
									$arRelatedUsers[] = array("entity_id" => $entityID, "user_id" => $entityID);
									break;
								case SONET_RELATIONS_TYPE_AUTHORIZED:
									$arRelatedUsers[] = array("entity_id" => $entityID, "user_id" => 0);
									break;
								case SONET_RELATIONS_TYPE_ALL:
									$arRelatedUsers = false;
									break;
							}
							if (!empty($arRelatedUsers))
								$arRelatedUsers = array_unique($arRelatedUsers);
								
							$CacheRelatedUsers[SONET_ENTITY_USER][$entityID][$perm] = $arRelatedUsers;
						}
						elseif ($entityType == SONET_SUBSCRIBE_ENTITY_GROUP)
						{
							switch($perm)
							{
								case SONET_ROLES_USER:
									$dbResult = CSocNetUserToGroup::GetList(
																array(),
																array(
																	"GROUP_ID" => $entityID,
																	"<=ROLE" => SONET_ROLES_USER,
																	"USER_ACTIVE" => "Y"
																),
																false,
																false,
																array("USER_ID")
															);
									while ($arResult = $dbResult->Fetch())
										$arRelatedUsers[] = $arResult["USER_ID"];
									break;	
								case SONET_ROLES_MODERATOR:
									$dbResult = CSocNetUserToGroup::GetList(
																array(),
																array(
																	"GROUP_ID" => $entityID,
																	"<=ROLE" => SONET_ROLES_MODERATOR,
																	"USER_ACTIVE" => "Y"
																),
																false,
																false,
																array("USER_ID")
															);
									while ($arResult = $dbResult->Fetch())
										$arRelatedUsers[] = $arResult["USER_ID"];
									break;	
								case SONET_ROLES_OWNER:
									$dbResult = CSocNetUserToGroup::GetList(
																array(),
																array(
																	"GROUP_ID" => $entityID,
																	"<=ROLE" => SONET_ROLES_OWNER,
																	"USER_ACTIVE" => "Y"
																),
																false,
																false,
																array("USER_ID")
															);
									while ($arResult = $dbResult->Fetch())
										$arRelatedUsers[] = $arResult["USER_ID"];
									break;	
								case SONET_ROLES_AUTHORIZED:
									$arRelatedUsers[] = 0;
									break;
								case SONET_ROLES_ALL:
									$arRelatedUsers = false;
									break;
							}

							if ($arRelatedUsers && is_array($arRelatedUsers) && in_array(0, $arRelatedUsers))
								$arRelatedUsers = array(0);
							elseif ($arRelatedUsers && is_array($arRelatedUsers))
								$arRelatedUsers = array_unique($arRelatedUsers);
								
							$CacheRelatedUsers[SONET_ENTITY_GROUP][$entityID][$perm] = $arRelatedUsers;
						}
					}
					
					if($arRelatedUsers && is_array($arRelatedUsers))
					{
						foreach($arRelatedUsers as $relatedUserID)
						{
							if (is_array($relatedUserID))
							{
								$arFields = array(
									"ENTITY_TYPE" => $entityType,
									"ENTITY_ID" => $relatedUserID["entity_id"],
									"EVENT_ID" => $event,
									"USER_ID" => $relatedUserID["user_id"],
									"USER_ANONYMOUS" => "N"
								);
								
								if (array_key_exists("user_im_id", $relatedUserID))
									$arFields["USER_IM_ID"] = $relatedUserID["user_im_id"];
								
								if (!CSocNetEventUserView::Add($arFields))
								{
									$errorMessage = "";
									if ($e = $APPLICATION->GetException())
										$errorMessage = $e->GetString();
									if ($errorMessage == '')
										$errorMessage = GetMessage("SONET_EUV_ERROR_SET");

									$APPLICATION->ThrowException($errorMessage, "ERROR_SET");
									return false;
								}						
							}
							else
							{
								$arFields = array(
									"ENTITY_TYPE" => $entityType,
									"ENTITY_ID" => $entityID,
									"EVENT_ID" => $event,
									"USER_ID" => $relatedUserID,
									"USER_ANONYMOUS" => "N"
								);
								if (!CSocNetEventUserView::Add($arFields))
								{
									$errorMessage = "";
									if ($e = $APPLICATION->GetException())
										$errorMessage = $e->GetString();
									if ($errorMessage == '')
										$errorMessage = GetMessage("SONET_EUV_ERROR_SET");

									$APPLICATION->ThrowException($errorMessage, "ERROR_SET");
									return false;
								}
							}
						}
					}
					else
					{
						$arFields = array(
							"ENTITY_TYPE" => $entityType,
							"ENTITY_ID" => $entityID,
							"EVENT_ID" => $event,
							"USER_ID" => 0,
							"USER_ANONYMOUS" => "Y"
						);
						if (!CSocNetEventUserView::Add($arFields))
						{
							$errorMessage = "";
							if ($e = $APPLICATION->GetException())
								$errorMessage = $e->GetString();
							if ($errorMessage == '')
								$errorMessage = GetMessage("SONET_EUV_ERROR_SET");

							$APPLICATION->ThrowException($errorMessage, "ERROR_SET");
								return false;
						}
					}
				}
			}
		}
	}
	elseif($entityType == SONET_ENTITY_GROUP)
		CSocNetEventUserView::SetGroup($entityID, true);
	elseif($entityType == SONET_ENTITY_USER)
		CSocNetEventUserView::SetUser($entityID, false, false, true);

	return true;
}