static function Add($LOG_ID, $GROUP_CODE, $bShare = false, $followSet = true)
{
global $DB, $CACHE_MANAGER;
static $logDataCache = array();
if (is_array($GROUP_CODE))
{
foreach($GROUP_CODE as $GROUP_CODE_TMP)
{
CSocNetLogRights::Add($LOG_ID, $GROUP_CODE_TMP, $bShare, $followSet);
}
return false;
}
else
{
$db_events = GetModuleEvents("socialnetwork", "OnBeforeSocNetLogRightsAdd");
while ($arEvent = $db_events->Fetch())
{
if (ExecuteModuleEventEx($arEvent, array($LOG_ID, $GROUP_CODE)) === false)
{
return false;
}
}
if (!isset($logDataCache[$LOG_ID]))
{
$res = LogTable::getList(array(
'filter' => array(
'ID' => $LOG_ID
),
'select' => array('LOG_UPDATE')
));
if ($logEntry = $res->fetch())
{
$logDataCache[$LOG_ID] = $logEntry;
}
}
$fields = array(
"LOG_ID" => $LOG_ID,
"GROUP_CODE" => $GROUP_CODE,
);
if (
!empty($logDataCache[$LOG_ID])
&& !empty($logDataCache[$LOG_ID]['LOG_UPDATE'])
&& ($logDataCache[$LOG_ID]['LOG_UPDATE'] instanceof BitrixMainTypeDateTime)
)
{
$fields['LOG_UPDATE'] = $logDataCache[$LOG_ID]['LOG_UPDATE']->toString();
}
$NEW_RIGHT_ID = $DB->add(
"b_sonet_log_right",
$fields,
array(),
"",
true // ignore errors
);
if ($NEW_RIGHT_ID)
{
if (preg_match('/^U(d+)$/', $GROUP_CODE, $matches))
{
if($followSet)
{
BitrixSocialnetworkComponentHelper::userLogSubscribe(array(
'logId' => $LOG_ID,
'userId' => $matches[1],
'typeList' => array(
'FOLLOW',
),
'followDate' => 'CURRENT'
));
}
}
elseif (
$bShare
&& preg_match('/^SG(d+)$/', $GROUP_CODE, $matches)
)
{
// get all members who unfollow and set'em unfollow from the date
$arUserIDToCheck = array();
$rsGroupMembers = CSocNetUserToGroup::GetList(
array(),
array(
"GROUP_ID" => $matches[1],
"USER_ACTIVE" => "Y",
"<=ROLE" => SONET_ROLES_USER
),
false,
false,
array("USER_ID")
);
while ($arGroupMembers = $rsGroupMembers->Fetch())
{
$arUserIDToCheck[] = $arGroupMembers["USER_ID"];
}
if (!empty($arUserIDToCheck))
{
$arUserIDFollowDefault = array(
"Y" => array(),
"N" => array()
);
$arUserIDAlreadySaved = array();
$default_follow_type = COption::GetOptionString("socialnetwork", "follow_default_type", "Y");
$rsFollow = CSocNetLogFollow::GetList(
array(
"USER_ID" => $arUserIDToCheck,
"CODE" => "**"
),
array("USER_ID", "TYPE")
);
while($arFollow = $rsFollow->Fetch())
{
$arUserIDFollowDefault[$arFollow["TYPE"]][] = $arFollow["USER_ID"];
}
$rsFollow = CSocNetLogFollow::GetList(
array(
"USER_ID" => $arUserIDToCheck,
"CODE" => "L".$LOG_ID
),
array("USER_ID")
);
while($arFollow = $rsFollow->Fetch())
{
$arUserIDAlreadySaved[] = $arFollow["USER_ID"];
}
foreach($arUserIDToCheck as $iUserID)
{
// for them who not followed by default and not already saved follow/unfollow for the log entry
if (
!in_array($iUserID, $arUserIDAlreadySaved)
&& (
(
$default_follow_type == "N"
&& !in_array($iUserID, $arUserIDFollowDefault["Y"])
)
|| (
$default_follow_type == "Y"
&& in_array($iUserID, $arUserIDFollowDefault["N"])
)
)
)
{
CSocNetLogFollow::Add(
$iUserID,
"L".$LOG_ID,
"N",
ConvertTimeStamp(time() + CTimeZone::GetOffset(), "FULL", SITE_ID)
);
}
}
}
}
}
if(defined("BX_COMP_MANAGED_CACHE"))
{
$CACHE_MANAGER->ClearByTag("SONET_LOG_".intval($LOG_ID));
}
if (BitrixMainLoader::includeModule('landing'))
{
BitrixSocialnetworkIntegrationLandingLivefeed::onSocNetLogRightsAddHandler($GROUP_CODE);
}
return $NEW_RIGHT_ID;
}
}