You can use ColdBox's validation engine cbValidation and wire:model to validate your forms.
Installation
To install cbValidation, run the following command in CommandBox:
box install cbvalidation
Previous versions of CBWIRE included cbValidation automatically. However, this introduced issues if you wanted to use a version different from CBWIRE's.
Defining Constraints
You can define constraints within your components by populating a constraints struct. Once constraints are defined, CBWIRE will automatically validate your component on each request.
// ./wires/Form.cfccomponent extends="cbwire.models.Component" {// Data properties data = {"task":"" };// Validation constraints constraints = {"task": {"required":true,"requiredMessage":"Task is required" } };}
propertyName = {// The field under validation must be yes, on, 1, or true. This is useful for validating "Terms of Service" acceptance. accepted : any value// The field under validation must be a date after the set targetDate after : targetDate// The field under validation must be a date after or equal the set targetDate afterOrEqual : targetDate// The field must be alpha ONLY alpha : any value// The field under validation is an array and all items must pass this validation as well arrayItem : {// All the constraints to validate the items with }// The field under validation must be a date before the set targetDate before : targetDate// The field under validation must be a date before or equal the set targetDate beforeOrEqual : targetDate// The field under validation is a struct and all nested validation rules must pass constraints: {// All the constraints for the nested struct }// The field under validation must be a date that is equal the set targetDate dateEquals : targetDate// discrete math modifiers discrete : (gt,gte,lt,lte,eq,neq):value// the field must or must not be an empty value// needed because `required` counts empty strings as valid// and `type` ignores empty strings as "not required" empty : boolean [false]// value in list inList : list// Verify the instance of the target InstanceOf : "instance.path"// An alias for arrayItem items : {// All the constraints to validate the items with }// max value max : value// Validation method to use in the target object must return boolean accept the incoming value and target object method : methodName// min value min : value// An alias for constraints nestedConstraints: {// All the constraints for the nested struct }// not same as but with no case notSameAsNoCase : propertyName// not same as another property notSameAs : propertyName// range is a range of values the property value should exist in range : eg: 1..10 or 5..-5// regex validation regex : valid no case regex// required field or not, includes null values required : boolean [false]// The field under validation must be present and not empty if the `anotherfield` field is equal to the passed `value`. requiredIf : { anotherfield:value, anotherfield:value }// The field under validation must be present and not empty unless the `anotherfield` field is equal to the passed requiredUnless : { anotherfield:value, anotherfield:value }// same as but with no case sameAsNoCase : propertyName// same as another property sameAs : propertyName// size or length of the value which can be a (struct,string,array,query) size : numeric or range, eg:10 or 6..8// specific type constraint, one in the list. type : (alpha,array,binary,boolean,component,creditcard,date,email,eurodate,float,GUID,integer,ipaddress,json,numeric,query,ssn,string,struct,telephone,url,usdate,UUID,xml,zipcode),// UDF to use for validation, must return boolean accept the incoming value and target object, validate(value,target,metadata):boolean udf =variables.UDF or this.UDF or a closure.// Check if a column is unique in the database unique = { table : The table name, column : The column to check, defaults to the property field in check }// Custom validator, must implement coldbox.system.validation.validators.IValidator validator : path or wirebox id, example:'mypath.MyValidator' or 'id:MyValidator'}
Manual Validation
You can manually validate your component using the validate() or validateOrFail() methods.
validate
validate() returns a ValidateResult object
component extends="cbwire.models.Component" {// Data properties data = {"task":"" };// Validation constraints constraints = {"task": { "required":true,"requiredMessage":"Task is required" } };// ActionfunctionaddTask() {var result =validate(); // ValidateResult objectif ( !result.hasErrors() ) {// Do something } }}
validateOrFail
Silently fails and prevents further processing of the current action.
component extends="cbwire.models.Component" {// Data properties data = {"task":"" };// Validation constraints constraints = {"task": { "required":true,"requiredMessage":"Task is required" } };// ActionfunctionaddTask() {validateOrFail(); // fail silently if validation doesn't pass.// Otherwise, continue }}
With validateOrFail(), the error is gracefully caught and further processing of the action is prevented.
If you need more granular control over the response, use validate() instead.
Explicit Constraints
You can also run validations against any constraints you provide by passing them to the validate() method, which returns a ValidateResult object.
<cfscript> // Action function addTask() { var result = validate( target=data, constraints={ "task": { required: true } } ); if ( !result.hasErrors() ) { // Do something } }</cfscript><cfoutput> <div><!--- HTML goes here ---> </div></cfoutput>
Displaying Errors
In your templates, you have several helper methods for displaying errors.
You can use hasErrors() and getErrors() to check for validation errors that have occurred and to display all errors.