Yii2-仅提交时进行ajax验证,更改时进行客户端验证

Yii2-仅提交时进行ajax验证,更改时进行客户端验证,yii,yii2,Yii,Yii2,是否可以仅在表单提交时启用ajax验证,并在更改/模糊时启用client/JS验证?例如: 用户输入数据并按tab键:应应用客户端验证 然后用户提交表单:应应用ajax验证 如果验证成功,请继续正常表单提交 以下是我的ActiveForm配置: <?php $form = ActiveForm::begin([ 'id' => 'login-form', 'enableAjaxValidation' => true, 'enableClientValid

是否可以仅在表单提交时启用ajax验证,并在更改/模糊时启用client/JS验证?例如:

  • 用户输入数据并按tab键:应应用客户端验证
  • 然后用户提交表单:应应用ajax验证
  • 如果验证成功,请继续正常表单提交
  • 以下是我的ActiveForm配置:

    <?php $form = ActiveForm::begin([
        'id' => 'login-form',
        'enableAjaxValidation' => true,
        'enableClientValidation' => true,
        'validateOnBlur' => true,
        'validateOnChange' => true,
        'validateOnSubmit' => true,
    ]); ?>
    
    
    

    目前,当我关注某个字段时,它也将应用ajax验证-我不希望这样做。

    要按您希望的方式进行验证,您需要通过ajax提交表单,并且需要在验证后附加一个处理程序。处理程序将替换默认表单提交,并负责将数据发送到服务器,并在服务器验证失败时显示错误消息。显示验证消息需要控制器端的支持

    您可以在脚本中分别更新表单
    name/id
    。并在错误和错误服务器响应中添加警报。您的表单将通过ajax调用自动保存,无需重新加载。您可以在成功部分中重置表单

    将处理程序附加到窗体:

    $this->registerJs('$(\'#my-form\').on(\'afterValidate\', function () {
        var $yiiform = $(this);
        $.ajax({
                type: $yiiform.attr(\'method\'),
                url: $yiiform.attr(\'action\'),
                data: $yiiform.serializeArray(),
            }
        )
            .done(function(data) {
                if(data.success) {
                    $yiiform.submit();
                    // data is saved
                } else if (data.validation) {
                    // server validation failed
                    $yiiform.yiiActiveForm(\'updateMessages\', data.validation, true); // renders validation messages at appropriate places
                    console.log("error on form"+data.validation);
                } else {
                    console.log("incorrect server response");
                    // incorrect server response
                }
            })
            .fail(function () {
                console.log("request failed");
                // request failed
            })
    
        return false; // prevent default form submission
    })');
    
    只需确保您的操作编码如下

    控制器动作

    public function actionUpdate($id)
    {
        if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
    
            //call model validate to trigger validation messages
            $model->validate();
    
            $result = [];
    
            // The code below comes from ActiveForm::validate(). We do not need to validate the model
            // again, as it was already validated by save(). Just collect the messages.
            foreach ($model->getErrors() as $attribute => $errors) {
                $result[\yii\helpers\Html::getInputId($model, $attribute)] = $errors;
            }
            if (!empty($result)) {
                return $this->asJson(['validation' => $result]);
            }
    
            return $this->asJson(['success' => true]);
    
        } elseif ($model->load(Yii::$app->request->post()) && $model->save()) {
            Yii::$app->session->setFlash('success', 'Form saved successfully');
            return $this->redirect('index');
        }
    
        return $this->render('form', ['model' => $model]);
    }
    
    最重要的是,只需使用下面的
    enableClientValidation
    选项将表单初始化为
    true

    $form = ActiveForm::begin([
        'id' => 'login-form',
        'enableClientValidation' => true,
    ]);
    

    您使用的yii2版本是什么?我只使用了相同的设置,他们只调用了一次ajax验证,onblur只调用了客户端验证。我使用的是版本
    2.0.13.1
    。我已经在登录表单上尝试过了。当我输入电子邮件地址并按tab键时,我可以在控制台中看到它执行了一个AJAX调用。只需使用
    composer update
    尝试将其更新为最新的
    2.0.14.1
    ,然后确认,当您说它在blur上触发AJAX验证时,您的意思是您在网络选项卡中看到了reuest吗?刚刚更新为
    2.0.14.1
    ,同样的情况也会发生。是的,我可以在“网络”选项卡中看到请求。老实说,我认为这是出于设计,因为没有办法指定
    validateOnChange
    validateOnBlur
    是否适用于ajax或客户端验证-默认情况下,这两种方法都适用。更新了答案@GSTAR,更改了一些内容,因为我们需要手动提交表单,将事件
    beforeimit
    替换为
    afterValidate
    ,并更改操作代码的顺序,以便在
    ajax
    请求上单独验证,并在
    post
    请求上分别提交/保存
    模型
    ,一旦验证通过,我们可以通过ajax
    success
    函数中的
    javasript
    .submit()
    提交表单我刚刚测试了它,如果验证通过ajax调用,表单就会提交希望它能帮到你