diff options
Diffstat (limited to 'framework/validators/CExistValidator.php')
| -rw-r--r-- | framework/validators/CExistValidator.php | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/framework/validators/CExistValidator.php b/framework/validators/CExistValidator.php new file mode 100644 index 0000000..9c1d5ce --- /dev/null +++ b/framework/validators/CExistValidator.php @@ -0,0 +1,92 @@ +<?php +/** + * CExistValidator class file. + * + * @author Qiang Xue <qiang.xue@gmail.com> + * @link http://www.yiiframework.com/ + * @copyright Copyright © 2008-2011 Yii Software LLC + * @license http://www.yiiframework.com/license/ + */ + +/** + * CExistValidator validates that the attribute value exists in a table. + * + * This validator is often used to verify that a foreign key contains a value + * that can be found in the foreign table. + * + * When using the {@link message} property to define a custom error message, the message + * may contain additional placeholders that will be replaced with the actual content. In addition + * to the "{attribute}" placeholder, recognized by all validators (see {@link CValidator}), + * CExistValidator allows for the following placeholders to be specified: + * <ul> + * <li>{value}: replaced with value of the attribute.</li> + * </ul> + * + * @author Qiang Xue <qiang.xue@gmail.com> + * @version $Id: CExistValidator.php 3549 2012-01-27 15:36:43Z qiang.xue $ + * @package system.validators + */ +class CExistValidator extends CValidator +{ + /** + * @var string the ActiveRecord class name that should be used to + * look for the attribute value being validated. Defaults to null, + * meaning using the ActiveRecord class of the attribute being validated. + * You may use path alias to reference a class name here. + * @see attributeName + */ + public $className; + /** + * @var string the ActiveRecord class attribute name that should be + * used to look for the attribute value being validated. Defaults to null, + * meaning using the name of the attribute being validated. + * @see className + */ + public $attributeName; + /** + * @var array additional query criteria. This will be combined with the condition + * that checks if the attribute value exists in the corresponding table column. + * This array will be used to instantiate a {@link CDbCriteria} object. + */ + public $criteria=array(); + /** + * @var boolean whether the attribute value can be null or empty. Defaults to true, + * meaning that if the attribute is empty, it is considered valid. + */ + public $allowEmpty=true; + + /** + * Validates the attribute of the object. + * If there is any error, the error message is added to the object. + * @param CModel $object the object being validated + * @param string $attribute the attribute being validated + */ + protected function validateAttribute($object,$attribute) + { + $value=$object->$attribute; + if($this->allowEmpty && $this->isEmpty($value)) + return; + + $className=$this->className===null?get_class($object):Yii::import($this->className); + $attributeName=$this->attributeName===null?$attribute:$this->attributeName; + $finder=CActiveRecord::model($className); + $table=$finder->getTableSchema(); + if(($column=$table->getColumn($attributeName))===null) + throw new CException(Yii::t('yii','Table "{table}" does not have a column named "{column}".', + array('{column}'=>$attributeName,'{table}'=>$table->name))); + + $criteria=array('condition'=>$column->rawName.'=:vp','params'=>array(':vp'=>$value)); + if($this->criteria!==array()) + { + $criteria=new CDbCriteria($criteria); + $criteria->mergeWith($this->criteria); + } + + if(!$finder->exists($criteria)) + { + $message=$this->message!==null?$this->message:Yii::t('yii','{attribute} "{value}" is invalid.'); + $this->addError($object,$attribute,$message,array('{value}'=>CHtml::encode($value))); + } + } +} + |
