This fairly simple yet handy CFC will validate forms (or whatever input really) for you and return a structure with the fields that didn't pass validation.
It will validate:
- null inputs for required fields
- numeric input
- email addresses
- phone numbers
- zip codes
- credit card numbers
To use you pass in the entire form and tell it what the field names are for the different types of fields. You can also specify and ignore list of field names for fields that are optional on your form.
Enjoy and feel free to modify it to suit your needs.
<cfcomponent>
<cffunction name="validateForm" access="public" returntype="struct">
<cfargument name="formInfo" type="struct" required="yes">
<cfargument name="ignore" type="string" required="no" default="0">
<cfargument name="emailfield" type="string" required="no" default="0">
<cfargument name="numberfield" type="string" required="no" default="0">
<cfargument name="zipcodefield" type="string" required="no" default="0">
<cfargument name="phoneNumberField" type="string" required="no" default="0">
<cfargument name="creditCardField" type="string" required="no" default="0">
<cfset var stError = structNew()>
<!--- <cfset stError.message = structNew()> --->
<cfif NOT structIsEmpty(formInfo)>
<!--- validate requierd fields ---->
<cfloop list="#arguments.forminfo.fieldnames#" index="f">
<cfif NOT listFindnoCase(arguments.ignore,f)>
<cfset curField = arguments.formInfo[f]>
<cfif curField EQ "">
<cfset stError[f] = 1>
</cfif>
<!--- validaet email fields --->
<cfif listFindnoCase(arguments.emailfield,f) AND len(curField)>
<cfif NOT listFindnoCase(arguments.ignore,f) AND NOT validateEmail(curField)>
<cfset stError[f] = 1>
</cfif>
</cfif>
<!--- validate numeric fields ---->
<cfif listFindnoCase(arguments.numberfield,f) AND len(curField)>
<cfif NOT listFindnoCase(arguments.ignore,f) AND NOT isNumeric(curField)>
<cfset stError[f] = 1>
</cfif>
</cfif>
<!--- validate zipcode fields ---->
<cfif listFindnoCase(arguments.zipcodefield,f) AND len(curField)>
<cfif NOT listFindnoCase(arguments.ignore,f) AND NOT validateZip(curField)>
<cfset stError[f] = 1>
</cfif>
</cfif>
<!--- validate telephone fields ---->
<cfif listFindnoCase(arguments.phoneNumberField,f) AND len(curField)>
<cfif NOT listFindnoCase(arguments.ignore,f) AND NOT validatePhone(curField)>
<cfset stError[f] = 1>
</cfif>
</cfif>
<!--- validate credit card number fields ---->
<cfif listFindnoCase(arguments.creditCardField,f) AND len(curField)>
<cfif NOT listFindnoCase(arguments.ignore,f) AND NOT validateCreditCard(curField)>
<cfset stError[f] = 1>
</cfif>
</cfif>
</cfif>
</cfloop>
<cfelse>
<cfset stError.emptyForm = 1>
</cfif>
<cfreturn stError>
</cffunction>
<cffunction name="validateEmail" access="public" returntype="boolean">
<cfargument name="email" type="string" required="yes">
<cfreturn isValid("email",arguments.email)>
</cffunction>
<cffunction name="validatePhone" access="public" returntype="boolean">
<cfargument name="phone" type="string" required="yes">
<cfreturn isValid("telephone",arguments.phone)>
</cffunction>
<cffunction name="validateZip" access="public" returntype="boolean">
<cfargument name="zip" type="string" required="yes">
<cfreturn isValid("zipcode",arguments.zip)>
</cffunction>
<cffunction name="validateCreditCard" access="public" returntype="boolean">
<cfargument name="creditCard" type="string" required="yes">
<cfreturn isValid("creditcard",arguments.creditCard)>
</cffunction>
</cfcomponent>