%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /home/bitrix/www/bitrix/modules/main/classes/general/
Upload File :
Create Path :
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;
	}
}

Zerion Mini Shell 1.0