|
|
|
@ -222,8 +222,9 @@ class Model extends Component implements \IteratorAggregate, \ArrayAccess
|
|
|
|
|
*/ |
|
|
|
|
public function afterConstruct() |
|
|
|
|
{ |
|
|
|
|
if ($this->hasEventHandler('onAfterConstruct')) |
|
|
|
|
$this->onAfterConstruct(new CEvent($this)); |
|
|
|
|
if ($this->hasEventHandler('onAfterConstruct')) { |
|
|
|
|
$this->onAfterConstruct(new Event($this)); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
@ -236,10 +237,13 @@ class Model extends Component implements \IteratorAggregate, \ArrayAccess
|
|
|
|
|
*/ |
|
|
|
|
public function beforeValidate() |
|
|
|
|
{ |
|
|
|
|
if ($this->hasEventHandler('onBeforeValidate')) { |
|
|
|
|
$event = new ModelEvent($this); |
|
|
|
|
$this->onBeforeValidate($event); |
|
|
|
|
return $event->isValid; |
|
|
|
|
} |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* This method is invoked after validation ends. |
|
|
|
@ -249,8 +253,10 @@ class Model extends Component implements \IteratorAggregate, \ArrayAccess
|
|
|
|
|
*/ |
|
|
|
|
public function afterValidate() |
|
|
|
|
{ |
|
|
|
|
if ($this->hasEventHandler('onAfterValidate')) { |
|
|
|
|
$this->onAfterValidate(new CEvent($this)); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* This event is raised after the model instance is created by new operator. |
|
|
|
@ -258,7 +264,7 @@ class Model extends Component implements \IteratorAggregate, \ArrayAccess
|
|
|
|
|
*/ |
|
|
|
|
public function onAfterConstruct($event) |
|
|
|
|
{ |
|
|
|
|
$this->raiseEvent('onAfterConstruct', $event); |
|
|
|
|
$this->raiseEvent(__METHOD__, $event); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
@ -267,7 +273,7 @@ class Model extends Component implements \IteratorAggregate, \ArrayAccess
|
|
|
|
|
*/ |
|
|
|
|
public function onBeforeValidate($event) |
|
|
|
|
{ |
|
|
|
|
$this->raiseEvent('onBeforeValidate', $event); |
|
|
|
|
$this->raiseEvent(__METHOD__, $event); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
@ -276,7 +282,7 @@ class Model extends Component implements \IteratorAggregate, \ArrayAccess
|
|
|
|
|
*/ |
|
|
|
|
public function onAfterValidate($event) |
|
|
|
|
{ |
|
|
|
|
$this->raiseEvent('onAfterValidate', $event); |
|
|
|
|
$this->raiseEvent(__METHOD__, $event); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
@ -391,11 +397,13 @@ class Model extends Component implements \IteratorAggregate, \ArrayAccess
|
|
|
|
|
*/ |
|
|
|
|
public function hasErrors($attribute = null) |
|
|
|
|
{ |
|
|
|
|
if ($attribute === null) |
|
|
|
|
if ($attribute === null) { |
|
|
|
|
return $this->_errors !== array(); |
|
|
|
|
else |
|
|
|
|
} |
|
|
|
|
else { |
|
|
|
|
return isset($this->_errors[$attribute]); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Returns the errors for all attribute or a single attribute. |
|
|
|
@ -404,11 +412,13 @@ class Model extends Component implements \IteratorAggregate, \ArrayAccess
|
|
|
|
|
*/ |
|
|
|
|
public function getErrors($attribute = null) |
|
|
|
|
{ |
|
|
|
|
if ($attribute === null) |
|
|
|
|
if ($attribute === null) { |
|
|
|
|
return $this->_errors; |
|
|
|
|
else |
|
|
|
|
} |
|
|
|
|
else { |
|
|
|
|
return isset($this->_errors[$attribute]) ? $this->_errors[$attribute] : array(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Returns the first error of the specified attribute. |
|
|
|
@ -457,11 +467,13 @@ class Model extends Component implements \IteratorAggregate, \ArrayAccess
|
|
|
|
|
*/ |
|
|
|
|
public function clearErrors($attribute = null) |
|
|
|
|
{ |
|
|
|
|
if ($attribute === null) |
|
|
|
|
if ($attribute === null) { |
|
|
|
|
$this->_errors = array(); |
|
|
|
|
else |
|
|
|
|
} |
|
|
|
|
else { |
|
|
|
|
unset($this->_errors[$attribute]); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Generates a user friendly attribute label. |
|
|
|
@ -486,17 +498,20 @@ class Model extends Component implements \IteratorAggregate, \ArrayAccess
|
|
|
|
|
public function getAttributes($names = null) |
|
|
|
|
{ |
|
|
|
|
$values = array(); |
|
|
|
|
foreach ($this->attributeNames() as $name) |
|
|
|
|
$values[$name] = $this->$name; |
|
|
|
|
|
|
|
|
|
if (is_array($names)) |
|
|
|
|
{ |
|
|
|
|
$values2 = array(); |
|
|
|
|
foreach ($names as $name) |
|
|
|
|
$values2[$name] = isset($values[$name]) ? $values[$name] : null; |
|
|
|
|
return $values2; |
|
|
|
|
if (is_array($names)) { |
|
|
|
|
foreach ($this->attributeNames() as $name) { |
|
|
|
|
if (in_array($name, $names, true)) { |
|
|
|
|
$values[$name] = $this->$name; |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
else { |
|
|
|
|
foreach ($this->attributeNames() as $name) { |
|
|
|
|
$values[$name] = $this->$name; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return $values; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -510,17 +525,18 @@ class Model extends Component implements \IteratorAggregate, \ArrayAccess
|
|
|
|
|
*/ |
|
|
|
|
public function setAttributes($values, $safeOnly = true) |
|
|
|
|
{ |
|
|
|
|
if (!is_array($values)) |
|
|
|
|
return; |
|
|
|
|
if (is_array($values)) { |
|
|
|
|
$attributes = array_flip($safeOnly ? $this->getSafeAttributeNames() : $this->attributeNames()); |
|
|
|
|
foreach ($values as $name => $value) |
|
|
|
|
{ |
|
|
|
|
if (isset($attributes[$name])) |
|
|
|
|
foreach ($values as $name => $value) { |
|
|
|
|
if (isset($attributes[$name])) { |
|
|
|
|
$this->$name = $value; |
|
|
|
|
elseif ($safeOnly) |
|
|
|
|
} |
|
|
|
|
elseif ($safeOnly) { |
|
|
|
|
$this->onUnsafeAttribute($name, $value); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Sets the attributes to be null. |
|
|
|
@ -590,22 +606,22 @@ class Model extends Component implements \IteratorAggregate, \ArrayAccess
|
|
|
|
|
{ |
|
|
|
|
$attributes = array(); |
|
|
|
|
$unsafe = array(); |
|
|
|
|
foreach ($this->getValidators() as $validator) |
|
|
|
|
{ |
|
|
|
|
if (!$validator->safe) |
|
|
|
|
{ |
|
|
|
|
foreach ($validator->attributes as $name) |
|
|
|
|
foreach ($this->getValidators() as $validator) { |
|
|
|
|
if (!$validator->safe) { |
|
|
|
|
foreach ($validator->attributes as $name) { |
|
|
|
|
$unsafe[] = $name; |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
foreach ($validator->attributes as $name) |
|
|
|
|
} |
|
|
|
|
else { |
|
|
|
|
foreach ($validator->attributes as $name) { |
|
|
|
|
$attributes[$name] = true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
foreach ($unsafe as $name) |
|
|
|
|
foreach ($unsafe as $name) { |
|
|
|
|
unset($attributes[$name]); |
|
|
|
|
} |
|
|
|
|
return array_keys($attributes); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -636,7 +652,7 @@ class Model extends Component implements \IteratorAggregate, \ArrayAccess
|
|
|
|
|
* Returns the element at the specified offset. |
|
|
|
|
* This method is required by the SPL interface `ArrayAccess`. |
|
|
|
|
* It is implicitly called when you use something like `$value = $model[$offset];`. |
|
|
|
|
* @param integer $offset the offset to retrieve element. |
|
|
|
|
* @param mixed $offset the offset to retrieve element. |
|
|
|
|
* @return mixed the element at the offset, null if no element is found at the offset |
|
|
|
|
*/ |
|
|
|
|
public function offsetGet($offset) |
|
|
|
|