YII 表单验证规则

官方文档:
http://www.yiichina.com/guide/form.model
类参考手册:
http://www.yiichina.com/api/CValidator
http://www.php100.com/manual/yii/index.html


Yii CModel.rules() 方法 、validate预定义完整列表、以及说说验证public array rules ()

{ .......}

array 要调用 validate() 时应用的有效性规则。返回属性的有效性规则。

声明验证规则,应重写此方法。 每个规则是数组具有以下结构:

array('attribute list', 'validator name', 'on'=>'scenario name', ...validation parameters...)

 

注:attribute list: 指定属性 (以逗号分隔) 进行验证 ;

validator name: 指定要使用的验证程序。 它可以是方法的一个模型类的一个内置的验证器或验证程序类 (或其路径的别名) 名称的名

称。 一种验证方法必须具有以下签名:

// $params refers to validation parameters given in the rulefunction validatorName($attribute,$params)

内置的验证程序是指在 CValidator::builtInValidators 中声明的验证程序之一。 验证程序的类是扩展 CValidator 的类。

on: 应执行有效性规则时,此选项指定的情形。 用逗号分开不同的方案。 如果未设置此选项,将在任何情况下应用规则。 请 方案 中有关

此选项的更多详细信息,参阅。

附加参数用于初始化相应的验证程序属性。 请参阅 individal 验证器类 API 可能的属性。

实例:

public function rules()
{
        return array(
            array('username, password, passwordConfirm, email, verifyCode', 'required'),
            array('username, password, passwordConfirm, email', 'length', 'min'=>5 ,'max'=>128),
            array('username', 'unique'),
            array('email','email'),
            array('passwordConfirm', 'compare', 'compareAttribute' => 'password'),
            array('verifyCode', 'captcha', 'allowEmpty'=>!CCaptcha::checkRequirements(), 'message'=>'验证码输入不正确,请重新输入'), 
        );
}

预定义完整列表:


