Заметил, что у формы делается двойной 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 и подключать в ручную.
Что скажите, как лучше поступить?