Client-side form validation

From Joomla! Documentation

Revision as of 08:04, 19 September 2010 by Batch1211 (talk | contribs)
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Introduction[edit]

Joomla 1.5 contains a behavior JHTMLBehavior::formvalidation() which enables the script validate.js. It uses mootools and allows your form and its elements to be validated.

Note: For more recent versions of Joomla (1.5.2) use JHTML::_('behavior.formvalidation') instead of JHTMLBehavior::formvalidation()

Enable the Validation[edit]

The only thing you have to do is set the classes of the form and elements to the specified meanings. Classes:

Form[edit]

  • form-validate -> enable validation

Form elements[edit]

  • required
  • validate-username
  • validate-password
  • validate-numeric
  • validate-email
  • validate-[custom] -> custom handlers have to be set then!

Style Invalid Elements[edit]

If some elements don't validate they will get the class

  • invalid

If you style the class in the cascading style sheet, your users will be able to see which fields are wrong. For instance:

.invalid {color:red;}

Only Accept the Form After Validation[edit]

If you don't want the form to submit anything unless the values are validated, here's a nice script:

<?php JHTMLBehavior::formvalidation(); ?>
<script language="javascript">
function myValidate(f) {
   if (document.formvalidator.isValid(f)) {
      f.check.value='<?php echo JUtility::getToken(); ?>'; //send token
      return true; 
   }
   else {
      var msg = 'Some values are not acceptable.  Please retry.';

      //Example on how to test specific fields
      if($('email').hasClass('invalid')){msg += '\n\n\t* Invalid E-Mail Address';}

      alert(msg);
   }
   return false;
}
</script>
<form id="WV-form" method="post" class="form-validate" onSubmit="return myValidate(this);">
<input type="hidden" name="check" value="post"/>
...
<input type="text" name="email" id="email" size="30"  class="required validate-email"/>
...
<input type="submit" value="Submit" />
</form>

The page that receives the value can check several things:

defined( '_JEXEC' ) or die( 'Restricted access' );  //Verify Joomla enabled
$jAp=& JFactory::getApplication();
if ($_POST['check']!=JUtility::getToken()) {
   // First verify (by a Javascript error or other methods) that the form has not been submitted without the validation
   if ($_POST['check']=='post')	$jAp->enqueueMessage('Please check all the fields of the form, aub.<br/>
If your browser blocks Javascript, then this form will never be successful. This is a security measure.','error');
   // If the check still isn't a valid token, do nothing. This might be a spoof attack or other invalid form submission
   return false;
}

Custom Handlers[edit]

If you want a custom handler, you can add one to the class, as in the following example (defined AFTER the validate.js):

Window.onDomReady(function() {
   document.formvalidator.setHandler('birth', function(value) {
      regex=/^\d{4}(-\d{2}){2}$/;
      return regex.test(value);
   })
})

You can then set any class to validate-birth to make it validate as yyyy-mm-dd. (Valid date is not checked!)