Browse Source

w

tags/2.0.0-beta
Qiang Xue 13 years ago
parent
commit
5f8a714ef1
  1. 2
      framework/base/Component.php
  2. 77
      framework/base/Model.php
  3. 29
      framework/base/ModelEvent.php

2
framework/base/Component.php

@ -364,7 +364,7 @@ class Component
* @param string $name the event name
* @return boolean whether there is any handler attached to the event.
*/
public function hasEventHandler($name)
public function hasEventHandlers($name)
{
$name = strtolower($name);
return isset($this->_e[$name]) && $this->_e[$name]->getCount();

77
framework/base/Model.php

@ -205,7 +205,7 @@ class Model extends Component implements \IteratorAggregate, \ArrayAccess
$this->clearErrors();
}
if ($this->beforeValidate()) {
foreach ($this->getValidators() as $validator) {
foreach ($this->getActiveValidators() as $validator) {
$validator->validate($this, $attributes);
}
$this->afterValidate();
@ -222,7 +222,7 @@ class Model extends Component implements \IteratorAggregate, \ArrayAccess
*/
public function afterConstruct()
{
if ($this->hasEventHandler('onAfterConstruct')) {
if ($this->hasEventHandlers('onAfterConstruct')) {
$this->onAfterConstruct(new Event($this));
}
}
@ -237,7 +237,7 @@ class Model extends Component implements \IteratorAggregate, \ArrayAccess
*/
public function beforeValidate()
{
if ($this->hasEventHandler('onBeforeValidate')) {
if ($this->hasEventHandlers('onBeforeValidate')) {
$event = new ValidationEvent($this);
$this->onBeforeValidate($event);
return $event->isValid;
@ -253,7 +253,7 @@ class Model extends Component implements \IteratorAggregate, \ArrayAccess
*/
public function afterValidate()
{
if ($this->hasEventHandler('onAfterValidate')) {
if ($this->hasEventHandlers('onAfterValidate')) {
$this->onAfterValidate(new CEvent($this));
}
}
@ -286,63 +286,66 @@ class Model extends Component implements \IteratorAggregate, \ArrayAccess
}
/**
* Returns all the validators declared in the model.
* This method differs from {@link getValidators} in that the latter
* would only return the validators applicable to the current {@link scenario}.
* Also, since this method return a {@link CList} object, you may
* manipulate it by inserting or removing validators (useful in behaviors).
* For example, <code>$model->validatorList->add($newValidator)</code>.
* The change made to the {@link CList} object will persist and reflect
* in the result of the next call of {@link getValidators}.
* @return CList all the validators declared in the model.
* Returns all the validators declared in [[rules]].
*
* This method differs from [[getActiveValidators]] in that the latter
* only returns the validators applicable to the current [[scenario]].
*
* Because this method returns a [[Vector]] object, you may
* manipulate it by inserting or removing validators (useful in model behaviors).
* For example,
*
* ~~~php
* $model->validators->add($newValidator);
* ~~~
*
* @return Vector all the validators declared in the model.
*/
public function getValidatorList()
public function getValidators()
{
if ($this->_validators === null)
if ($this->_validators === null) {
$this->_validators = $this->createValidators();
}
return $this->_validators;
}
/**
* Returns the validators applicable to the current {@link scenario}.
* @param string $attribute the name of the attribute whose validators should be returned.
* Returns the validators applicable to the current [[scenario]].
* @param string $attribute the name of the attribute whose applicable validators should be returned.
* If this is null, the validators for ALL attributes in the model will be returned.
* @return array the validators applicable to the current {@link scenario}.
* @return array the validators applicable to the current [[scenario]].
*/
public function getValidators($attribute = null)
public function getActiveValidators($attribute = null)
{
if ($this->_validators === null)
$this->_validators = $this->createValidators();
$validators = array();
$scenario = $this->getScenario();
foreach ($this->_validators as $validator)
{
if ($validator->applyTo($scenario))
{
if ($attribute === null || in_array($attribute, $validator->attributes, true))
foreach ($this->getValidators() as $validator) {
if ($validator->applyTo($scenario)) {
if ($attribute === null || in_array($attribute, $validator->attributes, true)) {
$validators[] = $validator;
}
}
}
return $validators;
}
/**
* Creates validator objects based on the specification in {@link rules}.
* This method is mainly used internally.
* @return CList validators built based on {@link rules()}.
* @return Vector validators built based on {@link rules()}.
*/
public function createValidators()
{
$validators = new CList;
foreach ($this->rules() as $rule)
{
if (isset($rule[0], $rule[1])) // attributes, validator name
$validators->add(CValidator::createValidator($rule[1], $this, $rule[0], array_slice($rule, 2)));
else
throw new CException(Yii::t('yii', '{class} has an invalid validation rule. The rule must specify attributes to be validated and the validator name.',
$validators = new Vector;
foreach ($this->rules() as $rule) {
if (isset($rule[0], $rule[1])) { // attributes, validator type
$validators->add(\yii\validators\Validator::createValidator($rule[1], $this, $rule[0], array_slice($rule, 2)));
}
else {
throw new Exception(spr'{class} has an invalid validation rule. The rule must specify attributes to be validated and the validator name.',
array('{class}' => get_class($this))));
}
}
return $validators;
}
@ -355,7 +358,7 @@ class Model extends Component implements \IteratorAggregate, \ArrayAccess
*/
public function isAttributeRequired($attribute)
{
foreach ($this->getValidators($attribute) as $validator)
foreach ($this->getActiveValidators($attribute) as $validator)
{
if ($validator instanceof CRequiredValidator)
return true;
@ -623,7 +626,7 @@ class Model extends Component implements \IteratorAggregate, \ArrayAccess
{
$attributes = array();
$unsafe = array();
foreach ($this->getValidators() as $validator) {
foreach ($this->getActiveValidators() as $validator) {
if (!$validator->safe) {
foreach ($validator->attributes as $name) {
$unsafe[] = $name;

29
framework/base/ModelEvent.php

@ -1,29 +0,0 @@
<?php
/**
* CModelEvent class file.
*
* @link http://www.yiiframework.com/
* @copyright Copyright &copy; 2008-2012 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
namespace yii\base;
/**
* ModelEvent class.
*
* ModelEvent represents the event parameters needed by events raised by a model.
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @since 2.0
*/
class ModelEvent extends Event
{
/**
* @var CDbCrireria the query criteria that is passed as a parameter to a find method of {@link CActiveRecord}.
* Note that this property is only used by {@link CActiveRecord::onBeforeFind} event.
* This property could be null.
* @since 1.1.5
*/
public $criteria;
}
Loading…
Cancel
Save