Yii2-提交前的警告信息

时间:2019-03-15 19:29:11

标签: php ajax yii2 alert before-save

在操作更新时,如果“ b”字段更改了“ beforeSubmit”事件,则我有一个带有两个字段“ a”和“ b”的表单,并且没有任何按钮OK就会向用户发送模式引导警报或CANCEL,仅在5秒钟内提供信息,此时间过后,如果“ b”字段实际上已更改,则自动保存;如果未更改,则自动保存警告模式窗口。

如何从控制器发送此条件以查看我在哪里使用javascript? 也许用ajax?但是如何?

Controller.php

public function actionUpdate()
    {
        $model = new Faqs();

        if ($model->load(Yii::$app->request->post()) && $model->save()) {

            if ($model->oldAttributes["b"] != $model->b){
                sleep(5);
            }

            return $this->redirect(['view', 'id' => $model->id]);
        } else {
            return $this->render('update', [
                'model' => $model,
            ]);
        }
    }

_form.php

$('#form').on('beforeSubmit', function(e) {
    if(old_B_attribute != current_B_attribute){ //example
        $('#modal').modal('show');
    }
});

3 个答案:

答案 0 :(得分:1)

要在提交表单之前提示用户是否实际更改了属性值。

我会怎么做

  • 在我的控制器actionAttributeDirty()中创建一个单独的动作,该动作将验证所选属性是否实际更改。
  • 然后,为表单使用普通的Html::button()而不是Html::submitButton()
  • 添加一个隐藏字段以保存表单中的当前记录id
  • click事件绑定到该按钮,该事件将使用当前记录的actionAttributeDirty()id发送ajax调用。
  • 然后使用成功功能显示模式窗口,并在5秒后使用setTimeout$.yiiActiveForm('submitForm')来触发表单提交。

所以按照上面给出的类似顺序,

actionAttributeDirty

public function actionAttributeDirty()
{
    Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
    $id = Yii::$app->request->post('id');
    $model = Faqs::findOne($id);
    $response = ['changed' => false];
    $isValidRequest = Yii::$app->request->isAjax && Yii::$app->request->isPost;

    if ($isValidRequest && $model->load(Yii::$app->request->post())) {
        //get the name of the fields from the dirty attributes
        $changedAttributes = array_keys($model->getDirtyAttributes());

        //if the attribute name exists in the dirty attributes
        if (!empty($changedAttributes) && in_array("b", $changedAttributes)) {
            $response['changed'] = true;
        }
    }
    return $response;
}

您的表单应具有以下按钮以及其他字段

$form = \yii\widgets\ActiveForm::begin(['id' => 'form']);
echo \yii\helpers\Html::hiddenInput('id', $model->id);
echo \yii\helper\Html::button('save', ['id' => 'save-now']);
\yii\widgets\ActiveForm::end();

click按钮事件

在具有表单的视图顶部添加以下内容。

注意:更改ajax调用url的{​​{1}}到复制'/site/attribute-dirty'的位置(假设您将其复制到站点控制器中)。 >

actionAttributeDirty()

编辑

Enter 按钮将不会提交表单,因为没有提交按钮。如果要 Enter 按钮提交表单,则应添加以下内容:脚本也位于视图顶部,每当在任何输入中按下 Enter 按钮都会触发$js = <<< JS $('#save-now').on('click', function(e) { e.preventDefault(); let form = $("#form"); $.ajax({ url:'/site/attribute-dirty', method:'post', data:form.serialize(), }).done(function(response){ if(response.changed){ $('#modal').modal('show'); setTimeout(function(){form.yiiActiveForm('submitForm');} , 5000); }else{ form.yiiActiveForm('submitForm'); } }).fail(function(response){ console.log(response.responseText); }); }); JS; $this->registerJs($js, \yii\web\View::POS_READY); 按钮的click事件。

save-now

答案 1 :(得分:0)

您的请求无法通过beforeSubmit在客户端完成。因为您必须在服务器端进行决定。

在客户端,您可以使用

$(document).on("beforeValidate", "form", function(event, messages, deferreds) {
//   #code
// console.log('BEFORE VALIDATE TEST');
}).on("afterValidate", "form", function(event, messages, errorAttributes) {
// console.log('AFTER VALIDATE TEST');
 //#code
});

然后确定规则方法。

在服务器端,您还可以决定以下事件:(针对您想要的) beforeValidate,afterValidate,beforeSave,afterSave,...

答案 2 :(得分:0)

如果要显示确认模式,请按以下方式使用。您可以在x秒后根据需要显示或隐藏提交进行更改

  $(function() {
    submitting = false;
  });

  $("form").on("beforeSubmit", function (event, messages, errorAttributes) {
    if (typeof(errorAttributes) === "undefined" || errorAttributes.length === 0) {
      $('#modal-confirm').modal('show');
      return submitting;
    }
  });

  var submit = function() {
    submitting = true;
    $("form").yiiActiveForm('submitForm');
  }

以模式提交

  <button type="button" onclick="submit();">Confirm</button>