【问题标题】:Yii2 No-refresh Page After Submitting Modal FormYii2 提交模态表单后页面不刷新
【发布时间】:2015-05-30 01:54:08
【问题描述】:

我有一个创建购买页面。它有一个供应商下拉字段,我可以在其中添加新供应商,单击时显示模式。在模态中是用于添加新供应商的表格。创建新供应商并单击提交按钮后,页面将刷新。

这是一个截图:

由于我的动作控制器中的redirect 函数,页面被刷新:

$model->refresh();
return $this->redirect(['index', 'id' => $session['user_id']]);

我知道 Ajax 或许可以解决这个问题,但我不知道如何开始。单击“创建”按钮以在我的 Ajax 函数中使用它而不通过我的控制器(仅用于前端显示)后,如何从我的模态表单中获取数据?

【问题讨论】:

  • 我的问题中的图片。
  • 你在工作吗?可能是上传图片的网站在那边被屏蔽了。

标签: php ajax modal-dialog refresh yii2


【解决方案1】:

通过在 ActiveForm 选项中添加以下行来禁用 Yii 客户端验证

'enableClientValidation'=>false

现在在表单提交中添加您的 javascript 代码以收集您的表单数据并将其发送到服务器。 Yii 会验证这些数据,如果有任何验证错误,我们会发回

$this->registerJs('
    $("#contact-form").submit(function() {
        $(".form-group").removeClass("has-error");      //remove error class
        $(".help-block").html("");                      //remove existing error messages

        var form_data = $("#contact-form").serialize();
        var action_url = $("#contact-form").attr("action");

        $.ajax({
            method: "POST",
            url: action_url,
            data: form_data
        })
        .done(function( data ) {
            console.log(data);
            if(data.success == true)    {       //data saved successfully 

            }   else    {       //validation errors occurred
                $.each(data.error, function(ind, vl) {      //show errors to user
                    $(".field-contactform-"+ind).addClass("has-error");
                    $(".field-contactform-"+ind).find(".help-block").html(vl[0]);
                });
            }

        });
        return false;
    });', \yii\web\View::POS_READY, 'my-ajax-form-submit');

现在对您的控制器操作进行了一些更改

public function actionContact()
{
    $model = new ContactForm();
    if ($model->load(Yii::$app->request->post())) {
        $success = false;
        $error = [];
        if($model->contact(Yii::$app->params['adminEmail']))    {
            $success = true;
        }   else    {
            $error = $model->getErrors();       //get validation error messages
        }
        header('Cache-Control: no-cache, must-revalidate');
        header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
        header('Content-type: application/json');
        echo json_encode(['success' => $success, 'error' => $error ]);

        Yii::$app->end();
    } else {
        return $this->render('contact', [
            'model' => $model,
        ]);
    }
}

它已经完成了。

【讨论】:

  • 谢谢!我在哪里放registerJs?在我的“创建购买”页面或“创建联系人”模式中?
  • 创建联系人并单击创建按钮后,页面重定向到另一个页面(createcontact),页面上只写了这个:{"success":true,"error":[]} 我按照所有说明操作,但修改了actionContact。我评论了if($model->contact(Yii::$app->params['adminEmail'])) 块并添加了$model->save(); if($model->save()){ $success = true; }else{ $error = $model->getErrors(); //get validation error messages } return json_encode(['success' => $success, 'error' => $error ]);
  • 在您的联系模式中添加 registerJs 代码,并确保 jquery 已加载到您的联系模式中
  • 如果您要部分渲染模型,则添加 "\app\assets\AppAsset::register($this);"代码中的这一行用于在其中注册 jquery。
  • 如果这是您问题的解决方案,请将其标记为有效答案
猜你喜欢
  • 1970-01-01
  • 2012-05-25
  • 1970-01-01
  • 2013-09-21
  • 2013-02-09
相关资源
最近更新 更多