Yii使用rules来定义验证规则,一些常用的验证规则包括:
required: CRequiredValidator
filter: CFilterValidator
match: CRegularExpressionValidator
email: CEmailValidator
url: CUrlValidator
unique: CUniqueValidator
compare: CCompareValidator
length: CStringValidator
in: CRangeValidator
numerical: CNumberValidator
captcha: CCaptchaValidator
type: CTypeValidator
file: CFileValidator
default: CDefaultValueValidator
exist: CExistValidator
boolean: CBooleanValidator
date: CDateValidator
safe: CSafeValidator
unsafe: CUnsafeValidator
缺省情况是在服务器端验证,如果想在客户端验证,那么需要给CActiveForm传递enableClientValidation参数。
对于大部分情况上述规则就能满足需求,Yii会自动生成相应的客户端JS验证脚本。
但对于一些自定义的界面控件,例如时间选择控件,要求对时间的取值做一定的范围约束,那么就需要用到自定义验证规则了。
使用 array('begin_time', 'checkTime'), 然后定义checkTime(){...}函数可以完成服务器端的验证,不能完成客户端验证,如果要启用客户端验证,
需要从CValidator基类派生自己的验证类,如下所示:
class TimeValidator extends CValidator{ protected function validateAttribute($object,$attribute){ //TODO: server side validation } public function clientValidateAttribute($object,$attribute){ $condition="value<'".date('Y-m-d H:i'."'"); return " if(".$condition.") { messages.push(".CJSON::encode('开始时间必须大于当前时间')."); } "; } }
然后在rules中定义如下:array('f_begin_time', 'TimeValidator'),
你还可以给TimeValidator传递参数,array('f_begin_time', 'TimeValidator', 'mode'=>'test'),
在clientValidateAttribute方法中使用$this->mode成员变量来访问。