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