1
0
mirror of https://github.com/e107inc/e107.git synced 2025-08-01 12:20:44 +02:00

Pref Handler: More work & PHPUnit Test Case - broken, work in progress

This commit is contained in:
secretr
2009-08-03 18:09:02 +00:00
parent 48200bd524
commit f700bd7a43

View File

@@ -9,8 +9,8 @@
* e107 Preference Handler * e107 Preference Handler
* *
* $Source: /cvs_backup/e107_0.8/e107_handlers/pref_class.php,v $ * $Source: /cvs_backup/e107_0.8/e107_handlers/pref_class.php,v $
* $Revision: 1.4 $ * $Revision: 1.5 $
* $Date: 2009-07-31 16:12:19 $ * $Date: 2009-08-03 18:09:02 $
* $Author: secretr $ * $Author: secretr $
*/ */
@@ -74,6 +74,8 @@ class e_pref extends e_model
*/ */
function __construct($prefid, $alias = '', $data = array()) function __construct($prefid, $alias = '', $data = array())
{ {
require_once(e_HANDLER.'cache_handler.php');
$this->prefid = $prefid; $this->prefid = $prefid;
if(empty($alias)) if(empty($alias))
{ {
@@ -110,32 +112,39 @@ class e_pref extends e_model
} }
/** /**
* Advanced setter - $pref_name is parsed (multidimensional arrays support), alias of {@link setData()} * Advanced setter - $pref_name is parsed (multidimensional arrays support)
* Object data reseting is not allowed, adding new pref is not allowed * Object data reseting is not allowed, adding new pref is not allowed
* @param string|array $key * @param string $key
* @param mixed $value * @param mixed $value
* @return e_pref * @return e_pref
*/ */
public function setPref($pref_name, $value) public function setPref($pref_name, $value)
{ {
return $this->setData($pref_name, $value, true); //object reset not allowed, adding new pref is not allowed
if(empty($pref_name) || !is_string($pref_name) || !$this->isData($pref_name))
{
return $this;
}
parent::setData($pref_name, $value, true);
return $this;
} }
/** /**
* Simple setter - $pref_name is not parsed (no multidimensional arrays support) * Simple setter - $pref_name is not parsed (no multidimensional arrays support)
* Adding new pref is not allowed * Adding new pref is not allowed
* *
* @param string|array $key * @param string $key
* @param mixed $value * @param mixed $value
* @return e_pref * @return e_pref
*/ */
public function set($pref_name, $value) public function set(string $pref_name, $value)
{ {
if(empty($pref_name) || false !== strpos($pref_name, '/') || !$this->isData($pref_name)) if(empty($pref_name))
{ {
return $this; return $this;
} }
return $this->setData($pref_name, $value, true); parent::set($pref_name, $value, true);
} }
/** /**
@@ -146,7 +155,7 @@ class e_pref extends e_model
* @param mixed $value * @param mixed $value
* @return e_pref * @return e_pref
*/ */
public function add($pref_name, $value = null) public function add(string $pref_name, $value = null)
{ {
if(!is_string($pref_name) || strpos($pref_name, '/')) if(!is_string($pref_name) || strpos($pref_name, '/'))
{ {
@@ -233,23 +242,11 @@ class e_pref extends e_model
/** /**
* Disallow public use of setData() * Disallow public use of setData()
* Object data reseting is not allowed
* Adding new preference key is not allowed
* *
* @see e_model::setData()
* @param string|array $key
* @param mixed $value
* @return e_pref * @return e_pref
*/ */
final public function setData($pref_name, $value, $strict) final public function setData()
{ {
//object reset not allowed, adding new pref is not allowed
if(empty($pref_name) || !$this->isData($pref_name))
{
return $this;
}
parent::setData($pref_name, $value, $strict);
return $this; return $this;
} }
@@ -312,9 +309,9 @@ class e_pref extends e_model
return $this->setData($data); return $this->setData($data);
} }
if ($this->getDb()->db_Select('core', 'e107_value', "e107_name='{$id}'")) if (e107::getDb()->db_Select('core', 'e107_value', "e107_name='{$id}'"))
{ {
$row = $this->getDb()->db_Fetch(); $row = e107::getDb()->db_Fetch();
if($this->serial_bc) if($this->serial_bc)
{ {
@@ -467,7 +464,7 @@ final class e_core_pref extends e_pref
* *
* @var array * @var array
*/ */
protected $alliases = array( protected $aliases = array(
'core' => 'SitePrefs', 'core' => 'SitePrefs',
'core_backup' => 'SitePrefs_Backup', 'core_backup' => 'SitePrefs_Backup',
'emote' => 'emote', 'emote' => 'emote',
@@ -491,17 +488,10 @@ final class e_core_pref extends e_pref
*/ */
function __construct($alias, $load = true) function __construct($alias, $load = true)
{ {
if($this->getAlias($alias)) $pref_alias = $alias;
{ $pref_id = $this->getConfigId($alias);
$pref_alias = $this->getAlias($alias);
$pref_id = $alias; if(!$pref_id)
}
elseif($this->getConfigId($alias))
{
$pref_id = $this->getConfigId($alias);
$pref_alias = $alias;
}
else
{ {
$pref_id = $pref_alias = ''; $pref_id = $pref_alias = '';
trigger_error('Core config ID '.$alias.' not found!', E_USER_WARNING); trigger_error('Core config ID '.$alias.' not found!', E_USER_WARNING);
@@ -536,11 +526,11 @@ final class e_core_pref extends e_pref
public function getConfigId($alias) public function getConfigId($alias)
{ {
$alias = trim($alias); $alias = trim($alias);
if(isset($this->alliases[$alias])) if(isset($this->aliases[$alias]))
{ {
return $this->allias[$alias]; return $this->aliases[$alias];
} }
return array_search($alias, $this->alliases); return false;
} }
/** /**
@@ -554,7 +544,7 @@ final class e_core_pref extends e_pref
public function getAlias($prefid) public function getAlias($prefid)
{ {
$prefid = trim($prefid); $prefid = trim($prefid);
return array_search($prefid, $this->alliases); return array_search($prefid, $this->aliases);
} }
} }
@@ -729,6 +719,16 @@ class e_model
return $this->_data_structure; return $this->_data_structure;
} }
/**
* Check if $key is in the Structure array
*
* @return boolean
*/
public function inStructure($key)
{
return isset($this->_data_structure[$key]);
}
/** /**
* Set object data structure if $_data_structure is empty * Set object data structure if $_data_structure is empty
* *
@@ -737,13 +737,43 @@ class e_model
*/ */
public function setStructure(array $struct = array()) public function setStructure(array $struct = array())
{ {
if(empty($this->_data_structure) || $struct) if($struct)
{
$this->_data_structure = array_unique($struct);
return $this;
}
if(empty($this->_data_structure))
{ {
$this->_data_structure = !empty($struct) ? array_unique($struct) : array_keys($this->getData()); $this->_data_structure = e_pref::array_rkeys($this->_data);
} }
return $this; return $this;
} }
/**
* Recursive version of PHP built-in array_keys()
* Convert all keys of associative mulitdimensional array to
* single (unique) numerical array
*
* @param array $array
* @return array
*/
public static function array_rkeys(array $array)
{
$akeys = array();
foreach (array_keys($array) as $k)
{
$akeys[] = $k;
if(is_array($array[$k]))
{
$akeys = array_merge($akeys, e_pref::array_rkeys($array[$k]));
}
}
return $akeys;
}
/** /**
* @return array * @return array
*/ */
@@ -969,7 +999,6 @@ class e_model
*/ */
public function remove($key) public function remove($key)
{ {
$this->data_has_changed = true;
return $this->_unsetDataSimple($key); return $this->_unsetDataSimple($key);
} }
@@ -986,7 +1015,6 @@ class e_model
*/ */
public function removeData($key = null) public function removeData($key = null)
{ {
$this->data_has_changed = true;
return $this->_unsetData($key); return $this->_unsetData($key);
} }
@@ -1259,6 +1287,8 @@ class e_model
* *
* If $strict is true and $key is an array, data will be filtered by the * If $strict is true and $key is an array, data will be filtered by the
* object structure * object structure
*
* If $strict is true and $key is a string, data value will be updated (set only if exist)
* *
* @param string|array $key * @param string|array $key
* @param mixed $value * @param mixed $value
@@ -1270,15 +1300,12 @@ class e_model
{ {
if(is_array($key)) if(is_array($key))
{ {
if($strict && $this->getStructure()) if($strict && '_data_structure' !== $data_src)
{ {
$struct = $this->getStructure(); $this->setStructure();//set default structure if empty
foreach($struct as $k) foreach(array_keys($key) as $k)
{ {
if(isset($key[$k])) $this->_setData($k, $key[$k], true, $data_src);
{
$this->_setData($k, $key[$k], $strict, $data_src);
}
} }
return $this; return $this;
} }
@@ -1286,6 +1313,23 @@ class e_model
return $this; return $this;
} }
//multidimensional array support - strict _setData for values of type array
if($strict && is_array($value))
{
foreach($key as $k => $v)
{
$this->_setData($key.'/'.$k, $v, true, $data_src);
}
return $this;
}
//data has changed - optimized (call _getData() only when needed)
if('_data' === $data_src && !$this->data_has_changed && $this->_getData($key, null, null, $data_src) != $value)
{
$this->data_has_changed = true;
}
//multidimensional array support - parse key
$key = trim($key, '/'); $key = trim($key, '/');
if(strpos($key,'/')) if(strpos($key,'/'))
{ {
@@ -1294,6 +1338,13 @@ class e_model
for ($i = 0, $l = count($keyArr); $i < $l; $i++) for ($i = 0, $l = count($keyArr); $i < $l; $i++)
{ {
$k = $keyArr[$i]; $k = $keyArr[$i];
//if strict - update only
if($strict && !$this->inStructure($k))
{
return $this;
}
if (!isset($data[$k])) if (!isset($data[$k]))
{ {
$data[$k] = array(); $data[$k] = array();
@@ -1304,6 +1355,11 @@ class e_model
} }
else else
{ {
//if strict - update only
if($strict && !$this->inStructure($key))
{
return $this;
}
$this->$data_src[$key] = $value; $this->$data_src[$key] = $value;
} }
@@ -1320,12 +1376,29 @@ class e_model
* @param string $data_src * @param string $data_src
* @return unknown * @return unknown
*/ */
protected function _setDataSimple($key, $value = null, $strict = false, $data_src = '_data') protected function _setDataSimple(string $key, $value = null, $strict = false, $data_src = '_data')
{ {
if(!$strict || in_array($key, $this->getStructure())) if(!$strict)
{ {
$this->$data_src[$key] = $value; $this->$data_src[$key] = $value;
//data has changed
if('_data' === $data_src && $this->_getDataSimple($key, null, $data_src) != $value)
{
$this->data_has_changed = true;
}
return $this;
} }
$this->setStructure();//set default structure if empty
if($this->inStructure($key))
{
if('_data' === $data_src && $this->_getDataSimple($key, null, $data_src) != $value)
{
$this->data_has_changed = true;
}
$this->$data_src[$key] = $value;
}
return $this; return $this;
} }
@@ -1336,35 +1409,36 @@ class e_model
* If $strict is true, data will be filtered by the * If $strict is true, data will be filtered by the
* object structure. NOTE - Multidimensional arrays are not filtered. * object structure. NOTE - Multidimensional arrays are not filtered.
* *
* @param array $arr * @param string|array $key
* @param mixed $value
* @param boolean $strict * @param boolean $strict
* @param boolean $override allow override of existing data * @param boolean $override allow override of existing data
* @param string $data_src data source * @param string $data_src data source
* @return e_model * @return e_model
*/ */
protected function _addData(array $arr, $strict = true, $override = true, $data_src = '_data') protected function _addData($key, $value = null, $strict = false, $override = true, $data_src = '_data')
{ {
if($strict && $this->getStructure()) if(is_array($key))
{ {
$struct = $this->getStructure(); foreach($key as $k => $v)
foreach($struct as $key => $value) {
{ $this->_addData($k, $v, $strict, $data_src);
if(!$override && $this->isData($key)) }
{ return $this;
continue;
}
if(isset($arr[$key]))
{
$this->_setData($key, $value, $strict, $data_src);
}
}
return $this;
} }
foreach($arr as $key => $value) if($override || $this->isData($key))
{ {
$this->_setData($key, $value, $strict, $data_src); if(is_array($value))
} {
foreach($key as $k => $v)
{
$this->_addData($key.'/'.$k, $v, $strict, $override, $data_src);
}
return $this;
}
$this->_setData($key, $value, $strict, $data_src);
}
return $this; return $this;
} }
@@ -1382,6 +1456,10 @@ class e_model
{ {
if (null === $key) if (null === $key)
{ {
if('_data' === $data_src && !empty($this->_data))
{
$this->data_has_changed = true;
}
$this->$data_src = array(); $this->$data_src = array();
return $this; return $this;
} }
@@ -1405,11 +1483,19 @@ class e_model
} }
if(is_array($data)) if(is_array($data))
{ {
if('_data' === $data_src && isset($data[$unskey]))
{
$this->data_has_changed = true;
}
unset($data[$unskey]); unset($data[$unskey]);
} }
} }
else else
{ {
if('_data' === $data_src && isset($this->$data_src[$key]))
{
$this->data_has_changed = true;
}
unset($this->$data_src[$key]); unset($this->$data_src[$key]);
} }
return $this; return $this;
@@ -1424,6 +1510,10 @@ class e_model
*/ */
protected function _unsetDataSimple($key, $data_src = '_data') protected function _unsetDataSimple($key, $data_src = '_data')
{ {
if('_data' === $data_src && isset($this->$data_src[$key]))
{
$this->data_has_changed = true;
}
unset($this->$data_src[$key]); unset($this->$data_src[$key]);
return $this; return $this;
} }
@@ -1556,27 +1646,30 @@ class e_model
} }
/** /**
* Wrapper of {@link __toString()} * Convert object data to a string
* *
* @param boolean $AddSlashes * @param boolean $AddSlashes
* @return string * @return string
*/ */
public function toString($AddSlashes = true) public function toString($AddSlashes = true)
{ {
return $this->__toString($AddSlashes); return (string) e107::getArrayStorage()->WriteArray($this->getData(), $AddSlashes);
} }
/** /**
* Magic method - convert object data to string * Magic method - convert object data to a string
* NOTE: before PHP 5.2.0 the __toString method was only * NOTE: before PHP 5.2.0 the __toString method was only
* called when it was directly combined with echo() or print() * called when it was directly combined with echo() or print()
*
* NOTE: PHP 5.3+ is throwing parse error if __toString has optional arguments.
* *
* @param boolean $AddSlashes * @param boolean $AddSlashes
* @return string * @return string
*/ */
public function __toString($AddSlashes = true) public function __toString()
{ {
return e107::getArrayStorage()->WriteArray($this->getData(), $AddSlashes); return $this->toString((true === func_get_arg(0)));
} }
} }