File: Validator.php

Recommend this page to a friend!
  Classes of Brett Dutton  >  Validator  >  Validator.php  >  Download  
File: Validator.php
Role: Class source
Content type: text/plain
Description: Main Class
Class: Validator
Extensible Dynamic Javascript Validator
Author: By
Last change: Added a check to make sure the form variable exists. This will ensure that if you give it an invalid form variable name to check, it will not crash the JavaScript. Also a debug mode to throw an alert if a non existant form variable is added.
Date: 18 years ago
Size: 10,972 bytes
 

Contents

Class file image Download
<?
/*** Revision History
 ** --------------------------------------------
 ** 19-Aug-2002 Added a check to check if the form variable exists
 ** This will ensure that if you give it an invalid form variable name
 ** to check it will not crash the JavaScript. Thanks to Chris Fortune
 ** at cfortune@telus.net for the idea
 **/


/** This class dynamically creates validation javascript
 ** Currently it is only generating limited comparisons.
 ** I did not want to <b>clutter</b> up the code with
 ** unnecessary test cases when I did not use them
 ** within my system
 ** 
 ** The system is fairly easy to understand and fairly
 ** easy to extend. Just the sort of thing that everyone
 ** has been looking for in a validator :-)
 **
 ** @author Brett Dutton - bdutton@radntech.com
 ** @version 1.1 - 19-Aug-2002
 **/ 
class Validator {
    
    /** Name of the form in this document
     ** @type String 
     ** @private 
     ** @author Brett Dutton - bdutton@radntech.com
     **/ 
    var $formName;
    
    /** An array of all the form variables that will be tested
     ** @see $add
     ** @type array
     ** @private 
     ** @author Brett Dutton - bdutton@radntech.com
     **/ 
    var $testCases = array ();

    /** List of used functions. This is used so we
     ** do not generate javascript that we don't need
     ** @type array
     ** @private 
     ** @author Brett Dutton - bdutton@radntech.com
     **/ 
    var $usedFunct = array ();

    /** 
     ** do not generate javascript that we don't need
     ** @type array
     ** @private 
     ** @author Brett Dutton - bdutton@radntech.com
     **/ 
    var $alertOnMissingFormVar;

    /** Constructor
     ** @returns void
     ** @public
     ** @param $f The name of the form that will be validated 
     ** @author Brett Dutton - bdutton@radntech.com
     **/ 
    function Validator ( $f ) {
        $this->formName = $f;
        $this->alertOnMissingFormVar = FALSE;
    }

    /** Sets the variable alertOnMissingFormVar. This variable controlles
     ** is there is a message displayed if the javascript is given an
     ** invalid form variable name to test
     ** @returns void
     ** @public
     ** @param $state The state of this variable
     ** @author Brett Dutton - bdutton@radntech.com
     **/ 
    function setMissingAlert ( $state ) { $this->alertOnMissingFormVar = $state; }
    
    /** Add a test for this form variable. Tests for Existance
     ** @returns void
     ** @public
     ** @param $fv Form Variable name
     ** @param $desc A message if the test fails
     ** @author Brett Dutton - bdutton@radntech.com
     **/ 
    function addExists ( $fv, $desc ) { $this->add ( $fv, $desc,  "EXISTS" ); }
    
    /** Add a test for this form variable. Tests for valid email
     ** Note that empty is valid. That means that you must check for
     ** Existance as well as email.
     ** @returns void
     ** @public
     ** @param $fv The form variable name to test
     ** @author Brett Dutton - bdutton@radntech.com
     **/ 
    function addEmail  ( $fv ) { $this->add ( $fv, "", "EMAIL"  ); }

    /** Add a test for this form variable. Tests for 2 form variables
     ** are equal. This is partucually useful for passwords
     ** @returns void
     ** @public
     ** @param $fv1 First form variable to check
     ** @param $fv2 Other form variable to test againse
     ** @param $desc Message if the variables are not the same
     ** @author Brett Dutton - bdutton@radntech.com
     **/ 
    function addEqual  ( $fv1, $fv2, $desc ) { $this->add ( $fv1, $desc, "EQUAL", $fv2 ); }
    
    /** Add a test for this form variable. Tests if a form variable
     ** is empty. If it is then it copies the value from $fv1 into $fv2
     ** This would be useful for say prefered name
     ** @returns void
     ** @public
     ** @param $fv1 Source Form Variable
     ** @param $fv2 Destination Form Variable
     ** @author Brett Dutton - bdutton@radntech.com
     **/ 
    function addCopy   ( $fv1, $fv2 ) { $this->add ( $fv1, "", "COPY", $fv2 ); }
    
    /** Generic function for adding tests
     ** @returns void
     ** @private
     ** @param $fv Form Variable
     ** @param $desc Description for this test
     ** @param $t Test type
     ** @param $xtra Extra information
     ** @author Brett Dutton - bdutton@radntech.com
     **/ 
    function add ( $fv, $desc, $t, $xtra=NULL ) {
        $this->testCases[] = array ( "NAME" => $fv,
                                     "DESC" => $desc,
                                     "TEST" => $t,
                                     "XTRA" => $xtra );
        $this->usedFunct[$t] = "YES";
    }

