1
0
mirror of https://github.com/e107inc/e107.git synced 2025-08-04 05:37:32 +02:00

Pref Handler/e_model class: More work, simplifying things, PHPUnit Test Case - broken, work in progress

This commit is contained in:
secretr
2009-08-04 16:30:48 +00:00
parent b7dac9cf59
commit 4530a3c399

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.5 $ * $Revision: 1.6 $
* $Date: 2009-08-03 18:09:02 $ * $Date: 2009-08-04 16:30:48 $
* $Author: secretr $ * $Author: secretr $
*/ */
@@ -83,7 +83,6 @@ class e_pref extends e_model
} }
$this->alias = $alias; $this->alias = $alias;
parent::__construct($data); parent::__construct($data);
if($data) $this->setStructure();
} }
/** /**
@@ -145,6 +144,7 @@ class e_pref extends e_model
return $this; return $this;
} }
parent::set($pref_name, $value, true); parent::set($pref_name, $value, true);
return $this;
} }
/** /**
@@ -619,12 +619,13 @@ class e_model
protected $_data = array(); protected $_data = array();
/** /**
* Data structure array * DB structure array
* Needs implementation by child classes * Awaits implementation logic,
* should be consistent with db::_getTypes() and db::_getFieldValue()
* *
* @var array * @var array
*/ */
protected $_data_structure = array(); protected $_FIELD_TYPES = array();
/** /**
* Avoid DB calls if data is not changed * Avoid DB calls if data is not changed
@@ -637,13 +638,16 @@ class e_model
/** /**
* Validation structure in format * Validation structure in format
* 'field_name' => rule (to be used with core validator handler) * 'field_name' => rule (to be used with core validator handler)
* Needs implementation by child classes * Awaits implementation logic, should be consistent with expected frmo the validator
* structure.
* *
* @var array * @var array
*/ */
protected $_validation_rules = array(); protected $_validation_rules = array();
/** /**
* Validator object
*
* @var validatorClass * @var validatorClass
*/ */
protected $_validator = null; protected $_validator = null;
@@ -658,6 +662,7 @@ class e_model
/** /**
* Posted data * Posted data
* Back-end related data
* *
* @var array * @var array
*/ */
@@ -665,6 +670,7 @@ class e_model
/** /**
* Name of object id field * Name of object id field
* Required for {@link getId()()} method
* *
* @var string * @var string
*/ */
@@ -708,72 +714,6 @@ class e_model
return $this->_idFieldName; return $this->_idFieldName;
} }
/**
* Get object data structure
* Used as a filter when copy/merge posted data to the object
*
* @return array
*/
public function getStructure()
{
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
*
* @param array $struct
* @return e_model
*/
public function setStructure(array $struct = array())
{
if($struct)
{
$this->_data_structure = array_unique($struct);
return $this;
}
if(empty($this->_data_structure))
{
$this->_data_structure = e_pref::array_rkeys($this->_data);
}
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
*/ */
@@ -783,7 +723,7 @@ class e_model
} }
/** /**
* Set object validation rules if $_validation_rules is empty * Set object validation rules if $_validation_rules array is empty
* *
* @param array $vrules * @param array $vrules
* @return e_model * @return e_model
@@ -820,13 +760,14 @@ class e_model
* @param mixed $default * @param mixed $default
* @return mixed * @return mixed
*/ */
public function get($key = '', $default = null) public function get(string $key, $default = null)
{ {
return $this->_getDataSimple($key, $default); return $this->_getDataSimple($key, $default);
} }
/** /**
* Retrieves data from the object ($_data) * Retrieves data from the object ($_data)
* If $key is empty, return all object data
* *
* @see _getData() * @see _getData()
* @param string $key * @param string $key
@@ -834,7 +775,7 @@ class e_model
* @param integer $index * @param integer $index
* @return mixed * @return mixed
*/ */
public function getData($key = '', $default = null, $index = null) public function getData(string $key = '', $default = null, $index = null)
{ {
return $this->_getData($key, $default, $index); return $this->_getData($key, $default, $index);
} }
@@ -848,21 +789,21 @@ class e_model
* @param mixed $default * @param mixed $default
* @return mixed * @return mixed
*/ */
public function getPosted($key = '', $default = null) public function getPosted(string $key, $default = null)
{ {
return $this->_getDataSimple($key, $default, '_posted_data'); return $this->_getDataSimple($key, $default, '_posted_data');
} }
/** /**
* Retrieves data from the object ($_posted_data) * Retrieves data from the object ($_posted_data)
* * If $key is empty, return all object posted data
* @see _getData() * @see _getData()
* @param string $key * @param string $key
* @param mixed $default * @param mixed $default
* @param integer $index * @param integer $index
* @return mixed * @return mixed
*/ */
public function getPostedData($key = '', $default = null, $index = null) public function getPostedData(string $key = '', $default = null, $index = null)
{ {
return $this->_getData($key, $default, $index, '_posted_data'); return $this->_getData($key, $default, $index, '_posted_data');
} }
@@ -873,20 +814,20 @@ class e_model
* - default object data * - default object data
* - empty string * - empty string
* *
* Useful when operating with form GUI * Use this method inside forms
* *
* @param string $key * @param string $key
* @param string $default * @param string $default
* @param integer $index * @param integer $index
* @return string * @return string
*/ */
public function getIfPosted($key, $default = '', $index = null) public function getIfPosted(string $key, $default = '', $index = null)
{ {
if(null !== $this->getPostedData($key)) if(null !== $this->getPostedData($key))
{ {
return e107::getParser()->post_toForm($this->getPostedData($key, null, $index)); return e107::getParser()->post_toForm($this->getPostedData($key, null, $index));
} }
return $this->getData($key, $default, $index); return e107::getParser()->toForm($this->getData($key, $default, $index));
} }
/** /**
@@ -898,7 +839,7 @@ class e_model
* @see _setData() * @see _setData()
* @param string $key * @param string $key
* @param mixed $value * @param mixed $value
* @param boolean $strict * @param boolean $strict update only
* @return e_model * @return e_model
*/ */
public function set($key, $value = null, $strict = false) public function set($key, $value = null, $strict = false)
@@ -914,12 +855,11 @@ class e_model
* @see _setData() * @see _setData()
* @param string|array $key * @param string|array $key
* @param mixed $value * @param mixed $value
* @param boolean $strict * @param boolean $strict update only
* @return e_model * @return e_model
*/ */
public function setData($key, $value = null, $strict = false) public function setData($key, $value = null, $strict = false)
{ {
$this->data_has_changed = true;
return $this->_setData($key, $value, $strict); return $this->_setData($key, $value, $strict);
} }
@@ -931,7 +871,7 @@ class e_model
* *
* @param string $key * @param string $key
* @param mixed $data * @param mixed $data
* @param boolean $strict * @param boolean $strict update only
* @return e_model * @return e_model
*/ */
public function setPosted($key, $data = null, $strict = false) public function setPosted($key, $data = null, $strict = false)
@@ -940,14 +880,14 @@ class e_model
} }
/** /**
* Overwrite posted data in the object for a single field * Overwrite posted data in the object. Key is parsed (multidmensional array support).
* Public proxy of {@link _setData()} * Public proxy of {@link _setData()}
* Use this method to store data from non-trustable sources (e.g. _POST) - it doesn't overwrite * Use this method to store data from non-trustable sources (e.g. _POST) - it doesn't overwrite
* the original object data * the original object data
* *
* @param string $key * @param string|array $key
* @param mixed $data * @param mixed $data
* @param boolean $strict * @param boolean $strict update only
* @return e_model * @return e_model
*/ */
public function setPostedData($key = null, $data = null, $strict = false) public function setPostedData($key = null, $data = null, $strict = false)
@@ -960,17 +900,16 @@ class e_model
* Retains existing data in the object. * Retains existing data in the object.
* Public proxy of {@link _addData()} * Public proxy of {@link _addData()}
* *
* If $strict is true, data will be filtered by the * If $override is false, data will be updated only (check against existing data)
* object structure. NOTE - Multidimensional arrays are not filtered.
* *
* @param array $arr * @param string|array $key
* @param boolean $strict * @param mixed $value
* @param boolean $override override existing data
* @return e_model * @return e_model
*/ */
public function addData(array $arr, $strict = false, $override = true) public function addData($key, $value = null, $override = true)
{ {
if($arr) $this->data_has_changed = true; //TODO - better status change check return $this->_addData($key, $value, $override);
return $this->_addData($arr, $strict, $override);
} }
/** /**
@@ -978,16 +917,16 @@ class e_model
* Retains existing data in the object. * Retains existing data in the object.
* Public proxy of {@link _addData()} * Public proxy of {@link _addData()}
* *
* If $strict is true, data will be filtered by the * If $override is false, data will be updated only (check against existing data)
* object structure. NOTE - Multidimensional arrays are not filtered.
* *
* @param array $arr * @param string|array $key
* @param boolean $strict * @param mixed $value
* @param boolean $override override existing data
* @return e_model * @return e_model
*/ */
public function addPostedData(array $arr, $strict = false, $override = true) public function addPostedData($key, $value = null, $override = true)
{ {
return $this->_addData($arr, $strict, $override, '_posted_data'); return $this->_addData($key, $value, $override, '_posted_data');
} }
/** /**
@@ -1111,78 +1050,63 @@ class e_model
/** /**
* Merge posted data with the object data * Merge posted data with the object data
* Should be used on edit/update record * Should be used on edit/update/create record (back-end)
* Copied posted data will be removed * Copied posted data will be removed (no matter if copy is successfull or not)
* *
* If $strict is true, only existing object data will be copied (update)
* TODO - move to admin e_model extension
*
* @param boolean $strict
* @param boolean $sanitize * @param boolean $sanitize
* @param boolean $validate perform validation check
* @return e_model * @return e_model
*/ */
public function mergePostedData($sanitize = true) public function mergePostedData($strict = true, $sanitize = true, $validate = true)
{ {
if(!$this->getPostedData() || !$this->getStructure() || !$this->validate()) if(!$this->getPostedData() || ($validate && !$this->validate()))
{ {
return $this; return $this;
} }
$tp = e107::getParser(); $tp = e107::getParser();
foreach ($this->getStructure() as $field)
{
if(null === $this->getPostedData($field) || !$this->dataHasChangedFor($field))
{
$this->removePostedData($field);
continue;
}
$this->data_has_changed = true; //TODO - sanitize method based on validation rules OR _FIELD_TYPES array?
$data = $sanitize ? $tp->toDB($this->getPostedData($field)) : $this->getPostedData($field); $data = $sanitize ? $tp->toDB($this->getPostedData()) : $this->getPostedData();
$this->setData($field, $data)
foreach ($data as $field => $dt)
{
$this->setData($field, $dt, $strict)
->removePostedData($field); ->removePostedData($field);
} }
return $this; return $this;
} }
/** /**
* Copy posted data with the object data * Merge passed data array with the object data
* Should be used on create/insert records * If $strict is true, only existing object data will be copied (update)
* Copied posted data will be removed * TODO - move to admin e_model extension
* *
* @param boolean $validate * @param array $src_data
* @param boolean $sanitize * @param boolean $sanitize
* @param boolean $strict filter by the object structure * @param boolean $validate perform validation check
* @return e_model * @return e_model
*/ */
public function copyPostedData($validate = true, $sanitize = true, $strict = true) public function mergeData(array $src_data, $strict = true, $sanitize = true, $validate = true)
{ {
if($validate && !$this->validate()) //FIXME
if(!$src_data || ($validate && !$this->validate($src_data)))
{ {
return $this; return $this;
} }
$tp = e107::getParser(); $tp = e107::getParser();
if(!$strict || !$this->getStructure()) //TODO - sanitize method based on validation rules OR _FIELD_TYPES array?
{ if($sanitize)
$data = $sanitize ? $tp->toDB($this->getPostedData()) : $this->getPostedData(); {
if(!empty($data)) $src_data = $tp->toDB($src_data);
{ }
$this->data_has_changed = true;
$this->setPostedData(null)
->setData($data);
}
return $this;
}
foreach ($this->getStructure() as $field) $this->setData($src_data, null, $strict);
{
if(null === $this->getPostedData($field) || !$this->dataHasChangedFor($field))
{
continue;
}
$this->data_has_changed = true;
$data = $sanitize ? $tp->toDB($this->getPostedData($field)) : $this->getPostedData($field);
$this->setData($field, $data)
->removePostedData($field);
}
return $this; return $this;
} }
@@ -1285,10 +1209,7 @@ class e_model
* *
* If $key is an array, it will overwrite all the data in the object. * If $key is an array, it will overwrite all the data in the object.
* *
* If $strict is true and $key is an array, data will be filtered by the * If $strict is true data will be updated only (no new data will be added)
* 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
@@ -1302,7 +1223,6 @@ class e_model
{ {
if($strict && '_data_structure' !== $data_src) if($strict && '_data_structure' !== $data_src)
{ {
$this->setStructure();//set default structure if empty
foreach(array_keys($key) as $k) foreach(array_keys($key) as $k)
{ {
$this->_setData($k, $key[$k], true, $data_src); $this->_setData($k, $key[$k], true, $data_src);
@@ -1340,7 +1260,7 @@ class e_model
$k = $keyArr[$i]; $k = $keyArr[$i];
//if strict - update only //if strict - update only
if($strict && !$this->inStructure($k)) if($strict && !$this->isData($k))
{ {
return $this; return $this;
} }
@@ -1356,7 +1276,7 @@ class e_model
else else
{ {
//if strict - update only //if strict - update only
if($strict && !$this->inStructure($key)) if($strict && !$this->isData($key))
{ {
return $this; return $this;
} }
@@ -1390,7 +1310,7 @@ class e_model
} }
$this->setStructure();//set default structure if empty $this->setStructure();//set default structure if empty
if($this->inStructure($key)) if($this->isData($key))
{ {
if('_data' === $data_src && $this->_getDataSimple($key, null, $data_src) != $value) if('_data' === $data_src && $this->_getDataSimple($key, null, $data_src) != $value)
{ {
@@ -1406,38 +1326,36 @@ class e_model
* Add data to the object. * Add data to the object.
* Retains existing data in the object. * Retains existing data in the object.
* *
* If $strict is true, data will be filtered by the * If $override is false, only new (non-existent) data will be added
* object structure. NOTE - Multidimensional arrays are not filtered.
* *
* @param string|array $key * @param string|array $key
* @param mixed $value * @param mixed $value
* @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($key, $value = null, $strict = false, $override = true, $data_src = '_data') protected function _addData($key, $value = null, $override = true, $data_src = '_data')
{ {
if(is_array($key)) if(is_array($key))
{ {
foreach($key as $k => $v) foreach($key as $k => $v)
{ {
$this->_addData($k, $v, $strict, $data_src); $this->_addData($k, $v, $override, $data_src);
} }
return $this; return $this;
} }
if($override || $this->isData($key)) if($override || !$this->isData($key))
{ {
if(is_array($value)) if(is_array($value))
{ {
foreach($key as $k => $v) foreach($key as $k => $v)
{ {
$this->_addData($key.'/'.$k, $v, $strict, $override, $data_src); $this->_addData($key.'/'.$k, $v, $override, $data_src);
} }
return $this; return $this;
} }
$this->_setData($key, $value, $strict, $data_src); $this->_setData($key, $value, false, $data_src);
} }
return $this; return $this;
} }
@@ -1554,9 +1472,10 @@ class e_model
* 2. add validation errors to the object if any * 2. add validation errors to the object if any
* 3. return true for valid and false for non-valid data * 3. return true for valid and false for non-valid data
* *
* @param array $data optional - data for validation, defaults to posted data
* @return boolean * @return boolean
*/ */
public function validate() public function validate(array $data = array())
{ {
$this->_validation_errors = array(); $this->_validation_errors = array();
@@ -1565,7 +1484,7 @@ class e_model
return true; return true;
} }
$result = $this->getValidator()->validateFields($this->getPostedData(), $this->getValidationRules()); $result = $this->getValidator()->validateFields(($data ? $data : $this->getPostedData()), $this->getValidationRules());
if(!empty($result['errors'])) if(!empty($result['errors']))
{ {
$this->_validation_errors = $result['errors']; $this->_validation_errors = $result['errors'];