2017-04-24 11:36:29 4921次浏览 3条回答 1 悬赏 88 金钱

D:\phpwork\news\controllers\SiteController.php

   public function actionRegister()
    {
        $model = new RegisterForm();
        if ($model->load(Yii::$app->request->post())) {
           if (Yii::$app->request->isAjax) {
                Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
                $result=\yii\widgets\ActiveForm::validate($model);
                return $result;
            }
            if($model->validate()){
                $error=$model->save();
                if($error) {
                    return $this->errorDisplay($error);
                }else{
                    Yii::$app->session->setFlash('success');
                    return $this->refresh();
                }
            }else{
                return $this->errorDisplay($model->getErrors());
            }
        }else{
            return $this->render('register', [
                'model' => $model,
            ]);
        }
    }

D:\phpwork\news\models\RegisterForm.php

            ['verifyCode', 'captcha', 'captchaAction'=>'site/captcha'],

报错信息:

The verification code is incorrect.

个人感觉是下面这段Ajax验证代码运行后,verifyCode就被自动刷新了:

           if (Yii::$app->request->isAjax) {
                Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
                $result=\yii\widgets\ActiveForm::validate($model);
                return $result;
            }

请问大神们是怎么解决的这个问题?谢谢

补充于 2017-04-24 11:44

D:\phpwork\news\views\site\register.php

                <?php $form = ActiveForm::begin([
                    'id' => 'contact-form',
                    'enableAjaxValidation'=>true,
                ]); ?>

                    <?= $form->field($model, 'member')->textInput(['autofocus' => true])->hint('Can be chinese,grapheme or number.Only use to login,not public display!') ?>

                    <?= $form->field($model, 'memkey')->passwordInput() ?>

                    <?= $form->field($model, 'memkey_repeat')->passwordInput()  ?>

                    <?= $form->field($model, 'nickname')->textInput()->hint('Can be chinese,grapheme or number,can have blank space.For public display only!') ?>

                    <?= $form->field($model, 'verifyCode')->widget(Captcha::className(), [
                        'captchaAction'=>'site/captcha',
                        'imageOptions'=>['alt'=>'点击换图','title'=>'点击换图', 'style'=>'cursor:pointer'],
                        'template' => '<div class="row"><div class="col-lg-3">{image}</div><div class="col-lg-6">{input}</div></div>',
                    ]) ?>

                    <div class="form-group">
                        <?= Html::submitButton('Submit', ['class' => 'btn btn-primary', 'name' => 'contact-button']) ?>
                    </div>

                <?php ActiveForm::end(); ?>
补充于 2017-04-24 11:51

D:\phpwork\news\vendor\yiisoft\yii2\captcha\CaptchaAction.php

   public function validate($input, $caseSensitive)
    {
        $code = $this->getVerifyCode();
        $valid = $caseSensitive ? ($input === $code) : strcasecmp($input, $code) === 0;
        $session = Yii::$app->getSession();
        $session->open();
        $name = $this->getSessionKey() . 'count';
        $session[$name] = $session[$name] + 1;
        if ($valid || $session[$name] > $this->testLimit && $this->testLimit > 0) {
            $this->getVerifyCode(true);
        }

        return $valid;
    }

看了看yii2的验证代码,验证过后session是被改变了的,有captcha的表单中怎么使用Ajax验证呢?

补充于 2017-04-24 18:21

最佳答案

  • liuruiaaa 发布于 2017-04-24 13:36 举报

    ` use yii\captcha\CaptchaAction;

          if (Yii::$app->getRequest()->isAjax){
            $data = Yii::$app->request->post();
    
             $captcha_validate  = new CaptchaAction('captcha', $this);
            if (isset($data['captcha']) && !$captcha_validate->validate($data['captcha'], false)){
               //这是验证失败的
            }else{
               //验证成功!
            }
          }`
    
    2 条回复
    回复于 2017-10-05 06:19 回复

    如果只是这么写,那ajax验证正确,服务器进行第二次刷新,然后就提交表单的时候就会失败。

    回复于 2017-10-05 06:21 回复

    非常感谢您的这几行代码!

  • 回答于 2017-04-24 16:00 举报

    ['verifyCode', 'captcha','message'=>'验证码不正确'],
    而不是这么写的
    ['verifyCode', 'captcha', 'captchaAction'=>'site/captcha'],

  • 回答于 2017-10-05 06:14 举报

    我将rules的规则
    [ 'coder','captcha', 'captchaAction'=>'coder/captcha','message'=>"{attribute}错误"]
    给删除了,已经用ajax验证,就不进行再次验证了,直接提交表单的时候就可以通过了。

您需要登录后才可以回答。登录 | 立即注册
阿江
副董事长

阿江

注册时间:2015-10-18
最后登录:2024-03-03
在线时长:186小时21分
  • 粉丝94
  • 金钱16816
  • 威望160
  • 积分20276

热门问题