Validácia vstupných dát v CakePHP - 2. časť
V prvej časti seriálu o validácii dát v CakePHP sme si podrobne predstavili základy validácie. V dnešnej časti budeme pokračovať a detailne si predstavíme vstavané validačné pravidlá a vytváranie vlastných pravidiel.
Vstavané validačné pravidlá
CakePHP disponuje množstvom najčastejšie používaných validačných pravidiel, ktoré robia validáciu veľmi jednoduchou. My si teraz detailne predstavíme všetky preddefinované pravidlá, ktoré môže programátor jednoducho používať bez toho, aby ich musel priamo vytvárať.
Ukážky kódov sú prevzaté z Cookbook: Data Validation
alphaNumeric
Dáta v danom inpute musia obsahovať iba písmená a číslice
var $validate = array(
'login' => array(
'rule' => 'alphaNumeric',
'message' => 'Usernames must only contain letters and numbers.'
)
);
between
Určuje rozmedzie počtu znakov daného inputu. Určuje minimálnu a maximálnu dĺžku reťazca v inpute
var $validate = array(
'password' => array(
'rule' => array('between', 5, 15),
'message' => 'Passwords must be between 5 and 15 characters long.'
)
);
blank
Určuje, že daný input musí byť prázdny alebo môže obsahovať iba biele znaky. Medzi biele znaky patria medzera, tabulátor a nový riadok
var $validate = array(
'id' => array(
'rule' => 'blank',
'on' => 'create'
)
);
cc
Toto pravidlo sa používa na kontrolu, či daný input obsahuje správne čísla kreditných kariet. Prijíma 3 argumenty na základe toho, aké čísla kreditných kariet chceme validovať, a to konkrétne type, deep a regex.
Pre kľúč type môžu byť pridelené dve hodnoty, a to fast, all alebo niektoré z nasledujúcich:
- bankcard
- diners
- disc
- electron
- enroute
- jcb
- maestro
- mc
- solo
- switch
- visa
- voyager
Ak je kľúč type nastavený na hodnotu fast, budú sa automaticky kontrolovať čísla majoritných kreditných kariet. Ak je kľúč type nastavený na hodnotu all budú sa kontrolovať všetky prednastavené formáty čísiel kreditných kariet. Taktiež tomuto kľúču môžete priradiť pole, kde určíte, oproti ktorým kreditným kartám sa bude validácia vykonávať.
Kľúč deep by mal byť nastavený ako boolean hodnota. Defaultne je táto hodnota nastavená na false. Ak však nastavíme danú hodnotu na true, na validáciu sa použije Luhn algoritmus
Kľúč regex vám umožňuje zadať vlastný regulárny výraz. I keď sú možnosti validácie kreditných kariet široké, určite sa nám v niektorých prípadoch môže kľúč regex hodiť a tým pádom nie sú naše možnosti limitované na prednastavené hodnoty
var $validate = array(
'ccnumber' => array(
'rule' => array('cc', array('visa', 'maestro'), false, null),
'message' => 'The credit card number you supplied was invalid.'
)
);
comparison
Toto kritérium umožňuje porovnávať číselné hodnoty. Podporované operácie sú štandardné matematické operácie a to väčší, menší, väčší alebo rovný, menší alebo rovný, rovnajúci sa a nerovnajúci sa
var $validate = array(
'age' => array(
'rule' => array('comparison', '>=', 18),
'message' => 'Must be at least 18 years old to qualify.'
)
);
var $validate = array(
'age' => array(
'rule' => array('comparison', 'greater or equal', 18),
'message' => 'Must be at least 18 years old to qualify.'
)
);
date
Určuje správny formát dátumu. Prijíma jeden parameter, ktorým určujeme požadovaný formát vkladaného dátumu. Ako parameter smie byť použitý jeden z nasledujúcich kľúčov
- ‘dmy’ e.g. 27–12–2006 or 27–12–06
- ‘mdy’ e.g. 12–27–2006 or 12–27–06
- ‘ymd’ e.g. 2006–12–27 or 06–12–27
- ‘dMy’ e.g. 27 December 2006 or 27 Dec 2006
- ‘Mdy’ e.g. December 27, 2006 or Dec 27, 2006
- ‘My’ e.g. (December 2006 or Dec 2006)
- ‘my’ e.g. 12/2006 or 12/06
Ak nie je žiadny kľúč určený, defaultne sa použije kľúč ymd.
var $validate = array(
'born' => array(
'rule' => 'date',
'message' => 'Enter a valid date in YY-MM-DD format.',
'allowEmpty' => true
)
);
decimal
Určuje správny formát desatinného čísla. Prijíma jeden parameter, ktorým určujeme počet čísiel za desatinnou bodkou (pozor: podporovaný je len anglický formát a desatinná čiarka nie je podporovaná). Ak tento parameter nie je určený, každé číslo, ktoré nebude mať za desatinnou bodkou aspoň jedno číslo, skončí chybou
var $validate = array(
'price' => array(
'rule' => array('decimal', 2)
)
);
Určuje správny formáta email adresy. Prijíma jeden parameter ako bolean hodnotu, ktorým určujeme, či sa má kontrolovať aj doména uvedená v email adrese.
var $validate = array('email' => array('rule' => 'email'));
var $validate = array(
'email' => array(
'rule' => array('email', true),
'message' => 'Please supply a valid email address.'
)
);
equalTo
Určuje akej hodnote a akému typu sa má rovnať reťazec z daného inputu
var $validate = array(
'food' => array(
'rule' => array('equalTo', 'cake'),
'message' => 'This value must be the string cake'
)
);
extension
Určuje správnu príponu ako napr. .jpg alebo .png. Umožňuje taktiež určiť aj viac prípon pre daný input, a to vložením požadovaných prípon do poľa
var $validate = array(
'image' => array(
'rule' => array('extension', array('gif', 'jpeg', 'png', 'jpg'),
'message' => 'Please supply a valid image.'
)
);
file
Toto validančé kritérium zatiaľ nie je definované.
ip
Určuje správny formát IPv4 adresy
var $validate = array(
'clientip' => array(
'rule' => 'ip',
'message' => 'Please supply a valid IP address.'
)
);
minLength
Určuje minimálnu dĺžku znakov, ktorú musí odosielaný reťazec obsahovať
var $validate = array(
'login' => array(
'rule' => array('minLength', '8'),
'message' => 'Usernames must be at least 8 characters long.'
)
);
maxLength
Určuje maximálnu dĺžku znakov, ktorú musí odosielaný reťazec obsahovať
var $validate = array(
'login' => array(
'rule' => array('maxLength', '15'),
'message' => 'Usernames must be no larger than 15 characters long.'
)
);
money
Toto validančé kritérium zatiaľ nie je definované.
multiple
Toto validančé kritérium zatiaľ nie je definované.
numeric
Určuje, či sa jedná o číslo v správnom formáte
var $validate = array(
'cars' => array(
'rule' => 'numeric',
'message' => 'Please supply the number of cars.'
)
);
phone
Určuje správny formát telefónneho čísla vo formáte US. Pre kontrolu čísla v inom formáte prijíma ako druhý parameter regulárny výraz, ktorým môžeme určiť správny formát národného čísla
var $validate = array(
'phone' => array(
'rule' => array('phone', null, 'us')
)
);
postal
Určuje správny formát zip code. Jedná sa o obdobu PSČ. Prednastavené sú čísla z UK, US a Kanady. Pre kontrolu čísla v inom formáte prijíma ako druhý parameter regulárny výraz, ktorým môžeme určiť správny formát národného čísla
var $validate = array(
'zipcode' => array(
'rule' => array('postal', null, 'us')
)
);
range
Určuje, či daná hodnota spadá do určeného rozsahu.
var $validate = array(
'number' => array(
'rule' => array('range', 0, 10),
'message' => 'Please enter a number between 0 and 10'
)
);
ssn
Určuje formát social security number. Jedná sa o obdobu rodného čísla. Pre kontrolu čísla v inom formáte prijíma ako druhý parameter regulárny výraz, ktorým môžeme určiť správny formát národného čísla.
var $validate = array(
'ssn' => array(
'rule' => array('ssn', null, 'us')
)
);
url
Určuje správny formát URL adresy. Podporované protokoly sú http(s), ftp(s), news a gopher.
var $validate = array(
'website' => array(
'rule' => 'url'
)
);
Vlastné validačné pravidlá
Ako sme už mohli zistiť, prednastavené pravidlá nám poskytujú vysoký komfort pri validácii dát bez nutnosti písať vlastné pravidlá. Určite však niekedy nastane situáciu, že budeme nútený napísať vlastné validačné pravidlo. K tomu nám CakePHP ponúka dve možnosti, jednou je definovanie regulárneho výrazu, druhou možnosťou je vytvoriť vlastnú metódu.
Regulárny výraz ako validačné pravidlo
Pre tých, ktorý majú v láske regulárne výrazy nie je nič jednoduchšie, ako definovať vlastné pravidlá pomocou nich. Treba však poznamenať, že je to najrýchlejší spôsob, ako vlastné pravidlá vytvárať
var $validate = array(
'login' => array(
'rule' => array('custom', '/[a-z0-9]{3,}$/i'),
'message' => 'Only letters and integers, min 3 characters'
)
);
Príklad vyššie nám ukazuje, že input login môže obsahovať iba číslice a písmená, a musí obsahovať minimálne 3 znaky.
Vlastná validačná metóda
V niektorých prípadoch môže byť však regulárny výraz nedostatočný. Predstavme si situáciu, že potrebujeme zaistiť, že login je unikátny. K tomuto nám dokonale poslúži vlastná validačná metóda
<?php
class User extends AppModel {
var $name = 'User';
var $validate = array(
'login' => array(
'rule' => array('checkUnique', 'login'),
'message' => 'Login name already taken.'
)
);
function checkUnique($data, $fieldName) {
$valid = false;
if(isset($fieldName) && $this->hasField($fieldName))
{
$valid = $this->isUnique(array($fieldName => $data));
}
return $valid;
}
}
?>
Ak by ste chceli predávať parametre našej novej validačnej metóde, pridajte extra element do poľa rule (v ukážke login) a v metóde daný element zachyťte ako ďalší parameter za parametrom $data (v ukážke $fieldName)
Validačnú metódu môžeme umiestniť buď do modelu, ale rovnako i do behavior, ktoré model implementuje.
Validačnou metódou môžeme prepísať prednastavené validačné pravidlá a to tým, že ich pomenujeme rovnakým názvom. Napríklad by sme v našom modely vytvorili metódu nazvanú file, znamenalo by to, že sme tým prepísali metódu z triedy Validation a pri použití validačného pravidla file sa bude volať nami vytvorená metóda z nášho modelu.
Týmto je náš článok u konca. V poslednej časti tohto miniseriálu si ukážeme ako validovať dáta, ktoré nie sú namapované na databázovú tabuľku, a taktiež si ukážeme ucelený príklad jednoduchej validácie.
Súvisiace články
-
Kategórie
- Tipy a triky (25)
- Články (8)
- Fantom CMS (4)
- Zábava (2)
- Začíname s CakePHP (5)
-
Najčítanejšie články
-
Novinky
-
Seriál o CakePHP na www.debug.sk
15. 10. 2008
Od 7. októbra vychádza nový seriál o CakePHP na serveri zameranom na programovanie s názvom Debug.sk Autorom seriálu je autor tohto webu a kto by mal záujem, môžete daný seriál podporiť jeho prečítaním.
-
-
Nálepky
-
Nedávne komentáre
-
Rss kanály
-
Download
- 5. Tvoríme CMS s CakePHP - Controller a View (356 KB)
- Validácie v CakePHP (2 KB)
- 4 - Tvoríme CMS s CakePHP - Model (2 KB)
- Controller bez modelu (571 Bytes)
- Všetky súbory

Komentáre k článku
Nový komentár
Titulok: Doplnenie
Autor: duRqoo
Vytvorený: 04. 05. 2008 03:09
Do vlastnych validacnych metod prichadzaju data pre kontrolu vo forme asociativneho pola. Preto aby uvedeny priklad fungoval je potrebne zmenit:
na