public static function Add($LOG_ID, $GROUP_CODE, $bShare = false, $followSet = true) { global $DB; 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; } } $NEW_RIGHT_ID = $DB->Add("b_sonet_log_right", array("LOG_ID" => $LOG_ID, "GROUP_CODE" => $GROUP_CODE), array(), "", true); if ($NEW_RIGHT_ID) { if (preg_match('/^U(\\d+)$/', $GROUP_CODE, $matches)) { if ($followSet) { CSocNetLogFollow::Set($matches[1], "L" . $LOG_ID, "Y", ConvertTimeStamp(time() + CTimeZone::GetOffset(), "FULL", SITE_ID)); } } 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")) { $GLOBALS["CACHE_MANAGER"]->ClearByTag("SONET_LOG_" . intval($LOG_ID)); } return $NEW_RIGHT_ID; } }
function Set($user_id, $code = "**", $type = "Y", $follow_date = false, $site_id = SITE_ID) { static $LOG_CACHE; if (strlen($code) <= 0) { $code = "**"; } if ($type != "Y") { $type = "N"; } if (intval($user_id) <= 0) { $user_id = $GLOBALS["USER"]->GetID(); } $arFollows = array(); $rsFollow = CSocNetLogFollow::GetList(array("USER_ID" => $user_id, "CODE" => array_unique(array("**", $code)))); while ($arFollow = $rsFollow->Fetch()) { $arFollows[$arFollow["CODE"]] = array("TYPE" => $arFollow["TYPE"], "FOLLOW_DATE" => $arFollow["FOLLOW_DATE"]); } if (array_key_exists("**", $arFollows)) { $default_type = $arFollows["**"]["TYPE"]; } else { $default_type = COption::GetOptionString("socialnetwork", "follow_default_type", "Y"); } if (preg_match('/^L(\\d+)$/', $code, $matches)) { $log_id = intval($matches[1]); if ($log_id > 0) { if (isset($LOG_CACHE[$log_id])) { $arLog = $LOG_CACHE[$log_id]; } else { $rsLog = CSocNetLog::GetList(array("ID" => "DESC"), array("ID" => $log_id), false, false, array("ID", "LOG_UPDATE", "LOG_DATE"), array("CHECK_RIGHTS" => "N", "USE_SUBSCRIBE" => "N", "USE_FOLLOW" => "N")); if ($arLog = $rsLog->Fetch()) { $LOG_CACHE[$log_id] = $arLog; } } if ($arLog) { $log_date = strlen($arLog["LOG_DATE"]) > 0 ? $arLog["LOG_DATE"] : false; $log_update = strlen($arLog["LOG_UPDATE"]) > 0 ? $arLog["LOG_UPDATE"] : false; if (array_key_exists($code, $arFollows)) { // already in the follows table $res = CSocNetLogFollow::Update($user_id, $code, $type, strlen($arFollows[$code]["FOLLOW_DATE"]) > 0 ? $arFollows[$code]["FOLLOW_DATE"] : ($type == "N" ? $log_update : $log_date)); } elseif ($type != $default_type) { // new record in the follow table only if not equal to default type $res = CSocNetLogFollow::Add($user_id, $code, $type, $follow_date ? $follow_date : ($type == "N" ? $log_update : $log_date)); } } } } else { if (array_key_exists($code, $arFollows)) { $res = CSocNetLogFollow::Update($user_id, $code, $type, false); } else { $res = CSocNetLogFollow::Add($user_id, $code, $type, false); } } return $res; }