public function Update($ID, $arFields)
{
/** @global CMain $APPLICATION */
global $DB, $APPLICATION, $CACHE_MANAGER;
$ID = intval($ID);
if(!$this->CheckFields($arFields, $ID))
return false;
foreach(GetModuleEvents("main", "OnBeforeGroupUpdate", true) as $arEvent)
{
$bEventRes = ExecuteModuleEventEx($arEvent, array($ID, &$arFields));
if($bEventRes===false)
{
if($err = $APPLICATION->GetException())
$this->LAST_ERROR .= $err->GetString()."
";
else
$this->LAST_ERROR .= "Unknown error in OnBeforeGroupUpdate handler."."
";
return false;
}
}
if($ID<=2)
unset($arFields["ACTIVE"]);
if(is_set($arFields, "ACTIVE") && $arFields["ACTIVE"]!="Y")
$arFields["ACTIVE"]="N";
$strUpdate = $DB->PrepareUpdate("b_group", $arFields);
if(!is_set($arFields, "TIMESTAMP_X"))
$strUpdate .= ", TIMESTAMP_X = ".$DB->GetNowFunction();
$strSql = "UPDATE b_group SET $strUpdate WHERE ID=".$ID;
if(is_set($arFields, "SECURITY_POLICY"))
{
if(COption::GetOptionString("main", "event_log_group_policy", "N") === "Y")
{
//get old security policy
$aPrevPolicy = array();
$res = $DB->Query("SELECT SECURITY_POLICY FROM b_group WHERE ID=".$ID);
if(($res_arr = $res->Fetch()) && $res_arr["SECURITY_POLICY"] <> '')
$aPrevPolicy = unserialize($res_arr["SECURITY_POLICY"], ['allowed_classes' => false]);
//compare with new one
$aNewPolicy = array();
if($arFields["SECURITY_POLICY"] <> '')
$aNewPolicy = unserialize($arFields["SECURITY_POLICY"], ['allowed_classes' => false]);
$aDiff = array_diff_assoc($aNewPolicy, $aPrevPolicy);
if(empty($aDiff))
$aDiff = array_diff_assoc($aPrevPolicy, $aNewPolicy);
if(!empty($aDiff))
CEventLog::Log("SECURITY", "GROUP_POLICY_CHANGED", "main", $ID, print_r($aPrevPolicy, true)." => ".print_r($aNewPolicy, true));
}
$DB->QueryBind($strSql, array("SECURITY_POLICY"=>$arFields["SECURITY_POLICY"]), false);
}
else
{
$DB->Query($strSql, false, "FILE: ".__FILE__."
LINE: ".__LINE__);
}
if(is_set($arFields, "USER_ID") && is_array($arFields["USER_ID"]))
{
$log = (COption::GetOptionString("main", "event_log_user_groups", "N") === "Y");
if($log)
{
//remember users in the group
$aPrevUsers = array();
$res = $DB->Query("SELECT USER_ID FROM b_user_group WHERE GROUP_ID=".$ID.($ID=="1"?" AND USER_ID<>1":""));
while($res_arr = $res->Fetch())
$aPrevUsers[] = $res_arr["USER_ID"];
}
$DB->Query("DELETE FROM b_user_group WHERE GROUP_ID=".$ID.($ID=="1"?" AND USER_ID<>1":""));
$arUsers = $arFields["USER_ID"];
$arTmp = array();
foreach($arUsers as $user)
{
if(!is_array($user))
$user = array("USER_ID" => $user);
$user_id = intval($user["USER_ID"]);
if(
$user_id > 0
&& !isset($arTmp[$user_id])
&& ($ID != 1 || $user_id != 1)
)
{
$arInsert = $DB->PrepareInsert("b_user_group", $user);
$strSql = "
INSERT INTO b_user_group (
GROUP_ID, ".$arInsert[0]."
) VALUES (
".$ID.", ".$arInsert[1]."
)
";
$DB->Query($strSql, false, "FILE: ".__FILE__."
LINE: ".__LINE__);
$arTmp[$user_id] = true;
}
}
$aNewUsers = array_keys($arTmp);
CUser::clearUserGroupCache();
if($log)
{
/** @noinspection PhpUndefinedVariableInspection */
foreach($aPrevUsers as $user_id)
{
if(!in_array($user_id, $aNewUsers))
{
$UserName = '';
$rsUser = CUser::GetByID($user_id);
if($arUser = $rsUser->GetNext())
$UserName = ($arUser["NAME"] != "" || $arUser["LAST_NAME"] != "") ? trim($arUser["NAME"]." ".$arUser["LAST_NAME"]) : $arUser["LOGIN"];
$res_log = array(
"groups" => "-(".$ID.")",
"user" => $UserName
);
CEventLog::Log("SECURITY", "USER_GROUP_CHANGED", "main", $user_id, serialize($res_log));
}
}
foreach($aNewUsers as $user_id)
{
if(!in_array($user_id, $aPrevUsers))
{
$UserName = '';
$rsUser = CUser::GetByID($user_id);
if($arUser = $rsUser->GetNext())
$UserName = ($arUser["NAME"] != "" || $arUser["LAST_NAME"] != "") ? trim($arUser["NAME"]." ".$arUser["LAST_NAME"]) : $arUser["LOGIN"];
$res_log = array(
"groups" => "+(".$ID.")",
"user" => $UserName
);
CEventLog::Log("SECURITY", "USER_GROUP_CHANGED", "main", $user_id, serialize($res_log));
}
}
}
}
foreach (GetModuleEvents("main", "OnAfterGroupUpdate", true) as $arEvent)
ExecuteModuleEventEx($arEvent, array($ID, &$arFields));
if (defined("CACHED_b_group") && CACHED_b_group !== false)
$CACHE_MANAGER->CleanDir("b_group");
ModuleGroupTable::cleanCache();
return true;
}