Skip to content

Commit

Permalink
#282: Use error message that is returned from remote/callback validator
Browse files Browse the repository at this point in the history
  • Loading branch information
nghuuphuoc committed May 22, 2014
1 parent 38c0c8f commit 891f85b
Show file tree
Hide file tree
Showing 8 changed files with 205 additions and 12 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
* [#211](https://github.com/nghuuphuoc/bootstrapvalidator/issues/211), [#235](https://github.com/nghuuphuoc/bootstrapvalidator/issues/235): Add new method ```getInvalidFields()``` that returns all invalid fields
* [#275](https://github.com/nghuuphuoc/bootstrapvalidator/issues/275): Add ```destroy()``` method
* [#274](https://github.com/nghuuphuoc/bootstrapvalidator/pull/274): Fix feedback icons in ```input-group```, thanks to [@tiagofontella](https://github.com/tiagofontella)
* [#282](https://github.com/nghuuphuoc/bootstrapvalidator/issues/282): Use error message that is returned from [```callback```](http://bootstrapvalidator.com/validators/callback/), [```remote```](http://bootstrapvalidator.com/validators/remote/) validators

## v0.4.5 (2015-05-15)

Expand Down
138 changes: 138 additions & 0 deletions demo/message.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
<!DOCTYPE html>
<html>
<head>
<title>BootstrapValidator demo</title>

<link rel="stylesheet" href="/vendor/bootstrap/css/bootstrap.css"/>
<link rel="stylesheet" href="/dist/css/bootstrapValidator.css"/>

<script type="text/javascript" src="/vendor/jquery/jquery-1.10.2.min.js"></script>
<script type="text/javascript" src="/vendor/bootstrap/js/bootstrap.min.js"></script>
<script type="text/javascript" src="/dist/js/bootstrapValidator.js"></script>
</head>
<body>
<div class="container">
<div class="row">
<div class="page-header">
<h1>Use error message that is returned from remote/callback validator</h1>
</div>

<div class="col-lg-8 col-lg-offset-2">
<form id="defaultForm" method="post" class="form-horizontal" action="target.php">
<div class="form-group">
<label class="col-lg-3 control-label">Username</label>
<div class="col-lg-5">
<input type="text" class="form-control" name="username" autocomplete="off" />
</div>
</div>

<div class="form-group">
<label class="col-lg-3 control-label">Email address</label>
<div class="col-lg-5">
<input type="text" class="form-control" name="email" autocomplete="off" />
</div>
</div>

<div class="form-group">
<label class="col-lg-3 control-label">Password</label>
<div class="col-lg-5">
<input type="password" class="form-control" name="password" />
</div>
</div>

<div class="form-group">
<div class="col-lg-9 col-lg-offset-3">
<button type="submit" class="btn btn-primary">Submit</button>
</div>
</div>
</form>
</div>
</div>

<script type="text/javascript">
$(document).ready(function() {
$('#defaultForm').bootstrapValidator({
message: 'This value is not valid',
feedbackIcons: {
valid: 'glyphicon glyphicon-ok',
invalid: 'glyphicon glyphicon-remove',
validating: 'glyphicon glyphicon-refresh'
},
fields: {
username: {
message: 'The username is not valid',
validators: {
notEmpty: {
message: 'The username is required and can\'t be empty'
},
remote: {
url: 'remote2.php'
},
different: {
field: 'password',
message: 'The username and password can\'t be the same as each other'
}
}
},
email: {
validators: {
notEmpty: {
message: 'The email address is required and can\'t be empty'
},
emailAddress: {
message: 'The input is not a valid email address'
},
remote: {
url: 'remote2.php'
}
}
},
password: {
validators: {
notEmpty: {
message: 'The password is required and can\'t be empty'
},
different: {
field: 'username',
message: 'The password can\'t be the same as username'
},
callback: {
callback: function(value, validator) {
// Check the password strength
if (value.length < 6) {
return {
valid: false,
message: 'The password must be more than 6 characters'
}
}

if (value === value.toLowerCase()) {
return {
valid: false,
message: 'The password must contain at least one upper case character'
}
}
if (value === value.toUpperCase()) {
return {
valid: false,
message: 'The password must contain at least one lower case character'
}
}
if (value.search(/[0-9]/) < 0) {
return {
valid: false,
message: 'The password must contain at least one digit'
}
}

return true;
}
}
}
}
}
});
});
</script>
</body>
</html>
34 changes: 34 additions & 0 deletions demo/remote2.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<?php
// This is a sample PHP script which demonstrates the 'remote' validator
// To make it work, point the web server to root Bootstrap Validate directory
// and open the remote.html file:
// http://domain.com/demo/remote.html

//sleep(5);

$valid = true;
$message = '';

$users = array(
'admin' => '[email protected]',
'administrator' => '[email protected]',
'root' => '[email protected]',
);

if (isset($_POST['username']) && array_key_exists($_POST['username'], $users)) {
$valid = false;
$message = 'The username is not available';
} else if (isset($_POST['email'])) {
$email = $_POST['email'];
foreach ($users as $k => $v) {
if ($email == $v) {
$valid = false;
$message = 'The email is not available';
break;
}
}
}

echo json_encode(
$valid ? array('valid' => $valid) : array('valid' => $valid, 'message' => $message)
);
20 changes: 15 additions & 5 deletions dist/js/bootstrapValidator.js
Original file line number Diff line number Diff line change
Expand Up @@ -680,14 +680,20 @@
$field.data('bv.result.' + validatorName, this.STATUS_VALIDATING);
validateResult = $.fn.bootstrapValidator.validators[validatorName].validate(this, $field, validators[validatorName]);

// validateResult can be a $.Deferred object ...
if ('object' == typeof validateResult) {
updateAll ? this.updateStatus(field, this.STATUS_VALIDATING, validatorName)
: this.updateElementStatus($field, this.STATUS_VALIDATING, validatorName);
$field.data('bv.dfs.' + validatorName, validateResult);

validateResult.done(function($f, v, isValid) {
validateResult.done(function($f, v, isValid, message) {
// v is validator name
$f.removeData('bv.dfs.' + v);
if (message) {
// Update the error message
$field.data('bv.messages').find('.help-block[data-bv-validator="' + v + '"][data-bv-for="' + $f.attr('data-bv-field') + '"]').html(message);
}

updateAll ? that.updateStatus($f.attr('data-bv-field'), isValid ? that.STATUS_VALID : that.STATUS_INVALID, v)
: that.updateElementStatus($f, isValid ? that.STATUS_VALID : that.STATUS_INVALID, v);

Expand All @@ -696,7 +702,9 @@
that._submit();
}
});
} else if ('boolean' == typeof validateResult) {
}
// ... or a boolean value
else if ('boolean' == typeof validateResult) {
updateAll ? this.updateStatus(field, validateResult ? this.STATUS_VALID : this.STATUS_INVALID, validatorName)
: this.updateElementStatus($field, validateResult ? this.STATUS_VALID : this.STATUS_INVALID, validatorName);
}
Expand Down Expand Up @@ -978,6 +986,7 @@
.get()
);
});

return messages;
},

Expand Down Expand Up @@ -1348,8 +1357,9 @@
validate: function(validator, $field, options) {
var value = $field.val();
if (options.callback && 'function' == typeof options.callback) {
var dfd = new $.Deferred();
dfd.resolve($field, 'callback', options.callback.call(this, value, validator));
var dfd = new $.Deferred(),
response = options.callback.call(this, value, validator);
dfd.resolve($field, 'callback', 'boolean' == typeof response ? response : response.valid, 'object' == typeof response && response.message ? response.message : null);
return dfd;
}
return true;
Expand Down Expand Up @@ -3566,7 +3576,7 @@
data: data
});
xhr.then(function(response) {
dfd.resolve($field, 'remote', response.valid === true || response.valid === 'true');
dfd.resolve($field, 'remote', response.valid === true || response.valid === 'true', response.message ? response.message : null);
});

