Почему в Yii2 событие submit у формы происходит дважды?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Почему в Yii2 событие submit у формы происходит дважды?

Сообщение zelenin » 2016.09.05, 14:36

jekahm писал(а):Благодарю ;) Теперь пришло четкое осознание того, что многие вещи не могут быть реализованы и достигнуты только за счет client-side технологий.
server-side может быть?

jekahm
Сообщения: 30
Зарегистрирован: 2016.01.04, 10:22

Re: Почему в Yii2 событие submit у формы происходит дважды?

Сообщение jekahm » 2016.09.05, 14:38

zelenin писал(а):
jekahm писал(а):Благодарю ;) Теперь пришло четкое осознание того, что многие вещи не могут быть реализованы и достигнуты только за счет client-side технологий.
server-side может быть?
Написал, что "НЕ могут быть достигнуты" :)

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Почему в Yii2 событие submit у формы происходит дважды?

Сообщение zelenin » 2016.09.05, 14:47

jekahm писал(а):
zelenin писал(а):
jekahm писал(а):Благодарю ;) Теперь пришло четкое осознание того, что многие вещи не могут быть реализованы и достигнуты только за счет client-side технологий.
server-side может быть?
Написал, что "НЕ могут быть достигнуты" :)
а, ок.

Аватара пользователя
Haku
Сообщения: 56
Зарегистрирован: 2015.03.11, 07:39

Re: Почему в Yii2 событие submit у формы происходит дважды?

Сообщение Haku » 2018.08.31, 15:47

Сейчас делаю отправку данных из "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-скрипт. Подскажите, пожалуйста, как сделать правильно, чтобы добавление/редактирование происходило один раз.

tweet9ra
Сообщения: 1
Зарегистрирован: 2019.01.13, 15:55

Re: Почему в Yii2 событие submit у формы происходит дважды?

Сообщение tweet9ra » 2019.01.13, 16:06

Haku писал(а):
2018.08.31, 15:47
Сейчас делаю отправку данных из "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-скрипт. Подскажите, пожалуйста, как сделать правильно, чтобы добавление/редактирование происходило один раз.
Мне помог данный способ:
вместо

Код: Выделить всё

 form.on('submit', function(e){}) 
использовать

Код: Выделить всё

 
 form.on('beforeValidate', function(){
 	return false; // Если вернуть false, то форма не будет отправлена
 }) 
 

Ответить