mirror of
https://github.com/e107inc/e107.git
synced 2025-08-06 06:38:00 +02:00
Pref Handler/e_model class: Test passed, Final initial version
This commit is contained in:
@@ -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.6 $
|
* $Revision: 1.7 $
|
||||||
* $Date: 2009-08-04 16:30:48 $
|
* $Date: 2009-08-05 19:53:05 $
|
||||||
* $Author: secretr $
|
* $Author: secretr $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -37,13 +37,14 @@ class e_pref extends e_model
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Preference ID alias e.g. 'core' is an alias of prefid 'SitePrefs'
|
* Preference ID alias e.g. 'core' is an alias of prefid 'SitePrefs'
|
||||||
|
* Used in e.g. server cache file name
|
||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
protected $alias;
|
protected $alias;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set on first data load
|
* Runtime cache, set on first data load
|
||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
@@ -71,8 +72,9 @@ class e_pref extends e_model
|
|||||||
* @param string $prefid
|
* @param string $prefid
|
||||||
* @param string $alias
|
* @param string $alias
|
||||||
* @param array $data
|
* @param array $data
|
||||||
|
* @param boolean $sanitize_data
|
||||||
*/
|
*/
|
||||||
function __construct($prefid, $alias = '', $data = array())
|
function __construct($prefid, $alias = '', $data = array(), $sanitize_data = true)
|
||||||
{
|
{
|
||||||
require_once(e_HANDLER.'cache_handler.php');
|
require_once(e_HANDLER.'cache_handler.php');
|
||||||
|
|
||||||
@@ -82,18 +84,19 @@ class e_pref extends e_model
|
|||||||
$alias = $prefid;
|
$alias = $prefid;
|
||||||
}
|
}
|
||||||
$this->alias = $alias;
|
$this->alias = $alias;
|
||||||
parent::__construct($data);
|
$this->loadData($data, $sanitize_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Advanced getter - $pref_name is parsed (multidimensional arrays support), alias of {@link e_model::getData()}
|
* Advanced getter - $pref_name is parsed (multidimensional arrays support), alias of {@link e_model::getData()}
|
||||||
|
* If $pref_name is empty, all data array will be returned
|
||||||
*
|
*
|
||||||
* @param string $pref_name
|
* @param string $pref_name
|
||||||
* @param mixed $default
|
* @param mixed $default
|
||||||
* @param integer $index
|
* @param integer $index
|
||||||
* @return mixed
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
public function getPref($pref_name, $default = null, $index = null)
|
public function getPref($pref_name = '', $default = null, $index = null)
|
||||||
{
|
{
|
||||||
return $this->getData($pref_name, $default, $index);
|
return $this->getData($pref_name, $default, $index);
|
||||||
}
|
}
|
||||||
@@ -113,14 +116,14 @@ class e_pref extends e_model
|
|||||||
/**
|
/**
|
||||||
* Advanced setter - $pref_name is parsed (multidimensional arrays support)
|
* 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 $key
|
* @param string|array $pref_name
|
||||||
* @param mixed $value
|
* @param mixed $value
|
||||||
* @return e_pref
|
* @return e_pref
|
||||||
*/
|
*/
|
||||||
public function setPref($pref_name, $value)
|
public function setPref($pref_name, $value = null)
|
||||||
{
|
{
|
||||||
//object reset not allowed, adding new pref is not allowed
|
//object reset not allowed, adding new pref is not allowed
|
||||||
if(empty($pref_name) || !is_string($pref_name) || !$this->isData($pref_name))
|
if(empty($pref_name))
|
||||||
{
|
{
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
@@ -129,11 +132,24 @@ class e_pref extends e_model
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Alias of {@link setPref()}
|
||||||
|
*
|
||||||
|
* @param string $pref_name
|
||||||
|
* @param mixed $value
|
||||||
|
* @return e_pref
|
||||||
|
*/
|
||||||
|
public function updatePref($pref_name, $value)
|
||||||
|
{
|
||||||
|
$this->setPref($pref_name, $value);
|
||||||
|
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 $key
|
* @param string $pref_name
|
||||||
* @param mixed $value
|
* @param mixed $value
|
||||||
* @return e_pref
|
* @return e_pref
|
||||||
*/
|
*/
|
||||||
@@ -147,6 +163,19 @@ class e_pref extends e_model
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Alias of {@link set()}
|
||||||
|
*
|
||||||
|
* @param string $pref_name
|
||||||
|
* @param mixed $value
|
||||||
|
* @return e_pref
|
||||||
|
*/
|
||||||
|
public function update(string $pref_name, $value)
|
||||||
|
{
|
||||||
|
$this->set($pref_name, $value);
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add new (single) preference (ONLY if doesn't exist)
|
* Add new (single) preference (ONLY if doesn't exist)
|
||||||
*
|
*
|
||||||
@@ -155,14 +184,13 @@ class e_pref extends e_model
|
|||||||
* @param mixed $value
|
* @param mixed $value
|
||||||
* @return e_pref
|
* @return e_pref
|
||||||
*/
|
*/
|
||||||
public function add(string $pref_name, $value = null)
|
public function add(string $pref_name, $value)
|
||||||
{
|
{
|
||||||
if(!is_string($pref_name) || strpos($pref_name, '/'))
|
if(empty($pref_name))
|
||||||
{
|
{
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
$this->addData($pref_name, $value);
|
||||||
$this->addData($pref_name, $value, false);
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -176,7 +204,8 @@ class e_pref extends e_model
|
|||||||
*/
|
*/
|
||||||
public function addPref($pref_name, $value = null)
|
public function addPref($pref_name, $value = null)
|
||||||
{
|
{
|
||||||
return $this->addData($pref_name, $value, false);
|
$this->addData($pref_name, $value);
|
||||||
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -186,14 +215,9 @@ class e_pref extends e_model
|
|||||||
* @param string $pref_name
|
* @param string $pref_name
|
||||||
* @return e_pref
|
* @return e_pref
|
||||||
*/
|
*/
|
||||||
public function remove($pref_name)
|
public function remove(string $pref_name)
|
||||||
{
|
{
|
||||||
parent::remove($pref_name);
|
parent::remove($pref_name);
|
||||||
|
|
||||||
$struct = $this->getStructure();
|
|
||||||
unset($struct[$pref_name]);
|
|
||||||
$this->setStructure($struct);
|
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -215,38 +239,26 @@ class e_pref extends e_model
|
|||||||
* Disallow preference override
|
* Disallow preference override
|
||||||
*
|
*
|
||||||
* @param string|array $pref_name
|
* @param string|array $pref_name
|
||||||
|
* @param mixed value
|
||||||
* @param boolean $strict
|
* @param boolean $strict
|
||||||
*/
|
*/
|
||||||
final public function addData($pref_name, $value = null, $strict = false)
|
final public function addData($pref_name, $value = null)
|
||||||
{
|
{
|
||||||
//XXX - Move most of this to the base class?
|
parent::addData($pref_name, $value, false);
|
||||||
if(is_array($pref_name))
|
|
||||||
{
|
|
||||||
parent::addData($pref_name, $strict, false);
|
|
||||||
$this->setStructure($this->getStructure() + array_keys($pref_name));
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!$this->isData($pref_name))
|
|
||||||
{
|
|
||||||
$pref_name = trim($pref_name, '/');
|
|
||||||
parent::setData($pref_name, $value, $strict);
|
|
||||||
if(!strpos($pref_name, '/'))
|
|
||||||
{
|
|
||||||
$this->setStructure($this->getStructure() + array($pref_name));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Disallow public use of setData()
|
* Disallow public use of setData()
|
||||||
|
* Update only possible
|
||||||
*
|
*
|
||||||
|
* @param string|array $pref_name
|
||||||
|
* @param mixed $value
|
||||||
* @return e_pref
|
* @return e_pref
|
||||||
*/
|
*/
|
||||||
final public function setData()
|
final public function setData($pref_name, $value = null)
|
||||||
{
|
{
|
||||||
|
parent::setData($pref_name, $value, true);
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -254,22 +266,32 @@ class e_pref extends e_model
|
|||||||
* Disallow public use of removeData()
|
* Disallow public use of removeData()
|
||||||
* Object data reseting is not allowed
|
* Object data reseting is not allowed
|
||||||
*
|
*
|
||||||
|
* @param string $pref_name
|
||||||
* @return e_pref
|
* @return e_pref
|
||||||
*/
|
*/
|
||||||
final public function removeData($pref_name)
|
final public function removeData(string $pref_name)
|
||||||
{
|
{
|
||||||
if(is_null($pref_name))
|
|
||||||
{
|
|
||||||
return $this; //object reseting not allowed
|
|
||||||
}
|
|
||||||
parent::removeData($pref_name);
|
parent::removeData($pref_name);
|
||||||
|
return $this;
|
||||||
$pref_name = trim($pref_name, '/');
|
}
|
||||||
if(!strpos($pref_name, '/'))
|
|
||||||
|
/**
|
||||||
|
* Reset object data
|
||||||
|
*
|
||||||
|
* @param array $data
|
||||||
|
* @param boolean $sanitize
|
||||||
|
* @return e_pref
|
||||||
|
*/
|
||||||
|
public function loadData(array $data, $sanitize = true)
|
||||||
|
{
|
||||||
|
if(!empty($data))
|
||||||
{
|
{
|
||||||
$struct = $this->getStructure();
|
if($sanitize)
|
||||||
unset($struct[$pref_name]);
|
{
|
||||||
$this->setStructure($struct);
|
$data = e107::getParser()->toDB($data);
|
||||||
|
}
|
||||||
|
parent::setData($data, null, false);
|
||||||
|
$this->pref_cache = e107::getArrayStorage()->WriteArray($data, false); //runtime cache
|
||||||
}
|
}
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
@@ -305,18 +327,20 @@ class e_pref extends e_model
|
|||||||
|
|
||||||
if(false !== $data)
|
if(false !== $data)
|
||||||
{
|
{
|
||||||
|
//var_dump('Pref cache used: '.$this->alias);
|
||||||
$this->pref_cache = e107::getArrayStorage()->WriteArray($data, false); //runtime cache
|
$this->pref_cache = e107::getArrayStorage()->WriteArray($data, false); //runtime cache
|
||||||
return $this->setData($data);
|
return $this->loadData($data, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//var_dump('Pref cache not used: '.$this->alias);
|
||||||
if (e107::getDb()->db_Select('core', 'e107_value', "e107_name='{$id}'"))
|
if (e107::getDb()->db_Select('core', 'e107_value', "e107_name='{$id}'"))
|
||||||
{
|
{
|
||||||
$row = e107::getDb()->db_Fetch();
|
$row = e107::getDb()->db_Fetch();
|
||||||
|
|
||||||
if($this->serial_bc)
|
if($this->serial_bc)
|
||||||
{
|
{
|
||||||
$data = unserialize($row['e107_value']);
|
$data = unserialize($row['e107_value']);
|
||||||
$row['e107_value'] = e107::getArrayStorage()->WriteArray($row['e107_value'], false);
|
$row['e107_value'] = e107::getArrayStorage()->WriteArray($data, false);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -324,22 +348,23 @@ class e_pref extends e_model
|
|||||||
}
|
}
|
||||||
|
|
||||||
$this->pref_cache = $row['e107_value']; //runtime cache
|
$this->pref_cache = $row['e107_value']; //runtime cache
|
||||||
$this->setPrefCache($row['e107_value']);
|
$this->setPrefCache($row['e107_value'], true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(empty($data)) $data = array();
|
if(empty($data)) $data = array();
|
||||||
|
|
||||||
return $this->setData($data);
|
return $this->loadData($data, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Save object data to DB
|
* Save object data to DB
|
||||||
*
|
*
|
||||||
* @param boolean $from_post merge post data
|
* @param boolean $from_post merge post data
|
||||||
|
* @param boolean $force
|
||||||
* @param boolean $session_messages use session messages
|
* @param boolean $session_messages use session messages
|
||||||
* @return unknown
|
* @return boolean|integer 0 - no change, true - saved, false - error
|
||||||
*/
|
*/
|
||||||
public function save($from_post = true, $session_messages = false)
|
public function save($from_post = true, $force = false, $session_messages = false)
|
||||||
{
|
{
|
||||||
if(!$this->prefid)
|
if(!$this->prefid)
|
||||||
{
|
{
|
||||||
@@ -348,7 +373,6 @@ class e_pref extends e_model
|
|||||||
|
|
||||||
if($from_post)
|
if($from_post)
|
||||||
{
|
{
|
||||||
$this->setStructure(); //set structure from current data
|
|
||||||
$this->mergePostedData(); //all posted data is sanitized and filtered vs structure array
|
$this->mergePostedData(); //all posted data is sanitized and filtered vs structure array
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -356,36 +380,62 @@ class e_pref extends e_model
|
|||||||
require_once(e_HANDLER.'message_handler.php');
|
require_once(e_HANDLER.'message_handler.php');
|
||||||
$emessage = eMessage::getInstance();
|
$emessage = eMessage::getInstance();
|
||||||
|
|
||||||
//Save to DB
|
if(!$this->data_has_changed && !$force)
|
||||||
if($this->data_has_changed && !$this->isError())
|
|
||||||
{
|
{
|
||||||
if(true === $this->set_backup)
|
$emessage->add('Settings not saved as no changes were made.', E_MESSAGE_INFO, $session_messages);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Save to DB
|
||||||
|
if(!$this->isError())
|
||||||
|
{
|
||||||
|
if($this->serial_bc)
|
||||||
{
|
{
|
||||||
if(e107::getDb()->db_Select_gen("REPLACE INTO `#core` (e107_name,e107_value) values ('{$this->prefid}_Backup', '".addslashes($this->pref_cache)."') "))
|
$dbdata = serialize($this->getPref());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$dbdata = $this->toString(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(e107::getDb()->db_Select_gen("REPLACE INTO `#core` (e107_name,e107_value) values ('{$this->prefid}', '".addslashes($dbdata)."') "))
|
||||||
|
{
|
||||||
|
if(true === $this->set_backup)
|
||||||
{
|
{
|
||||||
$emessage->add('Backup successfully created.', E_MESSAGE_SUCCESS, $session_messages);
|
if($this->serial_bc)
|
||||||
|
{
|
||||||
|
$dbdata = serialize(e107::getArrayStorage()->ReadArray($this->pref_cache));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$dbdata = $this->pref_cache;
|
||||||
|
}
|
||||||
|
if(e107::getDb()->db_Select_gen("REPLACE INTO `#core` (e107_name,e107_value) values ('{$this->prefid}_Backup', '".addslashes($dbdata)."') "))
|
||||||
|
{
|
||||||
|
$emessage->add('Backup successfully created.', E_MESSAGE_SUCCESS, $session_messages);
|
||||||
|
ecache::clear_sys('Config_'.$this->alias.'_backup');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if(e107::getDb()->db_Select_gen("REPLACE INTO `#core` (e107_name,e107_value) values ('{$this->prefid}', '".$this->toString(true)."') "))
|
|
||||||
{
|
|
||||||
$this->data_has_changed = false; //reset status
|
$this->data_has_changed = false; //reset status
|
||||||
$this->pref_cache = $this->toString(false); //reset pref cache
|
$this->setPrefCache($this->toString(false), true); //reset pref cache - runtime & file
|
||||||
$this->setPrefCache($this->pref_cache); //reset pref cache file
|
|
||||||
$emessage->add('Settings successfully saved.', E_MESSAGE_SUCCESS, $session_messages);
|
$emessage->add('Settings successfully saved.', E_MESSAGE_SUCCESS, $session_messages);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
//TODO - DB error messages
|
||||||
}
|
}
|
||||||
|
|
||||||
if($this->isError())
|
if($this->isError())
|
||||||
{
|
{
|
||||||
$this->setErrors(true, $session_messages); //add errors to the eMessage stack
|
$this->setErrors(true, $session_messages); //add errors to the eMessage stack
|
||||||
$emessage->add('Settings not saved.', E_MESSAGE_ERROR, $session_messages);
|
$emessage->add('Settings not saved.', E_MESSAGE_ERROR, $session_messages);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
$emessage->add('Settings not saved as no changes were made.', E_MESSAGE_INFO, $session_messages);
|
$emessage->add('Settings not saved as no changes were made.', E_MESSAGE_INFO, $session_messages);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -400,23 +450,34 @@ class e_pref extends e_model
|
|||||||
{
|
{
|
||||||
$this->pref_cache = ecache::retrieve_sys('Config_'.$this->alias, 24 * 60, true);
|
$this->pref_cache = ecache::retrieve_sys('Config_'.$this->alias, 24 * 60, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ($toArray && $this->pref_cache ? e107::getArrayStorage()->ReadArray($this->pref_cache) : $this->pref_cache);
|
return ($toArray && $this->pref_cache ? e107::getArrayStorage()->ReadArray($this->pref_cache) : $this->pref_cache);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Store data to a server cache file
|
* Store data to a server cache file
|
||||||
* If $cache_string is an array, it'll be converted to a string
|
* If $cache_string is an array, it'll be converted to a string
|
||||||
|
* If $save is string, it'll be used for building the cache filename
|
||||||
*
|
*
|
||||||
* @param string|array $cache_string
|
* @param string|array $cache_string
|
||||||
|
* @param string|boolean $save write to a file
|
||||||
* @return e_pref
|
* @return e_pref
|
||||||
*/
|
*/
|
||||||
protected function setPrefCache($cache_string)
|
protected function setPrefCache($cache_string, $save = false)
|
||||||
{
|
{
|
||||||
if(is_array($cache_string))
|
if(is_array($cache_string))
|
||||||
{
|
{
|
||||||
$cache_string = e107::getArrayStorage()->WriteArray($cache_string, false);
|
$cache_string = e107::getArrayStorage()->WriteArray($cache_string, false);
|
||||||
}
|
}
|
||||||
ecache::set_sys('Config_'.$this->alias, $cache_string, true);
|
if(is_bool($save))
|
||||||
|
{
|
||||||
|
$this->pref_cache = $cache_string;
|
||||||
|
}
|
||||||
|
if($save)
|
||||||
|
{
|
||||||
|
|
||||||
|
ecache::set_sys('Config_'.(true !== $save ? $save : $this->alias), $cache_string, true);
|
||||||
|
}
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -467,10 +528,12 @@ final class e_core_pref extends e_pref
|
|||||||
protected $aliases = array(
|
protected $aliases = array(
|
||||||
'core' => 'SitePrefs',
|
'core' => 'SitePrefs',
|
||||||
'core_backup' => 'SitePrefs_Backup',
|
'core_backup' => 'SitePrefs_Backup',
|
||||||
|
'core_old' => 'pref',
|
||||||
'emote' => 'emote',
|
'emote' => 'emote',
|
||||||
'menu' => 'menu_pref',
|
'menu' => 'menu_pref',
|
||||||
'search' => 'search_prefs',
|
'search' => 'search_prefs',
|
||||||
'notify' => 'notify_prefs'
|
'notify' => 'notify_prefs',
|
||||||
|
'ipool' => 'IconPool'
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -478,7 +541,7 @@ final class e_core_pref extends e_pref
|
|||||||
*
|
*
|
||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
protected $serial_bc_array = array('emote', 'menu', 'search');
|
protected $serial_bc_array = array('core_old', 'emote', 'menu', 'search');
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
@@ -538,7 +601,7 @@ final class e_core_pref extends e_pref
|
|||||||
* Allowed values: key or value from $alias array
|
* Allowed values: key or value from $alias array
|
||||||
* If id not found this method returns false
|
* If id not found this method returns false
|
||||||
*
|
*
|
||||||
* @param string $alias
|
* @param string $prefid
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function getAlias($prefid)
|
public function getAlias($prefid)
|
||||||
@@ -618,6 +681,21 @@ class e_model
|
|||||||
*/
|
*/
|
||||||
protected $_data = array();
|
protected $_data = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Posted data
|
||||||
|
* Back-end related data
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected $_posted_data = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Runtime cache of parsed from {@link _getData()} keys
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected $_parsed_keys = array();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* DB structure array
|
* DB structure array
|
||||||
* Awaits implementation logic,
|
* Awaits implementation logic,
|
||||||
@@ -659,14 +737,7 @@ class e_model
|
|||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
protected $_validation_errors = array();
|
protected $_validation_errors = array();
|
||||||
|
|
||||||
/**
|
|
||||||
* Posted data
|
|
||||||
* Back-end related data
|
|
||||||
*
|
|
||||||
* @var array
|
|
||||||
*/
|
|
||||||
protected $_posted_data = array();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Name of object id field
|
* Name of object id field
|
||||||
@@ -775,7 +846,7 @@ class e_model
|
|||||||
* @param integer $index
|
* @param integer $index
|
||||||
* @return mixed
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
public function getData(string $key = '', $default = null, $index = null)
|
public function getData($key = '', $default = null, $index = null)
|
||||||
{
|
{
|
||||||
return $this->_getData($key, $default, $index);
|
return $this->_getData($key, $default, $index);
|
||||||
}
|
}
|
||||||
@@ -803,7 +874,7 @@ class e_model
|
|||||||
* @param integer $index
|
* @param integer $index
|
||||||
* @return mixed
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
public function getPostedData(string $key = '', $default = null, $index = null)
|
public function getPostedData($key = '', $default = null, $index = null)
|
||||||
{
|
{
|
||||||
return $this->_getData($key, $default, $index, '_posted_data');
|
return $this->_getData($key, $default, $index, '_posted_data');
|
||||||
}
|
}
|
||||||
@@ -1136,6 +1207,10 @@ class e_model
|
|||||||
|
|
||||||
if (strpos($key, '/'))
|
if (strpos($key, '/'))
|
||||||
{
|
{
|
||||||
|
if(isset($this->_parsed_keys[$data_src.'/'.$key]))
|
||||||
|
{
|
||||||
|
return $this->_parsed_keys[$data_src.'/'.$key];
|
||||||
|
}
|
||||||
$keyArr = explode('/', $key);
|
$keyArr = explode('/', $key);
|
||||||
$data = $this->$data_src;
|
$data = $this->$data_src;
|
||||||
foreach ($keyArr as $k)
|
foreach ($keyArr as $k)
|
||||||
@@ -1157,18 +1232,19 @@ class e_model
|
|||||||
return $default;
|
return $default;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
$this->_parsed_keys[$data_src.'/'.$key] = $data;
|
||||||
return $data;
|
return $data;
|
||||||
}
|
}
|
||||||
|
|
||||||
//get $index
|
//get $index
|
||||||
if (isset($this->$data_src[$key]))
|
if (isset($this->{$data_src}[$key]))
|
||||||
{
|
{
|
||||||
if (null === $index)
|
if (null === $index)
|
||||||
{
|
{
|
||||||
return $this->$data_src[$key];
|
return $this->{$data_src}[$key];
|
||||||
}
|
}
|
||||||
|
|
||||||
$value = $this->$data_src[$key];
|
$value = $this->{$data_src}[$key];
|
||||||
if (is_array($value))
|
if (is_array($value))
|
||||||
{
|
{
|
||||||
if (isset($value[$index]))
|
if (isset($value[$index]))
|
||||||
@@ -1197,7 +1273,7 @@ class e_model
|
|||||||
*/
|
*/
|
||||||
protected function _getDataSimple($key, $default = null, $data_src = '_data')
|
protected function _getDataSimple($key, $default = null, $data_src = '_data')
|
||||||
{
|
{
|
||||||
return isset($this->$data_src[$key]) ? $this->$data_src[$key] : $default;
|
return isset($this->{$data_src}[$key]) ? $this->{$data_src}[$key] : $default;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1207,9 +1283,9 @@ class e_model
|
|||||||
* If $key is string, the attribute value will be overwritten by $value
|
* If $key is string, the attribute value will be overwritten by $value
|
||||||
* '/' inside the key will be treated as array path
|
* '/' inside the key will be treated as array path
|
||||||
*
|
*
|
||||||
* If $key is an array, it will overwrite all the data in the object.
|
* If $key is an array and $strict is false, it will overwrite all the data in the object.
|
||||||
*
|
*
|
||||||
* If $strict is true data will be updated only (no new data will be added)
|
* If $strict is true and $data_src is '_data', data will be updated only (no new data will be added)
|
||||||
*
|
*
|
||||||
* @param string|array $key
|
* @param string|array $key
|
||||||
* @param mixed $value
|
* @param mixed $value
|
||||||
@@ -1229,41 +1305,36 @@ class e_model
|
|||||||
}
|
}
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->$data_src = $key;
|
$this->$data_src = $key;
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
//multidimensional array support - strict _setData for values of type array
|
//multidimensional array support - strict _setData for values of type array
|
||||||
if($strict && is_array($value))
|
if($strict && !empty($value) && is_array($value))
|
||||||
{
|
{
|
||||||
foreach($key as $k => $v)
|
foreach($value as $k => $v)
|
||||||
{
|
{
|
||||||
$this->_setData($key.'/'.$k, $v, true, $data_src);
|
$this->_setData($key.'/'.$k, $v, true, $data_src);
|
||||||
}
|
}
|
||||||
return $this;
|
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
|
//multidimensional array support - parse key
|
||||||
$key = trim($key, '/');
|
$key = trim($key, '/');
|
||||||
if(strpos($key,'/'))
|
if(strpos($key,'/'))
|
||||||
{
|
{
|
||||||
|
//if strict - update only
|
||||||
|
if($strict && !$this->isData($key))
|
||||||
|
{
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
$keyArr = explode('/', $key);
|
$keyArr = explode('/', $key);
|
||||||
$data = &$this->$data_src;
|
$data = &$this->$data_src;
|
||||||
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->isData($k))
|
|
||||||
{
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!isset($data[$k]))
|
if (!isset($data[$k]))
|
||||||
{
|
{
|
||||||
@@ -1271,16 +1342,27 @@ class e_model
|
|||||||
}
|
}
|
||||||
$data = &$data[$k];
|
$data = &$data[$k];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//data has changed - optimized
|
||||||
|
if('_data' === $data_src && !$this->data_has_changed)
|
||||||
|
{
|
||||||
|
$this->data_has_changed = (isset($this->_data[$key]) && $this->_data[$key] != $value);
|
||||||
|
}
|
||||||
|
$this->_parsed_keys[$data_src.'/'.$key] = $value;
|
||||||
$data = $value;
|
$data = $value;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//if strict - update only
|
//if strict - update only
|
||||||
if($strict && !$this->isData($key))
|
if($strict && !isset($this->_data[$key]))
|
||||||
{
|
{
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
$this->$data_src[$key] = $value;
|
if('_data' === $data_src && !$this->data_has_changed)
|
||||||
|
{
|
||||||
|
$this->data_has_changed = (isset($this->_data[$key]) && $this->{$data_src}[$key] != $value);
|
||||||
|
}
|
||||||
|
$this->{$data_src}[$key] = $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
@@ -1294,29 +1376,28 @@ class e_model
|
|||||||
* @param mixed $value
|
* @param mixed $value
|
||||||
* @param boolean $strict
|
* @param boolean $strict
|
||||||
* @param string $data_src
|
* @param string $data_src
|
||||||
* @return unknown
|
* @return e_model
|
||||||
*/
|
*/
|
||||||
protected function _setDataSimple(string $key, $value = null, $strict = false, $data_src = '_data')
|
protected function _setDataSimple(string $key, $value = null, $strict = false, $data_src = '_data')
|
||||||
{
|
{
|
||||||
if(!$strict)
|
if(!$strict)
|
||||||
{
|
{
|
||||||
$this->$data_src[$key] = $value;
|
$this->{$data_src}[$key] = $value;
|
||||||
//data has changed
|
//data has changed
|
||||||
if('_data' === $data_src && $this->_getDataSimple($key, null, $data_src) != $value)
|
if('_data' === $data_src && !$this->data_has_changed)
|
||||||
{
|
{
|
||||||
$this->data_has_changed = true;
|
$this->data_has_changed = (isset($this->_data[$key]) && $this->_data[$key] != $value);
|
||||||
}
|
}
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->setStructure();//set default structure if empty
|
|
||||||
if($this->isData($key))
|
if($this->isData($key))
|
||||||
{
|
{
|
||||||
if('_data' === $data_src && $this->_getDataSimple($key, null, $data_src) != $value)
|
if('_data' === $data_src && !$this->data_has_changed)
|
||||||
{
|
{
|
||||||
$this->data_has_changed = true;
|
$this->data_has_changed = (isset($this->_data[$key]) && $this->_data[$key] != $value);
|
||||||
}
|
}
|
||||||
$this->$data_src[$key] = $value;
|
$this->{$data_src}[$key] = $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
@@ -1345,7 +1426,7 @@ class e_model
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
if($override || !$this->isData($key))
|
if($override || !$this->_isData($key, $data_src))
|
||||||
{
|
{
|
||||||
if(is_array($value))
|
if(is_array($value))
|
||||||
{
|
{
|
||||||
@@ -1405,16 +1486,16 @@ class e_model
|
|||||||
{
|
{
|
||||||
$this->data_has_changed = true;
|
$this->data_has_changed = true;
|
||||||
}
|
}
|
||||||
unset($data[$unskey]);
|
unset($data[$unskey], $this->_parsed_keys[$data_src.'/'.$key]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if('_data' === $data_src && isset($this->$data_src[$key]))
|
if('_data' === $data_src && isset($this->{$data_src}[$key]))
|
||||||
{
|
{
|
||||||
$this->data_has_changed = true;
|
$this->data_has_changed = true;
|
||||||
}
|
}
|
||||||
unset($this->$data_src[$key]);
|
unset($this->{$data_src}[$key]);
|
||||||
}
|
}
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
@@ -1428,11 +1509,11 @@ 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]))
|
if('_data' === $data_src && isset($this->{$data_src}[$key]))
|
||||||
{
|
{
|
||||||
$this->data_has_changed = true;
|
$this->data_has_changed = true;
|
||||||
}
|
}
|
||||||
unset($this->$data_src[$key]);
|
unset($this->{$data_src}[$key]);
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user