setFlash(), getFlash()可以完成验证成功后提示 2.errorSummary验证不通过的错误提示 rules()方法中定义的规则会在模型实例调用其 validate() 或 save() 方法时逐一执行。normalizeTags验证器是一个基于方法的验证器,Models/xx.php中的rules()的验证规则是对数据库表进行 的,Models/xxForm.php中的rules()的验证规则是对表单进行的,和数据库表没有关系,类名和文件名要相同 。 如果我们使用一个validator(验证器)类,则这个类必须继承CValidator。其实有三种方法可以指定validator(验证器),包括前面提到的一种格式: 1.第一种是在模型类中定义验证方法 2.第二种是指定一个单独的验证器类(这个类继承validators/CValidator )。 3.第三种是你可以使用Yii框架中现有的验证器,指定预定义的验证器别名即可。 Yii为你提供了很多预定义的验证器类,同时也指定了别名,用在定义规则时。Yii1.1版本,预定义的验证器别名的完整列表如下: * boolean:它是CBooleanValidator类的别名,验证属性的值是布尔值(true或false)。 * captcha:它是CCaptchaValidator类的别名,验证属性的值等于一个显示的CAPTCHA(验证码)的值。 * compare:它是CCompareValidator类的别名,验证属性的值与另一个属性的值相等。 * email:它是CEmailValidator类的别名,验证属性的值为有一个有效的Email地址。 * default:它是CDefaultValidator类的别名,验证属性的值为分配的默认值。 * exist:它是CExistValidator类的别名,验证属性的值在表中的对应列中存在。 * file:它是CFileValidator类的别名,验证属性的值包含上传的文件。 * filter:它是CFilterValidator类的别名,用过滤器转换属性的值。 * in:它是CRangeValidator类的别名,验证属性值在一个预定义列表中。 * length:它是CStringValidator类的别名,验证属性值的长度在一个范围内。 * match:它是CRegularExpressionValidator类的别名,验证属性值匹配一个正则表达式。 * numerical:它是CNumberValidator类的别名,验证属性值是数字。 * required:它是CRequiredValidator类的别名,验证属性值必需有值,不能为空。 * type:它是CTypedValidator类的别名,验证属性值是一个指定的数据类型。 * unique:它是CUniquedValidator类的别名,验证属性值在表中的对应列中是唯一的。 * url:它是CUrlValidator类的别名,验证属性值是一个有效的URL。 1.自定义规则验证 然后在模型(model)的: Java代码 const WEAK = 0; const STRONG = 1; public function rules() { return array( array(‘password’, ‘passwordStrength’, ‘strength’=>self::STRONG), ); } public function passwordStrength($attribute,$params)//(参数是固定格式) { if ($params['strength'] === self::WEAK) $pattern = ‘/^(?=.*[a-zA-Z0-9]).{5,}$/’; elseif ($params['strength'] === self::STRONG) $pattern = ‘/^(?=.*\d(?=.*\d))(?=.*[a-zA-Z](?=.*[a-zA-Z])).{5,}$/’; if(!preg_match($pattern, $this->$attribute)) $this->addError($attribute, ‘your password is not strong enough!’); } 刚才创建的方法需要两个参数: * $attribute 需要验证的属性 * $params 在规则中自定义的参数 在模型的 rules 方法中我们验证的是 password 属性,所以在验证规则中需要验证的属性值应该是 password. 在 rules 方法中我们还设置了自定义的参数 strength,它的值将会放到 $params 数组中. 你会发现在方法中我们使用了 CModel::addError(). 添加错误接受两个参数:第一个参数是在表单中显示错误的属性名,第二个参数时显示的错误信息 。 2.单独的验证器类 首先要做的是创建类文件.最好的方法时类的文件名和类名相同,可以使用 yii 的延迟加载(lazy loading)功能。 让我们在应用(application)的扩展(extensiions)目录(在 protected 文件夹下)下新建一个文件夹. 将目录命名为: MyValidators然后创建文件: passwordStrength.php Java代码 class passwordStrength extends CValidator { public $strength; private $weak_pattern = ‘/^(?=.*[a-zA-Z0-9]).{5,}$/’; private $strong_pattern = ‘/^(?=.*\d(?=.*\d))(?=.*[a-zA-Z](?=.*[a-zA-Z])).{5,}$/’; protected function validateAttribute($object,$attribute) { // check the strength parameter used in the validation rule of our model if ($this->strength == ‘weak’) $pattern = $this->weak_pattern; elseif ($this->strength == ‘strong’) $pattern = $this->strong_pattern; // extract the attribute value from it’s model object $value=$object->$attribute; if(!preg_match($pattern, $value)) { $this->addError($object,$attribute,’your password is too weak!’); } } 然后在模型(model)的: Java代码 public function rules() { return array( array(‘password’, ‘ext.MyValidators.passwordStrength’, ‘strength’=>self::STRONG), ); } 由于我们直接在User AR类中添加了$repassword属性,并且它与底层数据库表之间没有对应关系,我们需要告诉模型类允许这个属性在setAttributes()被 调用时被设置。 我们的做法是将其添加到User模型类的安全属性列表中。向User::rules()数组添加下列代码: Java代码 array(‘repassword’, ‘safe’), 我们新建的$repassword不存在对应的tbl_user表中的列,需要将其直接添加到安全属性列表。 setAttributes: Java代码 $model->attributes=$_POST['User']; //$model->vpnip =$_POST['User']['vpnip']; 添加了$repassword属性 Java代码 class User extends CActiveRecord { public $repassword; //不能是private会报错 以注册验证为例.controller Java代码 public function actionRegister() { $model=new User; if(isset($_POST['User'])) { $model->attributes=$_POST['User']; if($model->validate()){ …. $model->save(); Yii::app()->user->setFlash(‘register’,'Thank you for your register.’);//验证通过提示 $this->redirect(array(‘register’)); } } $this->render(‘register’,array( ‘model’=>$model, )); } register.php Java代码

 

posted on 2013-11-22 21:52  imxiu  阅读(2143)  评论(0编辑  收藏  举报

导航