logo   OOP - Validering




Formfelter

Validering af formfelter foretages på to måder:

  • Om et felt er tomt / ikke tomt.
  • Om syntaksen er i orden, for felter der indeholder specielle værdier (f.eks: email adresse).

Valideringen starter og slutter i HTML-programmer, der indeholder en Form.

Den fysiske udførelse af al validering foretages (hovedsagelig) i klassen "Validation". Derved fastholdes muligheden for "kodegenbrug".

Opbygningen af Validation-klassen er ret så kompleks og af stort set samme omfang hvad enten der skal valideres et enkelt eller mange form-felter. Indsatsen kan dog begrænses ved at klassen grundlægggende kan kopieres / genbruges fra opgave til opgave.


HTML: Program-top.


Validation klassen instantieres i topdelen af programmet, der indeholder formen, med $objForm tilknyttet.
Startes af Validation __construct()

$objForm = newForm();
$objValid = new Validation($objForm);


Valideringen startes med funktionen isValid() fra denne kode i HTML-top.

if ($objValid->isValid()) {
   if ($objUser->updateUser($objValid->_post, $user['id'])) {
      Helper::redirect('/?page=summary');
   } else {
      $mess = "<p class=\"red\">There was a problem updating your details.<br />";
      $mess .= "Please contact administrator.</p>";
   }
}


Valideringsstyring

I HTML-filens topdel indsættes arrays til styring af forekommende felter og valideringsform for felter, der skal valideres, der skal benyttes for hvert enkelt felt i formen.

Fortæller $objValid, hvilke felter der vil komme data fra.


Valideringsstyring
Der etableres to eller 3 arrays til listning af de relevante felter fra formen.
  • Expected
    Array med alle felter i formen
  • Required
    Array med de felter i formen, der skal valideres på "normal" vis.
  • Special
    Array med de felter i formen, der skal have speciel validering (f.eks. e-mail).
    Oprettes kun når felter med behov for speciel validering forekommer.
Feltnavnene skal i alle tre situationer anføres i feltorden.


if ($objForm->isPost('valgfrit feltnavn fra formen')) {
   $objValid->_expected = array(
      'first_name',
      ...
      'email'
   );
   $objValid->_required = array(
      'first_name',
      ...,
      'email'
   );
   $objValid->_special = array(
      'email' => 'email'
   );
}



Klasse: Validation


Klassen "Validation" vil grundlæggende være genbrugelig. Der skal dog foretages følgende tilpasninger:

//Validation messages
I egenskaben skal identer og tekster skal tilpasses til det aktuelle bohov i både site og Admin.
Funktionen "check special"
Ved flere special end "email" skal der tilpasses dertil.
Flere special
Der etableres flere funktioner baseret på "isEmail"-modellen.


