%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/modules/main/classes/general/ |
| Current File : //home/bitrix/www/bitrix/modules/main/classes/general/user_options.php |
<?php
/**
* Bitrix Framework
* @package bitrix
* @subpackage main
* @copyright 2001-2013 Bitrix
*/
class CUserOptions
{
protected static $cache = array();
public static function GetList($arOrder = array("ID" => "ASC"), $arFilter = array())
{
global $DB;
$arSqlSearch = array();
foreach ($arFilter as $key => $val)
{
$key = strtoupper($key);
switch ($key)
{
case "ID":
$arSqlSearch[] = "UO.ID = ".intval($val);
break;
case "USER_ID":
$arSqlSearch[] = "UO.USER_ID = ".intval($val);
break;
case "USER_ID_EXT":
$arSqlSearch[] = "(UO.USER_ID = ".intval($val)." OR UO.COMMON='Y')";
break;
case "CATEGORY":
$arSqlSearch[] = "UO.CATEGORY = '".$DB->ForSql($val)."'";
break;
case "NAME":
$arSqlSearch[] = "UO.NAME = '".$DB->ForSql($val)."'";
break;
case "NAME_MASK":
$arSqlSearch[] = GetFilterQuery("UO.NAME", $val);
break;
case "COMMON":
$arSqlSearch[] = "UO.COMMON = '".$DB->ForSql($val)."'";
break;
}
}
$strSqlSearch = "";
foreach ($arSqlSearch as $condition)
if (strlen($condition) > 0)
$strSqlSearch.= " AND (".$condition.") ";
$strSql = "
SELECT UO.ID, UO.USER_ID, UO.CATEGORY, UO.NAME, UO.COMMON, UO.VALUE
FROM b_user_option UO
WHERE 1 = 1
".$strSqlSearch."
";
$arSqlOrder = array();
if (is_array($arOrder))
{
foreach ($arOrder as $by => $order)
{
$by = strtoupper($by);
$order = strtoupper($order);
if ($order != "ASC")
$order = "DESC";
if ($by == "ID")
$arSqlOrder[$by] = " UO.ID ".$order." ";
elseif ($by == "USER_ID")
$arSqlOrder[$by] = " UO.USER_ID ".$order." ";
elseif ($by == "CATEGORY")
$arSqlOrder[$by] = " UO.CATEGORY ".$order." ";
elseif ($by == "NAME")
$arSqlOrder[$by] = " UO.NAME ".$order." ";
elseif ($by == "COMMON")
$arSqlOrder[$by] = " UO.COMMON ".$order." ";
}
}
if (!empty($arSqlOrder))
$strSqlOrder = "ORDER BY ".implode(", ", $arSqlOrder);
else
$strSqlOrder = "";
$res = $DB->Query($strSql.$strSqlOrder, false, "FILE: ".__FILE__."<br> LINE: ".__LINE__);
return $res;
}
public static function GetOption($category, $name, $default_value = false, $user_id = false)
{
global $DB, $USER, $CACHE_MANAGER;
if ($user_id === false && is_object($USER) && ((get_class($USER) === 'CUser') || ($USER instanceof CUser)))
$user_id = $USER->GetID();
$user_id = intval($user_id);
$category = strtolower($category);
if (!is_array(self::$cache[$user_id][$category]) || !array_key_exists($name, self::$cache[$user_id][$category]))
{
if ($user_id > 0)
{
// options for specified user from managed cache
if (!isset(self::$cache[$user_id][$category]))
{
$mcache_id = "user_option:".$user_id.":".$category;
if ($CACHE_MANAGER->read(3600, $mcache_id, "user_option"))
{
self::$cache[$user_id][$category] = $CACHE_MANAGER->get($mcache_id);
}
else
{
$strSql = "
SELECT CATEGORY, NAME, VALUE, COMMON
FROM b_user_option
WHERE (USER_ID=".$user_id." OR USER_ID=0 AND COMMON='Y')
AND CATEGORY='".$DB->ForSql($category)."'
";
$res = $DB->Query($strSql);
while ($res_array = $res->Fetch())
{
if (!isset(self::$cache[$user_id][$category][$res_array["NAME"]]) || $res_array["COMMON"] <> 'Y')
self::$cache[$user_id][$category][$res_array["NAME"]] = unserialize($res_array["VALUE"]);
}
$CACHE_MANAGER->Set($mcache_id, self::$cache[$user_id][$category]);
}
}
if (!isset(self::$cache[$user_id][$category][$name]))
{
self::$cache[$user_id][$category][$name] = null;
}
}
else
{
// options for user '0' from DB (there are much more options for user '0' than for specific one)
if (!isset(self::$cache[$user_id][$category]))
{
$strSql = "
SELECT CATEGORY, NAME, VALUE, COMMON
FROM b_user_option
WHERE (USER_ID=".$user_id." OR USER_ID=0 AND COMMON='Y')
AND CATEGORY='".$DB->ForSql($category)."'
";
$res = $DB->Query($strSql);
while ($res_array = $res->Fetch())
{
if (!isset(self::$cache[$user_id][$category][$res_array["NAME"]]) || $res_array["COMMON"] <> 'Y')
self::$cache[$user_id][$category][$res_array["NAME"]] = unserialize($res_array["VALUE"]);
}
}
if (!isset(self::$cache[$user_id][$category][$name]))
{
self::$cache[$user_id][$category][$name] = null;
}
}
}
if (!isset(self::$cache[$user_id][$category][$name]))
{
return $default_value;
}
return self::$cache[$user_id][$category][$name];
}
public static function SetOption($category, $name, $value, $bCommon = false, $user_id = false)
{
global $DB, $USER, $CACHE_MANAGER;
if($bCommon == true)
{
$user_id = 0;
}
elseif($user_id === false)
{
if(!is_object($USER))
{
return false;
}
$user_id = $USER->GetID();
}
$category = strtolower($category);
$user_id = intval($user_id);
$arFields = array(
"USER_ID" => $user_id,
"CATEGORY" => $category,
"NAME" => $name,
"VALUE" => serialize($value),
"COMMON" => ($bCommon ? "Y" : "N"),
);
if($DB->type == "ORACLE")
{
//old way because MERGE doesn't support bindings
$res = $DB->Query("
SELECT ID FROM b_user_option
WHERE
".($bCommon ? "USER_ID=0 AND COMMON='Y' " : "USER_ID=".$user_id)."
AND CATEGORY='".$DB->ForSql($category, 50)."'
AND NAME='".$DB->ForSql($name, 255)."'
");
if ($res_array = $res->Fetch())
{
$strUpdate = $DB->PrepareUpdate("b_user_option", $arFields);
if ($strUpdate != "")
{
$strSql = "UPDATE b_user_option SET ".$strUpdate." WHERE ID=".$res_array["ID"];
if (!$DB->QueryBind($strSql, array("VALUE" => $arFields["VALUE"])))
return false;
}
}
else
{
if (!$DB->Add("b_user_option", $arFields, array("VALUE")))
return false;
}
}
else
{
$arUpdateFields = array(
"VALUE" => $arFields["VALUE"],
"COMMON" => $arFields["COMMON"],
);
$helper = \Bitrix\Main\Application::getConnection()->getSqlHelper();
$sql = $helper->prepareMerge("b_user_option", array("USER_ID", "CATEGORY", "NAME"), $arFields, $arUpdateFields);
if(!$DB->Query(current($sql)))
{
return false;
}
}
if($bCommon)
{
$CACHE_MANAGER->cleanDir("user_option");
self::$cache = array();
}
else
{
$CACHE_MANAGER->clean("user_option:".$user_id.":".$category, "user_option");
unset(self::$cache[$user_id][$category]);
}
return true;
}
public static function SetOptionsFromArray($aOptions)
{
global $USER;
foreach ($aOptions as $opt)
{
if ($opt["c"] <> "" && $opt["n"] <> "")
{
$val = $opt["v"];
if (is_array($opt["v"]))
{
$val = CUserOptions::GetOption($opt["c"], $opt["n"], array());
if(is_array($val))
{
foreach ($opt["v"] as $k => $v)
$val[$k] = $v;
}
else
{
$val = $opt["v"];
}
}
CUserOptions::SetOption($opt["c"], $opt["n"], $val);
if ($opt["d"] == "Y" && $USER->CanDoOperation('edit_other_settings'))
CUserOptions::SetOption($opt["c"], $opt["n"], $val, true);
}
}
}
public static function DeleteOption($category, $name, $bCommon = false, $user_id = false)
{
global $DB, $USER, $CACHE_MANAGER;
if ($user_id === false)
$user_id = $USER->GetID();
$user_id = intval($user_id);
$strSql = "
DELETE FROM b_user_option
WHERE ".($bCommon ? "USER_ID=0 AND COMMON='Y' " : "USER_ID=".$user_id)."
AND CATEGORY='".$DB->ForSql($category, 50)."'
AND NAME='".$DB->ForSql($name, 255)."'
";
if ($DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__))
{
if($bCommon)
{
$CACHE_MANAGER->cleanDir("user_option");
self::$cache = array();
}
else
{
$CACHE_MANAGER->clean("user_option:".$user_id.":".$category, "user_option");
unset(self::$cache[$user_id][$category]);
}
return true;
}
return false;
}
public static function DeleteCommonOptions()
{
global $DB, $CACHE_MANAGER;
if ($DB->Query("DELETE FROM b_user_option WHERE COMMON='Y' AND NAME NOT LIKE '~%'", false, "File: ".__FILE__."<br>Line: ".__LINE__))
{
$CACHE_MANAGER->cleanDir("user_option");
self::$cache = array();
return true;
}
return false;
}
public static function DeleteUsersOptions($user_id=false)
{
global $DB, $CACHE_MANAGER;
if ($DB->Query("DELETE FROM b_user_option WHERE USER_ID<>0 AND NAME NOT LIKE '~%' ".($user_id <> false? " AND USER_ID=".intval($user_id):""), false, "File: ".__FILE__."<br>Line: ".__LINE__))
{
$CACHE_MANAGER->cleanDir("user_option");
self::$cache = array();
return true;
}
return false;
}
public static function DeleteOptionsByName($category, $name)
{
global $DB, $CACHE_MANAGER;
$strSql = "DELETE FROM b_user_option WHERE CATEGORY='".$DB->ForSql($category, 50)."' AND NAME='".$DB->ForSql($name, 255)."'";
if ($DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__))
{
$CACHE_MANAGER->cleanDir("user_option");
self::$cache = array();
return true;
}
return false;
}
public static function SetCookieOptions($cookieName)
{
//last user setting
$varCookie = array();
parse_str($_COOKIE[$cookieName], $varCookie);
setcookie($cookieName, false, false, "/");
if (is_array($varCookie["p"]) && $varCookie["sessid"] == bitrix_sessid())
{
$arOptions = $varCookie["p"];
CUtil::decodeURIComponent($arOptions);
CUserOptions::SetOptionsFromArray($arOptions);
}
}
//*****************************
// Events
//*****************************
//user deletion event
public static function OnUserDelete($user_id)
{
global $DB, $CACHE_MANAGER;
$user_id = intval($user_id);
if ($DB->Query("DELETE FROM b_user_option WHERE USER_ID=". $user_id, false, "File: ".__FILE__."<br>Line: ".__LINE__))
{
$CACHE_MANAGER->cleanDir("user_option");
self::$cache = array();
return true;
}
return false;
}
}