Вы хотите подсказать пользователю, действительно ли значения атрибутов были изменены перед отправкой формы.
Как бы я пошел на это
- Создайте отдельное действие в моем контроллере
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
Событие для кнопки
Добавьте следующее в верхнюю часть представления, где у вас есть форма.
Примечание: измените 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 все равно не отправит форму, так как кнопки отправки нет. Если вы хотите, чтобы кнопка Enter отправила форму, вы должны добавить следующее вместе со сценарием также на верхняя часть представления, которая будет запускать событие click
кнопки save-now
всякий раз, когда кнопка Enter нажимается внутри любого ввода.
$("#form").on('keypress','input',function(e){
e.preventDefault();
if(e.keyCode===13){
$("#save-now").trigger('click');
}
});
person
Muhammad Omer Aslam
schedule
16.03.2019
$model->getDirtyAttributes()
, который фактически используется при сохранении или обновлении записи, чтобы определить, какие поля были фактически изменены. - person Muhammad Omer Aslam   schedule 15.03.2019OK
иCANCEL
в модальном окне, которые будут решать, что делать? вы должны добавить всю информацию в вопрос о том, когда следует отправлять форму, а когда нет? что должно произойти в случае, если значение не изменилось, что должно произойти при нажатии любой из кнопокOK
илиCANCEL
(если они есть) - person Muhammad Omer Aslam   schedule 16.03.2019OK
илиCANCEL
, только информация в течение 5 секунд, по истечении этого времени автоматически сохраняется, если поле b было действительно изменено, если не изменяется, сохраняется без модальных окон предупреждений. - person Moutinho   schedule 16.03.2019