Fixes #12080: Fixed afterValidate triggering when any validation occurs

This commit is contained in:
Ashton Schultz
2019-06-18 01:55:39 -07:00
committed by Alexander Makarov
parent 7832136107
commit 1f9131d841
3 changed files with 75 additions and 19 deletions

View File

@ -459,9 +459,9 @@
$errorElement = data.settings.validationStateOn === 'input' ? $input : $container;
$errorElement.removeClass(
data.settings.validatingCssClass + ' ' +
data.settings.errorCssClass + ' ' +
data.settings.successCssClass
data.settings.validatingCssClass + ' ' +
data.settings.errorCssClass + ' ' +
data.settings.successCssClass
);
$container.find(this.error).html('');
});
@ -705,19 +705,20 @@
return false;
}
var errorAttributes = [];
var $input = findInput($form, this);
$.each(data.attributes, function () {
var hasError = (submitting && updateInput($form, this, messages)) || (!submitting && attrHasError($form, this, messages));
if (!$input.is(":disabled") && !this.cancelled && hasError) {
errorAttributes.push(this);
}
});
$form.trigger(events.afterValidate, [messages, errorAttributes]);
if (submitting) {
var errorAttributes = [], $input;
$.each(data.attributes, function () {
$input = findInput($form, this);
if (!$input.is(":disabled") && !this.cancelled && updateInput($form, this, messages)) {
errorAttributes.push(this);
}
});
$form.trigger(events.afterValidate, [messages, errorAttributes]);
updateSummary($form, messages);
if (errorAttributes.length) {
if (data.settings.scrollToError) {
var top = $form.find($.map(errorAttributes, function(attribute) {
@ -787,7 +788,7 @@
var updateInput = function ($form, attribute, messages) {
var data = $form.data('yiiActiveForm'),
$input = findInput($form, attribute),
hasError = false;
hasError = attrHasError($form, attribute, messages);
if (!$.isArray(messages[attribute.id])) {
messages[attribute.id] = [];
@ -795,7 +796,6 @@
attribute.status = 1;
if ($input.length) {
hasError = messages[attribute.id].length > 0;
var $container = $form.find(attribute.container);
var $error = $container.find(attribute.error);
updateAriaInvalid($form, attribute, hasError);
@ -809,11 +809,11 @@
$error.html(messages[attribute.id][0]);
}
$errorElement.removeClass(data.settings.validatingCssClass + ' ' + data.settings.successCssClass)
.addClass(data.settings.errorCssClass);
.addClass(data.settings.errorCssClass);
} else {
$error.empty();
$errorElement.removeClass(data.settings.validatingCssClass + ' ' + data.settings.errorCssClass + ' ')
.addClass(data.settings.successCssClass);
.addClass(data.settings.successCssClass);
}
attribute.value = getValue($form, attribute);
}
@ -823,6 +823,28 @@
return hasError;
};
/**
* Checks if a particular attribute has an error
* @param $form the form jQuery object
* @param attribute object the configuration for a particular attribute.
* @param messages array the validation error messages
* @return boolean whether there is a validation error for the specified attribute
*/
var attrHasError = function ($form, attribute, messages) {
var $input = findInput($form, attribute),
hasError = false;
if (!$.isArray(messages[attribute.id])) {
messages[attribute.id] = [];
}
if ($input.length) {
hasError = messages[attribute.id].length > 0;
}
return hasError;
};
/**
* Updates the error summary.
* @param $form the form jQuery object