Сейчас делаю отправку данных из "Active Form" с помощью Ajax-запроса и столкнулся с такой же проблемой, но не понял как её решить.
Есть совершенно стандартная форма:
Код: Выделить всё
<?php $form = ActiveForm::begin(['id' => 'user-form']); ?>
<?= $form->field($model, 'name') ?>
//...
<div class="form-group">
<?= Html::submitButton('Сохранить', ['class' => 'button', 'name' => 'update-button']) ?>
</div>
<?php ActiveForm::end(); ?>
На которую я повесил обработчик:
Код: Выделить всё
var form = $('#user-form');
form.on('submit', function(event) {
event.preventDefault();
var url = '/main/controller/action';
var data = form.serialize();
$.ajax({
//...
});
});
При первом нажатии на "Submit" происходит два одинаковых post-запроса, за исключением того, что во втором запросе к передаваемым данным добавляется "
update-button". При последующих нажатиях отправляется один запрос.
Посмотрев в отладчике работу внутреннего скрипта "yii.activeForm.js", понял почему так происходит:
1. В "
submitForm: function() {}" не срабатывает условие "if (
data.
validated) {}".
2. Отправляется первый запрос.
3. Условие "if (
data.
validated) {}" срабатывает, в форму добавляется <input type="hidden" name="
update-button">.
4. Отправляется второй запрос.
Проблема в том, что в первый раз в БД создастся две одинаковых записи, но этого делать не нужно. Я понимаю, что это связано с валидацией данных, но, то ли я не до конца понимаю работу Active Form, то ли у меня неправильно работает js-скрипт. Подскажите, пожалуйста, как сделать правильно, чтобы добавление/редактирование происходило один раз.