dfd.fail(function() {
Expand Down
4 changes: 2 additions & 2 deletions dist/js/bootstrapValidator.min.js

Large diffs are not rendered by default.

13 changes: 11 additions & 2 deletions src/js/bootstrapValidator.js
Original file line number Diff line number Diff line change
Expand Up @@ -679,14 +679,20 @@
$field.data('bv.result.' + validatorName, this.STATUS_VALIDATING);
validateResult = $.fn.bootstrapValidator.validators[validatorName].validate(this, $field, validators[validatorName]);

// validateResult can be a $.Deferred object ...
if ('object' == typeof validateResult) {
updateAll ? this.updateStatus(field, this.STATUS_VALIDATING, validatorName)
: this.updateElementStatus($field, this.STATUS_VALIDATING, validatorName);
$field.data('bv.dfs.' + validatorName, validateResult);

validateResult.done(function($f, v, isValid) {
validateResult.done(function($f, v, isValid, message) {
// v is validator name
$f.removeData('bv.dfs.' + v);
if (message) {
// Update the error message
$field.data('bv.messages').find('.help-block[data-bv-validator="' + v + '"][data-bv-for="' + $f.attr('data-bv-field') + '"]').html(message);
}

updateAll ? that.updateStatus($f.attr('data-bv-field'), isValid ? that.STATUS_VALID : that.STATUS_INVALID, v)
: that.updateElementStatus($f, isValid ? that.STATUS_VALID : that.STATUS_INVALID, v);

Expand All @@ -695,7 +701,9 @@
that._submit();
}
});
} else if ('boolean' == typeof validateResult) {
}
// ... or a boolean value
else if ('boolean' == typeof validateResult) {
updateAll ? this.updateStatus(field, validateResult ? this.STATUS_VALID : this.STATUS_INVALID, validatorName)
: this.updateElementStatus($field, validateResult ? this.STATUS_VALID : this.STATUS_INVALID, validatorName);
}
Expand Down Expand Up @@ -977,6 +985,7 @@
.get()
);
});

return messages;
},

Expand Down
5 changes: 3 additions & 2 deletions src/js/validator/callback.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,9 @@
validate: function(validator, $field, options) {
var value = $field.val();
if (options.callback && 'function' == typeof options.callback) {
var dfd = new $.Deferred();
dfd.resolve($field, 'callback', options.callback.call(this, value, validator));
var dfd = new $.Deferred(),
response = options.callback.call(this, value, validator);
dfd.resolve($field, 'callback', 'boolean' == typeof response ? response : response.valid, 'object' == typeof response && response.message ? response.message : null);
return dfd;
}
return true;
Expand Down
2 changes: 1 addition & 1 deletion src/js/validator/remote.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@
data: data
});
xhr.then(function(response) {
dfd.resolve($field, 'remote', response.valid === true || response.valid === 'true');
dfd.resolve($field, 'remote', response.valid === true || response.valid === 'true', response.message ? response.message : null);
});

dfd.fail(function() {
Expand Down

0 comments on commit 891f85b

Please sign in to comment.