|  |  |  | @ -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; | 
			
		
	
	
		
			
				
					|  |  |  | 
 |