|
$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>"; } } |
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.
|
if ($objForm->isPost('valgfrit feltnavn fra formen')) { $objValid->_expected = array( 'first_name', ... 'email' ); $objValid->_required = array( 'first_name', ..., 'email' ); $objValid->_special = array( 'email' => 'email' ); } |
Klassen "Validation" vil grundlæggende være genbrugelig. Der skal dog foretages følgende tilpasninger:
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>"; } } } |
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; } |
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" ... |