Yii2.0 ajax验证,验证码报错,load方法

Yii2.0刚上手,边学边用。简单说下自己的功能需求。
用户注册 字段:手机号码,验证码,密码,名字。验证用的model的rule验证,ajax验证。
问题1:手机号码唯一 不能重复…..

//验证属性
    public function rules(){
        return [
            [['telnumber','verifyCode','password','name'],'required'],
            ['telnumber','match','pattern'=>'/^(((13[0-9]{1})|(15[0-9]{1})|(18[0-9]{1}))+\d{8})$/','message'=>'手机号码格式错误。'],
            ['telnumber','unique','targetClass'=>'\app\commands\models\Member','message'=>'该手机号码已经注册。'],
            ['password','string','min'=>6,'max'=>18],
            ['name','string','min'=>2,'max'=>6],
            ['verifyCode', 'captcha','captchaAction'=>'/member/captcha'],
        ];
    }

这里需要注意的是要写明:targetClass对应到验证类的model。
From中的验证和提交url,我是分开写的。

 $form = ActiveForm::begin(['id' => 'righster-form','enableAjaxValidation' => true,'enableClientValidation' => true,'validationUrl'=>'checkreg']); ?>

单独指定了验证的url,对应的验证方法一定要有返回值,如果没有返回值没有结果响应

//用户注册检查
    public function actionCheckreg()
    {
        if(Yii::$app->request->isAjax&&isset($_POST['ajax'])){
            $model = new RegisterForm();
            //给model填充数据
            $model->load(Yii::$app->request->post());
            //设置返回数据格式为json格式
            Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
            $errors=\yii\bootstrap\ActiveForm::validate($model,array('telnumber','password','name'));
            if(sizeof($errors)>0){
                return $errors;
            }
            return true;
        }
    }

上面的验证方法用的是Form的验证,因为如果用Model的验证将错误信息return的时候 因为id属性与form的无法对应 所以不能正常显示。ActiveForm::validate的验证我指定了验证字段,因为如果验证所有的,那验证码将会出问题,因为每次验证后都会生成新的验证码。思路就是这里的数据校验只验证手机号码 密码 名字。验证码的校验交给yii来做。
2.load方法的使用
post提交的数据load给Model,是数据model而不是form表单model。
如果直接将form表单load POST数据 会填充失败返回false。
原因:form表单过来的Post数据 input都带着前缀,所以与数据model的属性列名不一致 导致Load 失败。
解决:在load的时候 指定参数2为提交表单的前缀 就可以Load true了。

$member=new Member();
$member->load(Yii::$app->request->post(),'RegisterForm');
$member->login_ip=Yii::$app->request->getUserIp();
$member->login_date=time();

一边学一边做,进度比较慢。边学变笔记+总结吧。不得不说YII 确实很强大。

你可能感兴趣的:(yii2)