This add-on adds and validates Google reCAPTCHA v2 element.
If you still want to use Google reCAPTCHA v1, you can use the
recaptcha1 add-on
Follow these steps to use this add-on:
Registering keys You need to register a site and secret keys at https://www.google.com/recaptcha/admin .
reCaptcha requires more steps to display the captcha which are
Insert the Google reCaptcha API script to the page Add data-sitekey
attribute to the element You DO NOT have to do these steps because they are done automatically by the add-on.
<!-- DO NOT need to add to your page -->
< script src = "https://www.google.com/recaptcha/api.js" async defer ></ script >
< div id = "captchaContainer" data-sitekey = "..." ></ div >
In short, all you need are the site and secret keys provided by reCaptcha.
Including the add-on Download reCaptcha2 add-on Include reCaptcha2.min.js
(located in the dist
directory) to your page. Ensure that it's placed after formValidation(.min).js
<!-- FormValidation plugin -->
< script src = "/vendor/formvalidation/dist/js/formValidation.min.js" ></ script >
<!-- Add-ons. You should place it inside /vendor/formvalidation/dist/js/addons directory -->
< script src = "/vendor/formvalidation/dist/js/addons/reCaptcha2.min.js" ></ script >
Calling the add-on It's possible to call the add-on in both programmatic and declarative ways:
$ ( '#signUpForm' ). formValidation ({
framework : '...' ,
icon : {
...
},
addOns : {
reCaptcha2 : {
element : 'captchaContainer' ,
language : 'en' ,
theme : 'light' ,
siteKey : '6LdgOwETAAAAALA9auuNVKFeXizXcYFrKOVC_vs-' ,
timeout : 120 ,
message : 'The captcha is not valid'
}
},
fields : {
...
}
});
If you want to use multiple add-ons, just simply separate them by a comma in data-fv-addons attribute:
data-fv-addons="i18n, mandatoryIcon, recaptcha2"
< form id = "signUpForm" method = "post" class = "form-horizontal"
data-fv-addons = "reCaptcha2"
data-fv-addons-recaptcha2-element = "captchaContainer"
data-fv-addons-recaptcha2-language = "en"
data-fv-addons-recaptcha2-theme = "light"
data-fv-addons-recaptcha2-sitekey = "6LdgOwETAAAAALA9auuNVKFeXizXcYFrKOVC_vs-"
data-fv-addons-recaptcha2-timeout = "120"
data-fv-addons-recaptcha2-message = "The captcha is not valid" >
...
</ form >
The reCaptcha2 add-on provides the following options:
* — Required option
Option HTML attribute Type Description element
* data-fv-addons-recaptcha2-element
String
The ID of element showing the captcha language
data-fv-addons-recaptcha2-language
String
The language code defined by reCAPTCHA message
* data-fv-addons-recaptcha2-message
String
The error message that will be shown in case the captcha is not valid. You don't need to define it if the back-end URL above returns the message siteKey
* data-fv-addons-recaptcha2-sitekey
String
The site key provided by Google sToken
data-fv-addons-recaptcha2-stoken
String
The secure token theme
data-fv-addons-recaptcha2-theme
String
The theme name provided by Google. It can be one of
timeout
data-fv-addons-recaptcha2-timeout
Number
The number of seconds that session will expire. After this amount of time, you will be asked to enter a new captcha. The default value is 120 (2 minutes)
API Following is the list of methods provided directly by FormValidation.AddOn.reCaptcha2
:
reset reset(element* )
— Reset the captcha element. It reset the checkbox captcha element and generate a new captcha.
* — Required option
Parameter Type Description element
* String The ID of element showing the captcha
FormValidation . AddOn . reCaptcha2 . reset ( 'captchaContainer' );
This method doesn't remove the feedback icon and validation messages of captcha. To do that, you need to call the resetForm() or resetField() method.
// Reset entire form
$ ( yourForm ). formValidation ( 'resetForm' , true );
// Or just reset the captcha field
$ ( yourForm ). formValidation ( 'resetField' , 'g-recaptcha-response' , true );
See the Resetting the captcha for a simple usage.
Example Below is the piece of code showing programmatic and declarative usages:
<!-- Include FormValidation files first -->
<!-- Then include reCaptcha2 add-on -->
< script src = "/vendor/formvalidation/js/addons/reCaptcha2.min.js" ></ script >
< form id = "signUpForm" method = "post" class = "form-horizontal" >
< div class = "form-group" >
< label class = "col-xs-3 control-label" > Username</ label >
< div class = "col-xs-6" >
< input type = "text" class = "form-control" name = "username" />
</ div >
</ div >
< div class = "form-group" >
< label class = "col-xs-3 control-label" > Email address</ label >
< div class = "col-xs-6" >
< input type = "text" class = "form-control" name = "email" />
</ div >
</ div >
< div class = "form-group" >
< label class = "col-xs-3 control-label" > Password</ label >
< div class = "col-xs-6" >
< input type = "password" class = "form-control" name = "password" />
</ div >
</ div >
< div class = "form-group" >
< label class = "col-xs-3 control-label" > Captcha</ label >
< div class = "col-xs-8" >
<!-- The captcha container -->
< div id = "captchaContainer" ></ div >
</ div >
</ div >
< div class = "form-group" >
< div class = "col-xs-5 col-xs-offset-3" >
< button type = "submit" class = "btn btn-primary" > Submit</ button >
< button type = "button" class = "btn btn-default" id = "resetButton" > Reset</ button >
</ div >
</ div >
</ form >
< script type = "text/javascript" >
$ ( document ). ready ( function () {
$ ( '#signUpForm' ). formValidation ({
framework : 'bootstrap' ,
icon : {
valid : 'glyphicon glyphicon-ok' ,
invalid : 'glyphicon glyphicon-remove' ,
validating : 'glyphicon glyphicon-refresh'
},
addOns : {
reCaptcha2 : {
element : 'captchaContainer' ,
theme : 'light' ,
siteKey : '6LdgOwETAAAAALA9auuNVKFeXizXcYFrKOVC_vs-' ,
timeout : 120 ,
message : 'The captcha is not valid'
}
},
fields : {
username : {
validators : {
notEmpty : {
message : 'The username is required'
},
stringLength : {
min : 6 ,
max : 30 ,
message : 'The username must be more than 6 and less than 30 characters long'
},
regexp : {
regexp : /^[a-zA-Z0-9_\.]+$/ ,
message : 'The username can only consist of alphabetical, number, dot and underscore'
}
}
},
email : {
validators : {
notEmpty : {
message : 'The email address is required'
},
emailAddress : {
message : 'The input is not a valid email address'
}
}
},
password : {
validators : {
notEmpty : {
message : 'The password is required'
},
different : {
field : 'username' ,
message : 'The password cannot be the same as username'
}
}
}
}
});
$ ( '#resetButton' ). on ( 'click' , function () {
// Reset the recaptcha
FormValidation . AddOn . reCaptcha2 . reset ( 'captchaContainer' );
// Reset form
$ ( '#signUpForm' ). formValidation ( 'resetForm' , true );
});
});
</ script >
<!-- FormValidation plugin and the class supports validating Bootstrap form -->
< script src = "/vendor/formvalidation/dist/js/formValidation.min.js" ></ script >
< script src = "/vendor/formvalidation/dist/js/framework/bootstrap.min.js" ></ script >
<!-- reCaptcha2 add-on -->
< script src = "/vendor/formvalidation/dist/js/addons/reCaptcha2.min.js" ></ script >
< form id = "signUpForm" method = "post" class = "form-horizontal"
data-fv-addons = "reCaptcha2"
data-fv-addons-recaptcha2-element = "captchaContainer"
data-fv-addons-recaptcha2-theme = "light"
data-fv-addons-recaptcha2-timeout = "120"
data-fv-addons-recaptcha2-sitekey = "6LdgOwETAAAAALA9auuNVKFeXizXcYFrKOVC_vs-"
data-fv-addons-recaptcha2-message = "The captcha is not valid"
data-fv-framework = "bootstrap"
data-fv-icon-valid = "glyphicon glyphicon-ok"
data-fv-icon-invalid = "glyphicon glyphicon-remove"
data-fv-icon-validating = "glyphicon glyphicon-refresh" >
< div class = "form-group" >
< label class = "col-xs-3 control-label" > Username</ label >
< div class = "col-xs-6" >
< input type = "text" class = "form-control" name = "username"
data-fv-notempty = "true"
data-fv-notempty-message = "The username is required"
data-fv-stringlength = "true"
data-fv-stringlength-min = "6"
data-fv-stringlength-max = "30"
data-fv-stringlength-message = "The username must be more than 6 and less than 30 characters long"
data-fv-regexp = "true"
data-fv-regexp-regexp = "^[a-zA-Z0-9_\.]+$"
data-fv-regexp-message = "The username can only consist of alphabetical, number, dot and underscore" />
</ div >
</ div >
< div class = "form-group" >
< label class = "col-xs-3 control-label" > Email address</ label >
< div class = "col-xs-6" >
< input type = "text" class = "form-control" name = "email"
data-fv-notempty = "true"
data-fv-notempty-message = "The email address is required"
data-fv-emailaddress = "true"
data-fv-emailaddress-message = "The input is not a valid email address" />
</ div >
</ div >
< div class = "form-group" >
< label class = "col-xs-3 control-label" > Password</ label >
< div class = "col-xs-6" >
< input type = "password" class = "form-control" name = "password"
data-fv-notempty = "true"
data-fv-notempty-message = "The password is required"
data-fv-different = "true"
data-fv-different-field = "username"
data-fv-different-message = "The password cannot be the same as username" />
</ div >
</ div >
< div class = "form-group" >
< label class = "col-xs-3 control-label" > Captcha</ label >
< div class = "col-xs-8" >
<!-- The captcha container -->
< div id = "captchaContainer" ></ div >
</ div >
</ div >
< div class = "form-group" >
< div class = "col-xs-5 col-xs-offset-3" >
< button type = "submit" class = "btn btn-primary" > Submit</ button >
< button type = "button" class = "btn btn-default" id = "resetButton" > Reset</ button >
</ div >
</ div >
</ form >
< script type = "text/javascript" >
$ ( document ). ready ( function () {
$ ( '#signUpForm' ). formValidation ();
$ ( '#resetButton' ). on ( 'click' , function () {
// Reset the recaptcha
FormValidation . AddOn . reCaptcha2 . reset ( 'captchaContainer' );
// Reset form
$ ( '#signUpForm' ). formValidation ( 'resetForm' , true );
});
});
</ script >
Showing message in a custom area It's possible to place error message of the captcha in a custom area by using the err option.
Behind the scenes, the captcha field's name generated by Google reCaptcha is g-recaptcha-response
, so we can apply the err
option for this field as usual:
< form id = "signUpForm" method = "post" class = "form-horizontal" >
< div class = "form-group" >
< label class = "col-xs-3 control-label" > Captcha</ label >
< div class = "col-xs-8" >
<!-- The captcha container -->
< div id = "captchaContainer" ></ div >
</ div >
</ div >
< div class = "form-group" >
<!-- The message container for captcha -->
< div class = "col-xs-8 col-xs-offset-3" id = "captchaMessage" >
</ div >
</ div >
</ form >
< script >
$ ( document ). ready ( function () {
$ ( '#signUpForm' ). formValidation ({
...
addOns : {
reCaptcha2 : {
element : 'captchaContainer' ,
theme : 'light' ,
siteKey : '6LdgOwETAAAAALA9auuNVKFeXizXcYFrKOVC_vs-' ,
timeout : 120 ,
message : 'The captcha is not valid'
}
},
fields : {
...
'g-recaptcha-response' : {
err : '#captchaMessage'
}
}
});
});
</ script >
Don't forget to wrap the captcha field's name (g-recaptcha-response) between single or double quote. See the
Validating field with special name example for more use cases.
Resetting the captcha If you want to reset the entire form including the feedback icon and messages, calling resetForm() doesn't enough.
In addition to that, we also need to call the reset() method:
$ ( '#resetButton' ). on ( 'click' , function () {
// Reset the recaptcha
FormValidation . AddOn . reCaptcha2 . reset ( 'captchaContainer' );
// Reset form
$ ( '#signUpForm' ). formValidation ( 'resetForm' , true );
});
Click the Reset button in the example above to see how it works.
Change log v0.4.0: Add reset()
method to reset the captcha element v0.3.1: Add sToken
option v0.3.0:
Support multiple reCAPTCHA v2 elements on the same page Add Grunt build and minified files v0.2.0: Add localization support v0.1.0: First release