class Validation {

Egenskab, der indeholder alle returnerede form-data. Etableres med Construct.
   // form object
   private $objForm;

Egenskab med array til opsamling af "id" for alle fejlbehæftede felter. Etableres med add2Errors().
   // for storing all error ids
   private $_error = array();

Egenskab med array indeholdende alle de fejltekster der kan forekomme i både site og admin. Som "id" anvendes feltnavnet fra <input name="feltnavn".
Vedligeholdes manuelt i valgfri orden efterhånden som behov opstår.
   // validation messages
   public $_message = array(
      "first_name" => "Please provide your first name",
      "last_name" => "Please provide your last name",
      "address_1" => "Please provide the first line of your address",
      "address_2" => "Please provide the second line of your address",
      "town" => "Please provide your town name",
      "county" => "Please provide your county name",
      "post_code" => "Please provide your post code",
      "country" => "Please select your country",
      "email" => "Please provide your valid email address",
      "email_duplicate" => "This email address is already taken",
      "login" => "Username and / or password were incorrect",
      "password" => "Please choose your password",
      "confirm_password" => "Please confirm your password",
      "password_mismatch" => "Passwords did not match",
      "category" => "Please select the category",
      "name" => "Please provide a name",
      "description" => "Please provide a description",
      "price" => "Please provide a price",
      "name_duplicate" => "This name is already taken"
   );

Egenskab med array indeholdende navne på "expected" felter. Tilført fra HTML-top.
   // list of expected fields
   public $_expected = array();

Egenskab med array indeholdende navne på "required" felter. Tilført fra i HTML-top.
   // list of require fields
   public $_required = array();

Egenskab med array indeholdende navne på "special" felter. Tilført fra HTML-top.
   // list of special validation fields
   // array('field_name' => 'format')
   public $_special = array();

Egenskab med array indeholdende alle "value"-data fra formen. Etableret med / brugt af process().
   // post array
   public $_post = array();

Egenskab med array med POST-felter, der skal fjernes (uklart hvordan data tilføres egenskaben). Bruges af isValid() til at tømme $_POST.
   // fields to be removed from the $_post array
   public $_post_remove = array();

Egenskab med array !!!!!!!
   // fields to be specifically formatted
   // array('field_name' => 'format'
   public $_post_format = array();

Construct der starter $objForm instantieret i HTML-programmet.
   public function __construct($objForm) {
      $this->objForm = $objForm;
   }

Startes fra isValid()
Opbygger egenskaben _post ud fra _expected og validerer med funktionen check ud fra _post.
Bruger også funktionerne objForm->isPost() og objForm->getPostArray().
   public function process() {
      if ($this->objForm->isPost() && !empty($this->_required)) {
         // get only expected fields
         $this->_post = $this->objForm->getPostArray($this->_expected);
         if (!empty($this->_post)) {
            foreach($this->_post as $key => $value) {
               $this->check($key, $value);
            }
         }
      }
   }

Bruges i check() og checkSpecial() til at opdatere _error egenskaben.
   public function add2Errors($key) {
      $this->_errors[] = $key;
   }

Bruges i process() til at udskille records fra _special til validering med checkSpecial(). For øvrige "required" valideres for tomt værdifelt. Ved tomt felt anvendes add"Error().
   public function check($key, $value) {
      if (!empty($this->_special) && array_key_exists($key, $this->_special)) {
         $this->checkSpecial($key, $value);
      } else {
         if (in_array($key, $this->_required) && empty($value)) {
            $this->add2Errors($key);
         }
      }
   }

Bruges i check() til at validere værdier fra _special felter. "Case" giver mulighed for at validere valgfrit antal _special-værdier i hver sin funktion.
Ved fejl anvendes add"Error().
   public function checkSpecial($key, $value) {
      switch($this->_special[$key]) {
         case 'email':
         if (!$this->isEmail($value)) {
            $this->add2Errors($key);
         }
         break;
      }
   }

Funktion til at validere e-mail adresse.
   public function isEmail($email = null) {
      if (!empty($email)) {
         $result = filter_var($email, FILTER_VALIDATE_EMAIL);
         return !$result ? false : true;
      }
      return false;
   }

Startes fra HTML.
Starter process()-funktionen.
Når ingen fejl tømmes egenskaben $_post.
   public function isValid() {
      $this->process();
      if (empty($this->_errors) && !empty($this->_post)) {
         // remove all unwanted fields
         if (!empty($this->_post_remove)) {
            foreach($this->_post_remove as $value) {
               unset($this->_post[$value]);
            }
         }
         // format all required fields
         if (!empty($this->_post_format)) {
            foreach($this->_post_format as $key => $value) {
               $this->format($key, $value);
            }
         }
         return true;
      }
      return false;
   }

Funktion relateret til validering af password og hashing når korrekt.
   public function format($key, $value) {
      switch($value) {
         case 'password':
         $this->_post[$key] = Login::string2hash($this->_post[$key]);
         break;
      }
   }

   public function validate($key) {
      if (!empty($this->_errors) && in_array($key, $this->_errors)) {
         return $this->wrapWarn($this->_message[$key]);
      }
   }

   public function wrapWarn($mess = null) {
      if (!empty($mess)) {
         return "<span class=\"warn\">{$mess}</span>";
      }
   }
}



Klasse: Form


process()-funktionen i "Validation" anvender 2 funktioner fra klassen objForm:


Afklarer om $_POST forefindes.
public function isPost($field = null) {
   if (!empty($field)) {
      if (isset($_POST[$field])) {
         return true;
      }
      return false;
   } else {
      if (!empty($_POST)) {
         return true;
      }
      return false;
   }
}

Bruger $_POST til at bygge array ($out) med værdier for de poster, der er indeholdt i $expected.
public function getPostArray($expected = null) {
   $out = array();
   if ($this->isPost()) {
      foreach($_POST as $key => $value) {
         if (!empty($expected)) {
            if (in_array($key, $expected)) {
               $out[$key] = strip_tags($value);
            }
         } else {
            $out[$key] = strip_tags($value);
         }
      }
   }
   return $out;
}



HTML: "input type"-felter.


For hvert "input type"-felt i formen, der skal valideres, indsættes en PHP-linie til at vise evt. fejltekster.

Ved valideringens afslutning - men før fejlbehæftet formular returneres til klient -:

For hvert felt udføres funktionen validate(). ved forekomst af fejl for feltet indsættes den relevante fejltekst.


<?php echo $objValid->validate('feltnavn'); ?>
<input type="text" name="feltnavn"
   ...






















x
x