Вы хотите сообщить пользователю, действительно ли значения атрибута были изменены перед отправкой формы.
Как мне поступить для этого
- Создать отдельное действие в моем контроллере
actionAttributeDirty()
, которое будет проверяться, если выбранный атрибут был действительно изменен. - Тогда,используйте для формы обычный
Html::button()
вместо Html::submitButton()
. - Добавьте скрытое поле для хранения текущих записей
id
в форме. - Привязать событие
click
ккнопка, которая отправит вызов ajax на actionAttributeDirty()
с id
текущей записи. - Затем используйте функцию успеха, чтобы отобразить модальное окно, и используйте
setTimeout
с $.yiiActiveForm('submitForm')
, чтобы вызватьотправка формы через 5 секунд.
Таким образом, в порядке, указанном выше,
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
Событие для кнопки
Добавьте следующее в верхней части экрана, где у вас естьform.
Примечание: измените url
вызова ajax '/site/attribute-dirty'
соответственно, где вы копируетеactionAttributeDirty()
Я предполагаю, что вы скопируете его в контроллер сайта.
$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);
РЕДАКТИРОВАТЬ
Нажатие Ввод не будетотправить форму в любом случае, так как нет кнопки отправки. Если вы хотите кнопку Enter для отправки формы, вы должны добавить следующее вместе со сценарием в верхней части представления, который вызовет событие click
кнопки save-now
при каждом нажатии кнопки Enter на любом входе.
$("#form").on('keypress','input',function(e){
e.preventDefault();
if(e.keyCode===13){
$("#save-now").trigger('click');
}
});