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;
}