在操作更新时,如果“ 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');
}
});
答案 0 :(得分:1)
要在提交表单之前提示用户是否实际更改了属性值。
我会怎么做
actionAttributeDirty()
中创建一个单独的动作,该动作将验证所选属性是否实际更改。Html::button()
而不是Html::submitButton()
。id
。click
事件绑定到该按钮,该事件将使用当前记录的actionAttributeDirty()
向id
发送ajax调用。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>