jquery.yiiactiveform.js и двойной submit формы

Заметил, что у формы делается двойной submit (2 раза вызывается событие submit в javascript), что в моем случае влечет несколько неприятностей. А все дело в этом куске кода в jquery.yiiactiveform.js:




$form.submit(function () {			

	if (validated) {

		return true;

	}

	if (settings.timer !== undefined) {

		clearTimeout(settings.timer);

	}

	settings.submitting = true;

	if (settings.beforeValidate === undefined || settings.beforeValidate($form)) {

		$.fn.yiiactiveform.validate($form, function (data) {

			var hasError = false;

			$.each(settings.attributes, function () {

				hasError = $.fn.yiiactiveform.updateInput(this, data, $form) || hasError;

			});

			$.fn.yiiactiveform.updateSummary($form, data);

			if (settings.afterValidate === undefined || settings.afterValidate($form, data, hasError)) {

				if (!hasError) {

					validated = true;

					var $button = $form.data('submitObject') || $form.find(':submit:first');

					// TODO: if the submission is caused by "change" event, it will not work

					if ($button.length) {										

						$button.click();

					} else {  // no submit button in the form										

						$form.submit();

					}

					return;

				}

			}

			settings.submitting = false;

		});

	} else {

		settings.submitting = false;

	}

	return false;

});



А точнее:




if (!hasError) {

	validated = true;

	var $button = $form.data('submitObject') || $form.find(':submit:first');

	// TODO: if the submission is caused by "change" event, it will not work

	if ($button.length) {										

		$button.click();

	} else {  // no submit button in the form										

		$form.submit();

	}

	return;

}



Т.е. если ошибок в форме не обнаружено. вызывается повторный submit.

Что бы этого избежать, достаточно сделать несколько маленьких правок:




return $.fn.yiiactiveform.validate($form, function (data) {

	var hasError = false;

	$.each(settings.attributes, function () {

		hasError = $.fn.yiiactiveform.updateInput(this, data, $form) || hasError;

	});

	$.fn.yiiactiveform.updateSummary($form, data);

	if (settings.afterValidate === undefined || settings.afterValidate($form, data, hasError)) {

		if (!hasError) 

			return true;

	}

	settings.submitting = false;

});



дописываем функции $.fn.yiiactiveform.validate возврат (return) и в проверки на ошибки, вместо повторного submit делаем return true;

И все работает как надо. Зачем разработчики прибегли к двойному вызову submit мне не понятно.

Но вот вопрос. Можно ли просто внести эти правки в этом файле, ведь в папке assets у меня несколько копий данного файла и какой когда вызывается, тоже не понятно. Можно в layot’е указать:




<?php

$cs=Yii::app()->clientScript;

$cs->scriptMap = array(

		'jquery.yiiactiveform.js' => false

);

?>



Скопировать этот скрипт в папку /js и подключать в ручную.

Что скажите, как лучше поступить?

Не факт что сразу после валидации разработчик захочет отправить форму.

  1. Валидация может сработать на on-change и пользователь может ещё не хочет её отправлять на самом деле

  2. Может быть разработчику нужно отправить форму через ajax

думаю есть и другие причины.

Посмотрите на событие! это submit формы! А ajax, не ajax не имеет значение. У меня например через ajax форма отправляется.

Сори, разобрался. По тексту Вашего поста сразу не понятно о чем речь. Я подумал что речь идет о двух http запросах, а не двух javascript событиях. Напишите в bug tracker.

ну да… подправил, указал, что имеется введу событие submit в js

Все таки не с проста там написано именно так… Если внести мои правки, то ajax валидация всей формы при submit перестает работать…

Но как тогда поступить с двойным событием?

У меня просто весит обработчик формы sumbit. И он обрабатывается 2 раза, а мне этого не нужно…