使用pjax进行activeform客户端验证

时间:2017-03-09 19:58:15

标签: yii2 pjax

当enableClientValidation设置为true时,yii2-pjax小部件不会触发ajax。仅当enableClientValidation设置为false时,pjax才能在此处运行。有没有办法在每个字段(通过yii)以及提交按钮上的pjax(通过pjax)上具有活动表单客户端和ajax验证

<?php Pjax::begin(['id'=> 'new-comment','enablePushState' => false]); ?>

  <?php $form = ActiveForm::begin([
     'id' => $model->formName(),
     'options' => ['data-pjax' => "1"] , 
     'action' => ['site/signup'],
     'enableClientValidation' => true,
     ]); 
  ?>   
<?= Html::submitButton('REGISTER', ['class' => 'btn btn-primary', 'name' => 'signup-button', 'id'=>'register-btn']) ?>                                         
 </div>
<?php ActiveForm::end(); ?>   
<?php Pjax::end(); ?

1 个答案:

答案 0 :(得分:2)

我不得不在PHP中删除活动表单中的Pjax调用,否则clientValidation会失败。

<?php $form = ActiveForm::begin([
                "id"=>"CreateForm",
                'enableClientValidation' => true,
                //'enableAjaxValidation' => true,
                'validationUrl'=>['site/form-validate'],
                "options" => ["enctype" =>"multipart/form-data"]
                ]
); ?>

enableAjaxValidation可以在上面

中生效

目前我没有Pjax就将clientValidation设置为true,而Pjax是基于validationUrl进行验证的。表单的提交按钮在javascript中外部处理,首先调用相同的validationUrl并使用yii activeform的updateMessages方法更新错误字段。如果没有错误,则业务逻辑以与validationUrl action

不同的操作完成
$.ajax({
                        url         : encodeURI(baseUri + "site/form-validate"),
                        data        : $("#CreateForm").serialize(),
                        dataType    : 'json',
                        type        : 'POST',
                        beforeSend : function(xhr, settings) {
                            $this.attr("disabled","disabled");
                            Pace.stop();
                            Pace.bar.render();
                        },
                        success     : function(data) {  
                            $('#CreateForm').yiiActiveForm("updateMessages", data);

                            if($("form#CreateForm").find('.has-error').length == 0) {               
                                $.ajax({
                                    url         : encodeURI(baseUri + "site/form"),
                                    data        : $("#CreateForm").serialize(),
                                    dataType    : 'json',
                                    type        : 'POST',
                                    beforeSend : function(xhr, settings) {
                                    },
                                    success     : function(data) {  
                                        console.log(data);
                                    },
                                    error       : function(data) {
                                    },
                                    complete    : function() {
                                        $this.removeAttr("disabled");
                                        Pace.stop();
                                    },
                                 });    
                            } else {
                                $this.removeAttr("disabled");
                                Pace.stop();
                            }                         
                        },
                        error       : function(data) {
                        },
                        complete    : function() {                          
                        },
                 });

控制器 -

public function actionFormValidate() {

    $model = new CreateForm();
    if(Yii::$app->request->isAjax && $model->load($_POST))
    {
        Yii::$app->response->format = 'json';
        return \yii\widgets\ActiveForm::validate($model);
    }
}