You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
3.0 KiB
86 lines
3.0 KiB
<?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. |
|
* |
|
* @author Qiang Xue <qiang.xue@gmail.com> |
|
* @version $Id: CExistValidator.php 2799 2011-01-01 19:31:13Z qiang.xue $ |
|
* @package system.validators |
|
* @since 1.0.4 |
|
*/ |
|
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. |
|
* @since 1.0.8 |
|
*/ |
|
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}' => $value)); |
|
} |
|
} |
|
} |
|
|
|
|