Yii2:ajax表单验证ajax提交表单

前端之家收集整理的这篇文章主要介绍了Yii2:ajax表单验证ajax提交表单前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想知道任何Yii2专家可以帮助我了解如何最好地使用ajax形式和Yii ajax验证.我想我可以解释这个问题,而不会让你完成我的所有代码.

我正在使用Promo Code输入表单,用户将其促销代码输入表单,表单通过ajax提交.然后,我们对促销代码细节执行数据库查找,验证代码,如果代码验证,我们要显示隐藏在页面上的注册表单.

我有一个表单字段“代码”的自定义验证功能,它是名为“寄存器”的模型场景中的活动字段.

class UserCode extends ActiveRecord
{
    ... 

    public function scenarios()
    {
        return [
            'register' => ['code'],];
    }

    public function rules()
    {
        return [
            [['code'],'required'],[['code'],'validateUserCode','on' => ['register']],];
    }

    public function validateUserCode($attribute,$params)
    {
        // perform all my custom logic to determine if the code is valid

        if ($code_invalid) {
            $this->addError($attribute,'Sorry,this code is invalid.');
        }
    }

    ...
}

然后在控制器中,如Yii2指南所示,我使用以下代码来捕获这个ajax验证:

public function actionValidate() {

    $model = new UserCode(['scenario' => 'register']);

    if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
        Yii::$app->response->format = Response::FORMAT_JSON;
        return ActiveForm::validate($model);
    }

    // no logic can be run after the above code b/c the form is submit with ajax 
    // and therefore always trapped in the Yii::$app->request->isAjax conditional

}

上面的代码都可以正常工作,如果我从我的表单上的$form->字段($model,’code’)字段中删除焦点,Yii的ajax验证将基于我的自定义验证逻辑,并显示我的自定义错误消息.

当我去提交表格时,我的挑战就出现了.表单提交也通过ajax处理,因此控制器动作总是返回ActiveForm :: validate($model)的结果;因为if(Yii :: $app-> request-> isAjax&&$model-> load(Yii :: $app-> request-> post()))将适用于ajax表单验证和表单提交.

使用上述方法,我被迫返回只有ajax验证的结果,而不是我可能需要额外的客户端验证的任何json数据,例如在通过ajax表单提交有效的使用代码之后显示注册表单.

我意识到我可以设置’enableAjaxValidation’=>在ActiveForm中为false,然后在if(Yii :: $app-> request-> isAjax& $model-> load(Yii :: $app-> request->请求中)中返回自己的json数据; post()))条件.如果我这样做,我可以显示注册表单,因为我有我自己的json数据来处理.

有没有办法在用ajax提交的表单上进行ajax验证?您如何分别从ajax表单提交中捕获ajax验证,以不同的方式处理这两个事件?

任何建议或替代方法都非常感激!

您应该使用不同的URL设置validationUrl与您将表单提交到的URL相比.这样,您可以使用验证函数来验证并返回ActiveForm :: validate($model);和正常的提交表单做其他事情.

您可以阅读有关validationUrl here的更多信息:

猜你在找的PHP相关文章