Commit 594b5783 by Alex-Code Committed by Carsten Brandt

Added validation js callbacks

- `beforeValidateAll` - `afterValidateAll` fixes #4234, close #4559
parent e5b2fb24
...@@ -168,6 +168,7 @@ Yii Framework 2 Change Log ...@@ -168,6 +168,7 @@ Yii Framework 2 Change Log
- Enh #4436: Added callback functions to AJAX-based form validation (thiagotalma) - Enh #4436: Added callback functions to AJAX-based form validation (thiagotalma)
- Enh #4485: Added support for deferred validation in `ActiveForm` (Alex-Code) - Enh #4485: Added support for deferred validation in `ActiveForm` (Alex-Code)
- Enh #4520: Added sasl support to `yii\caching\MemCache` (xjflyttp) - Enh #4520: Added sasl support to `yii\caching\MemCache` (xjflyttp)
- Enh #4559: Added `beforeValidateAll` and `afterValidateAll` callbacks to `ActiveForm` (Alex-Code)
- Enh #4566: Added client validation support for image validator (Skysplit, qiangxue) - Enh #4566: Added client validation support for image validator (Skysplit, qiangxue)
- Enh #4581: Added ability to disable url encoding in `UrlRule` (tadaszelvys) - Enh #4581: Added ability to disable url encoding in `UrlRule` (tadaszelvys)
- Enh: Added support for using sub-queries when building a DB query with `IN` condition (qiangxue) - Enh: Added support for using sub-queries when building a DB query with `IN` condition (qiangxue)
......
...@@ -41,9 +41,15 @@ ...@@ -41,9 +41,15 @@
// a callback that is called before validating each attribute. The signature of the callback should be: // a callback that is called before validating each attribute. The signature of the callback should be:
// function ($form, attribute, messages) { ...return false to cancel the validation...} // function ($form, attribute, messages) { ...return false to cancel the validation...}
beforeValidate: undefined, beforeValidate: undefined,
// a callback that is called before validation starts (This callback is only called when the form is submitted). This signature of the callback should be:
// function($form, data) { ...return false to cancel the validation...}
beforeValidateAll: undefined,
// a callback that is called after an attribute is validated. The signature of the callback should be: // a callback that is called after an attribute is validated. The signature of the callback should be:
// function ($form, attribute, messages) // function ($form, attribute, messages)
afterValidate: undefined, afterValidate: undefined,
// a callback that is called after all validation has run (This callback is only called when the form is submitted). The signature of the callback should be:
// function ($form, data, messages)
afterValidateAll: undefined,
// a pre-request callback function on AJAX-based validation. The signature of the callback should be: // a pre-request callback function on AJAX-based validation. The signature of the callback should be:
// function ($form, jqXHR, textStatus) // function ($form, jqXHR, textStatus)
ajaxBeforeSend: undefined, ajaxBeforeSend: undefined,
...@@ -152,6 +158,11 @@ ...@@ -152,6 +158,11 @@
clearTimeout(data.settings.timer); clearTimeout(data.settings.timer);
} }
data.submitting = true; data.submitting = true;
if (data.settings.beforeValidateAll && !data.settings.beforeValidateAll($form, data)) {
data.submitting = false;
return false;
}
validate($form, function (messages) { validate($form, function (messages) {
var errors = []; var errors = [];
$.each(data.attributes, function () { $.each(data.attributes, function () {
...@@ -159,6 +170,11 @@ ...@@ -159,6 +170,11 @@
errors.push(this.input); errors.push(this.input);
} }
}); });
if (data.settings.afterValidateAll) {
data.settings.afterValidateAll($form, data, messages);
}
updateSummary($form, messages); updateSummary($form, messages);
if (errors.length) { if (errors.length) {
var top = $form.find(errors.join(',')).first().offset().top; var top = $form.find(errors.join(',')).first().offset().top;
......
...@@ -142,6 +142,17 @@ class ActiveForm extends Widget ...@@ -142,6 +142,17 @@ class ActiveForm extends Widget
*/ */
public $beforeValidate; public $beforeValidate;
/** /**
* @var string|JsExpression a JS callback that is called before any validation has run (Only called when the form is submitted).
* The signature of the callback should be:
*
* ~~~
* function ($form, data) {
* ...return false to cancel the validation...
* }
* ~~~
*/
public $beforeValidateAll;
/**
* @var string|JsExpression a JS callback that is called after validating an attribute. * @var string|JsExpression a JS callback that is called after validating an attribute.
* The signature of the callback should be: * The signature of the callback should be:
* *
...@@ -152,6 +163,16 @@ class ActiveForm extends Widget ...@@ -152,6 +163,16 @@ class ActiveForm extends Widget
*/ */
public $afterValidate; public $afterValidate;
/** /**
* @var string|JsExpression a JS callback that is called after all validation has run (Only called when the form is submitted).
* The signature of the callback should be:
*
* ~~~
* function ($form, data, messages) {
* }
* ~~~
*/
public $afterValidateAll;
/**
* @var string|JsExpression a JS pre-request callback function on AJAX-based validation. * @var string|JsExpression a JS pre-request callback function on AJAX-based validation.
* The signature of the callback should be: * The signature of the callback should be:
* *
...@@ -229,7 +250,7 @@ class ActiveForm extends Widget ...@@ -229,7 +250,7 @@ class ActiveForm extends Widget
if ($this->validationUrl !== null) { if ($this->validationUrl !== null) {
$options['validationUrl'] = Url::to($this->validationUrl); $options['validationUrl'] = Url::to($this->validationUrl);
} }
foreach (['beforeSubmit', 'beforeValidate', 'afterValidate', 'ajaxBeforeSend', 'ajaxComplete'] as $name) { foreach (['beforeSubmit', 'beforeValidate', 'beforeValidateAll', 'afterValidate', 'afterValidateAll', 'ajaxBeforeSend', 'ajaxComplete'] as $name) {
if (($value = $this->$name) !== null) { if (($value = $this->$name) !== null) {
$options[$name] = $value instanceof JsExpression ? $value : new JsExpression($value); $options[$name] = $value instanceof JsExpression ? $value : new JsExpression($value);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment