IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]Yii 自定义表单验证规则和客户端验证

    iefreer发表于 2015-06-09 22:34:11
    love 0

    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成员变量来访问。


    by iefreer



沪ICP备19023445号-2号
友情链接