Browse Source

w

tags/2.0.0-beta
Qiang Xue 14 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 * @param string $name the event name
* @return boolean whether there is any handler attached to the event. * @return boolean whether there is any handler attached to the event.
*/ */
public function hasEventHandler($name) public function hasEventHandlers($name)
{ {
$name = strtolower($name); $name = strtolower($name);
return isset($this->_e[$name]) && $this->_e[$name]->getCount(); 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(); $this->clearErrors();
} }
if ($this->beforeValidate()) { if ($this->beforeValidate()) {
foreach ($this->getValidators() as $validator) { foreach ($this->getActiveValidators() as $validator) {
$validator->validate($this, $attributes); $validator->validate($this, $attributes);
} }
$this->afterValidate(); $this->afterValidate();
@ -222,7 +222,7 @@ class Model extends Component implements \IteratorAggregate, \ArrayAccess
*/ */
public function afterConstruct() public function afterConstruct()
{ {
if ($this->hasEventHandler('onAfterConstruct')) { if ($this->hasEventHandlers('onAfterConstruct')) {
$this->onAfterConstruct(new Event($this)); $this->onAfterConstruct(new Event($this));
} }
} }
@ -237,7 +237,7 @@ class Model extends Component implements \IteratorAggregate, \ArrayAccess
*/ */
public function beforeValidate() public function beforeValidate()
{ {
if ($this->hasEventHandler('onBeforeValidate')) { if ($this->hasEventHandlers('onBeforeValidate')) {
$event = new ValidationEvent($this); $event = new ValidationEvent($this);
$this->onBeforeValidate($event); $this->onBeforeValidate($event);
return $event->isValid; return $event->isValid;
@ -253,7 +253,7 @@ class Model extends Component implements \IteratorAggregate, \ArrayAccess
*/ */
public function afterValidate() public function afterValidate()
{ {
if ($this->hasEventHandler('onAfterValidate')) { if ($this->hasEventHandlers('onAfterValidate')) {
$this->onAfterValidate(new CEvent($this)); $this->onAfterValidate(new CEvent($this));
} }
} }
@ -286,42 +286,44 @@ class Model extends Component implements \IteratorAggregate, \ArrayAccess
} }
/** /**
* Returns all the validators declared in the model. * Returns all the validators declared in [[rules]].
* This method differs from {@link getValidators} in that the latter *
* would only return the validators applicable to the current {@link scenario}. * This method differs from [[getActiveValidators]] in that the latter
* Also, since this method return a {@link CList} object, you may * only returns the validators applicable to the current [[scenario]].
* manipulate it by inserting or removing validators (useful in behaviors). *
* For example, <code>$model->validatorList->add($newValidator)</code>. * Because this method returns a [[Vector]] object, you may
* The change made to the {@link CList} object will persist and reflect * manipulate it by inserting or removing validators (useful in model behaviors).
* in the result of the next call of {@link getValidators}. * For example,
* @return CList all the validators declared in the model. *
* ~~~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(); $this->_validators = $this->createValidators();
}
return $this->_validators; return $this->_validators;
} }
/** /**
* Returns the validators applicable to the current {@link scenario}. * Returns the validators applicable to the current [[scenario]].
* @param string $attribute the name of the attribute whose validators should be returned. * @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. * 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(); $validators = array();
$scenario = $this->getScenario(); $scenario = $this->getScenario();
foreach ($this->_validators as $validator) foreach ($this->getValidators() as $validator) {
{ if ($validator->applyTo($scenario)) {
if ($validator->applyTo($scenario)) if ($attribute === null || in_array($attribute, $validator->attributes, true)) {
{
if ($attribute === null || in_array($attribute, $validator->attributes, true))
$validators[] = $validator; $validators[] = $validator;
}
} }
} }
return $validators; return $validators;
@ -330,18 +332,19 @@ class Model extends Component implements \IteratorAggregate, \ArrayAccess
/** /**
* Creates validator objects based on the specification in {@link rules}. * Creates validator objects based on the specification in {@link rules}.
* This method is mainly used internally. * 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() public function createValidators()
{ {
$validators = new CList; $validators = new Vector;
foreach ($this->rules() as $rule) foreach ($this->rules() as $rule) {
{ if (isset($rule[0], $rule[1])) { // attributes, validator type
if (isset($rule[0], $rule[1])) // attributes, validator name $validators->add(\yii\validators\Validator::createValidator($rule[1], $this, $rule[0], array_slice($rule, 2)));
$validators->add(CValidator::createValidator($rule[1], $this, $rule[0], array_slice($rule, 2))); }
else 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.', 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)))); array('{class}' => get_class($this))));
}
} }
return $validators; return $validators;
} }
@ -355,7 +358,7 @@ class Model extends Component implements \IteratorAggregate, \ArrayAccess
*/ */
public function isAttributeRequired($attribute) public function isAttributeRequired($attribute)
{ {
foreach ($this->getValidators($attribute) as $validator) foreach ($this->getActiveValidators($attribute) as $validator)
{ {
if ($validator instanceof CRequiredValidator) if ($validator instanceof CRequiredValidator)
return true; return true;
@ -623,7 +626,7 @@ class Model extends Component implements \IteratorAggregate, \ArrayAccess
{ {
$attributes = array(); $attributes = array();
$unsafe = array(); $unsafe = array();
foreach ($this->getValidators() as $validator) { foreach ($this->getActiveValidators() as $validator) {
if (!$validator->safe) { if (!$validator->safe) {
foreach ($validator->attributes as $name) { foreach ($validator->attributes as $name) {
$unsafe[] = $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