    /** Generates HTML and Javascript to do the tests on this form
     ** @returns String
     ** @public
     ** @author Brett Dutton - bdutton@radntech.com
     **/ 
    function toHtml () {
        $msg = "";

        // The first stage is to figure out what is being validated and
        // to only include what you want
        $msg .= ( "function isEmpty(s) { return ((s == null) || (s.length == 0)); }\n" );
        $msg .= ( "var whitespace = \" \\t\\n\\r\";\n" . 
                  "function isWhitespace (s) {\n" .
                  "  var i;\n" .
                  "  if (isEmpty(s)) return true;\n" .
                  "  for (i = 0; i < s.length; i++) {\n" .
                  "    var c = s.charAt(i);\n" .
                  "    if (whitespace.indexOf(c) == -1) return false;\n" .
                  "  }\n" .
                  "  return true;\n" .
                  "}\n" );
        
        foreach ( $this->usedFunct as $key => $val ) {
            switch ( $key ) {
            case "EXISTS":  // Output the javascript functions for Existance
                $msg .= ( "function doesExist (s) { return ( ! isEmpty(s) && ! isWhitespace (s) ); }\n" );
                break;
                
            case "EMAIL": // Output the javascript functions for email
                $msg .= "var iEmail = \"This field must be a valid email address (like foo@bar.com). Please reenter it now.\";\n";
                $msg .= ( "function isEmail (s) {\n" . 
                          "  if (isEmpty(s)) return ( true );\n" .
                          "  if (isWhitespace(s)) return ( false );\n" .
                          "  var i = 1;\n" .
                          "  var sLength = s.length;\n" .
                          "  while ((i < sLength) && (s.charAt(i) != \"@\")) { i++; }\n" .
                          "  if ((i >= sLength) || (s.charAt(i) != \"@\")) return ( false );\n" .
                          "  else i += 2;\n" .
                          "  while ((i < sLength) && (s.charAt(i) != \".\")) { i++; }\n" .
                          "  if ((i >= sLength - 1) || (s.charAt(i) != \".\")) return ( false );\n" .
                          "  else return ( true );\n" .
                          "}\n" );
                break;
            }
        }

        // Then create the validation function that will test all the
        // different form variables
        $msg .= "function validateForm() {\n";
        $msg .= "  var form = document.$this->formName;\n";
        foreach ( $this->testCases as $val ) {
            $nam  = $val["NAME"];
            $desc = $val["DESC"];

            // Test is in java and check if the form variable exists
            // Ensures the Javascript does not crash on
            // missing Form Variables
            $msg .= "  if ( form.$nam ) {\n";

            // Output the javascript to do the different checks
            switch ( $val["TEST"] ) {
            case "EXISTS":
                $msg .= "    if ( ! doesExist ( form.$nam.value ) ) {\n";
                $msg .= "      alert ( \"$desc Must Exist\" );\n";
                $msg .= "      form.$nam.focus();\n";
                $msg .= "      return ( false );\n";
                $msg .= "    }\n";
                break;
                
            case "EMAIL":
                $msg .= "    if ( ! isEmail ( form.$nam.value ) ) {\n";
                $msg .= "      alert ( iEmail );\n";
                $msg .= "      form.$nam.focus();\n";
                $msg .= "      return ( false );\n";
                $msg .= "    }\n";
                break;
                
            case "EQUAL":
                $nam2 = $val["XTRA"];
                $msg .= "    if ( form.$nam.value != form.$nam2.value ) {\n";
                $msg .= "      alert ( \"$desc\" );\n";
                $msg .= "      form.$nam.focus();\n";
                $msg .= "      return ( false );\n";
                $msg .= "    }\n";
                break;
                
            case "COPY":
                $nam2 = $val["XTRA"];
                $msg .= "    if ( ! doesExist ( form.$nam2.value ) ) {\n";
                $msg .= "      form.$nam2.value = form.$nam.value\n";
                $msg .= "    }\n";
                break;
            }

            // End of the if test that check if the form var exists
            $msg .= "  }\n";
            
            // Check if we are notifying the user on missing form vars
            if ( $this->alertOnMissingFormVar ) {
                $msg .= "  else {\n";
                $msg .= "    alert ( \"Form variable '$nam' does not exist in this form\" );\n";
                $msg .= "    return ( false );\n";
                $msg .= "  }\n";
            }
        }
        
        $msg .= "  return ( true );\n";
        $msg .= "}\n";
        $msg .= "function validateAndSubmit() {\n";
        $msg .= "  var form = document.$this->formName;\n";
        $msg .= "  var ok = validateForm ();\n";
        $msg .= "  if ( ok ) form.submit ();\n";
        $msg .= "  return ( ok );\n";
        $msg .= "}\n";
        return ( "<script type=\"text/javascript\" language=\"JavaScript\">\n" .
                 $msg .
                 "</script>\n" );
    }

    /** Function to attach some javascript to a Submit button
     ** so that it does the validation. 
     ** @returns String
     ** @public
     ** @param $s Other javascript that is required on this button or link
     ** @author Brett Dutton - bdutton@radntech.com
     **/ 
    function onSubmit ( $s="" ) {
        return ( "onClick=\"{$s}return validateForm();\"" );
    }

    /** This function would be attached to a button or a link. It 
     ** does the validation first and then does a submit on the form
     ** @returns String
     ** @public
     ** @param $s Other javascript that is required on this button or link
     ** @author Brett Dutton - bdutton@radntech.com
     **/ 
    function doSubmit ( $s="" ) {
        return ( "onClick=\"{$s}return validateAndSubmit();\"" );
    }
}


?>

For more information send a message to info at phpclasses dot org.