Choď na navigáciu
Nálepky: validácia CakePHP

Validácia vstupných dát v CakePHP - 3. časť

V poslednej časti nášho miniseriálu o validácii dát v CakePHP si vytvoríme ukážkový príklad a názorne demonštrujeme celý mechanizmus validácie dát v tomto frameworku.

Ešte pred tým, než sa pustíme do nášho príkladu treba poznamenať, že pre správne pochopenie nasledujúcich častí je žiadúce prečítať si predchádzajúce 2 časti tohto seriálu (1. časť a 2. časť)

Ak ste sa už s predchádzajúcimi časťami podrobne zoznámili, poďme prejsť na našu ukážkovú aplikáciu. Naša aplikácia bude slúžiť na registráciu užívateľov a bude obsahovať jednoduchý formulár na zadanie základných informácii o užívateľovi.

Model

Model je najdôležitejšia časť našej aplikácie a preto sa jej budeme venovať ako prvej. Práve v modely budeme definovať validačné kritéria. V databáze si musíme najprv vytvoriť tabuľku, ktorú pomenujeme users a jej štruktúra je nasledovná

CREATE TABLE `users` (
`id` INT NOT NULL AUTO_INCREMENT ,
`name` VARCHAR( 50 ) NOT NULL ,
`email` VARCHAR( 320 ) NOT NULL ,
`password` VARCHAR( 100 ) NOT NULL ,
`birthdate` DATE NOT NULL ,
PRIMARY KEY ( `id` )
)

Ako môžeme vidieť na kóde vyššie, pri registrácii bude užívateľ zadávať svoje meno, email adresu, heslo a dátum narodenia. Po vytvorení tabuľky v databáze si vytvoríme model, ktorý pomenujeme User a umiestníme ho do súboru app/models/user­.php

class User extends AppModel {

        var $name = 'User';
        var $useTable = 'users';
        var $validate = array(
                'name' => array(
                    'alphanumeric' => array(
                        'rule' => 'alphaNumeric',
                        'required' => true,
                        'message' => 'Povolené sú len čísla alebo písmená'
                        ),
                    'between' => array(
                        'rule' => array('between', 5, 50),
                        'message' => 'Min. 5 max 50 znakov'
                    )
                ),
                'email' => array('email',true),
                'password' => array (
                        'between' => array(
                        'rule' => array('between', 5, 20),
                        'message' => 'Min. 3 max 20 znakov'
                        )
                ),
                'birthdate' => array('date')
        );
}

Na kóde vyššie môžeme vidieť jednotlivé validačné kritéria. Poďme si ich teda priblížiť. Pravidlo pre input name určuje, že v danom vstupe sa môžu nachádzať len čísla alebo písmená (‚rule‘ ⇒ ‚alphaNumeric‘) a že daný vstup musí byť minimálne 5 znakov a maximálne 50 znakov dlhý (‚rule‘ ⇒ array(‚between‘, 5, 50)). Pravidlo pre input email určuje, že daný vstup musí obsahovať správnu email adresu a navyše sme druhým voliteľným parametrom určili, že sa má validovať aj doménová časť email adresy. Pravidlo pre input password je nám už známe, a určuje minimálny a maximálny počet znakov v danom inpute. Posledné pravidlo pre input birthdate nám určuje, že daný vstup prijíma iba dátum v prednastavenom formáte.

Ďalším krokom je vytvorenie controlleru, ktorý spracuje udalosti spojené s odoslaním formulára. O celom mechanizme fungovania MVC v CakePHP sa dočítate v článku MVC model view controller v CakePHP. Controller pomenujeme UsersController a uložíme ho do súboru app/controller­s/users_contro­ller.php

class UsersController extends AppController {

        var $name = 'Users';
        var $helpers = array('Html', 'Form');

        function add() {
                if (!empty($this->data)) {
                        $this->User->create();
                        if ($this->User->save($this->data)) {
                                $this->Session->setFlash(__('Užívateľ úspešne uložený.', true));
                                $this->redirect(array('action'=>'index'));
                        } else {
                                $this->Session->setFlash(__('Užívateľ nemohol byť uložený. Pokúste sa ešte raz.', true));
                        }
                }
        }
}

Kód vyššie vysvetľovať nemusím a každý by mu mal rozumieť. Metóda add() sa postará o uloženie dát do databáze. Dáta sa pred uložením budú automaticky validovať, takže sa nemusíme o nič starať a explicitne volať metódy pre validáciu tzn. že predtým, než sa dáta uložia do databázy, budú automaticky skontrolované podľa validačných pravidiel, ktoré sme definovali v modely. V prípade, že validácia vráti nejakú chybu, dáta sa neuložia a zobrazí sa chybová hláška. Ostáva nám teda priblížiť poslednú časť a tou je view, v ktorej okrem iného budeme zobrazovať aj spomínané chybové hlášky.

Kód s naším formulárom bude umiestnený v súbore app/views/user­s/add.ctp

<div class="users form">
<?php echo $form->create('User');?>
        <fieldset>
                <legend><?php __('Pridanie užívateľa');?></legend>
        <?php
                echo $form->input('name');
                echo $form->input('email');
                echo $form->input('password');
                echo $form->input('birthdate');
        ?>
        </fieldset>
<?php echo $form->end('Submit');?>
</div>

Vyššie uvedený kód je kompletný. Určite sa teraz pýtate, prečo sa v danom kóde nikde nenachádzajú časti pre zobrazenie chybových hlášok. CakePHP to robí za nás a automaticky zobrazuje správy pri každom inpute podľa toho, ako sme ich definovali v modely. Ak sme žiadnu chybovú správu pre daný input nedefinovali, ale validačné pravidlo áno, CakePHP zobrazí vlastnú prednastavenú chybovú hlášku. Niekedy budeme chcieť zobraziť chybové hlášky na inom mieste ako priamo pod inputom a mať tak zobrazovanie chybových správ pod vlastnou kontrolou. Riešenie by vyzeralo nasledovne

<div class="users form">
<div class="error"><? echo $form->error('User.name'); ?></div>
<?php echo $form->create('User');?>
        <fieldset>
                <legend><?php __('Pridanie užívateľa');?></legend>
        <?php
                echo $form->input('name',array('error'=>false));
                echo $form->input('email');
                echo $form->input('password');
                echo $form->input('birthdate');
        ?>
        </fieldset>
<?php echo $form->end('Submit');?>
</div>

Ako môžeme vidieť na kóde vyššie, najprv sme vypli zobrazovanie správ priamo pri inpute name ($form->input(‚name‘,a­rray(‚error‘=>fal­se))) a potom sme definovali miesto, kde sa má naša správa zobraziť a zavolaním metódy error() sme danú správu zobrazili.

Týmto je náš ukážkový príklad u konca. Vyššie uvedené kódy sú kompletné a jasne na nich môžeme vidieť princípy na ktorých je postavený CakePHP a to hlavne filozofia convention over configuration. Vďaka tejto filozofii je validácia dát veľmi jednoduchá a intuitívna, a jedinú vec ktorú musíme vykonať pre fungujúcu validáciu, je definovať validačné pravidlá v modely.

Zdrojové kódy k článku

Povedz o článku aj ostatným - www.pridej.cz

Hodnotenie článku: 46%
Počet hodnotení: 50

zlýdobrý

Komentáre k článku

Nový komentár

  1. Titulok: Odoslanie cez GET
    Autor: Stevo
    Vytvorený: 15. 05. 2008 11:27

    Vdaka za clanok a super serial :)

    Mam k nemu otazku az tak nesuvisiacu s validaciou… Ako pristupim k odoslanym datam, ak pouzijem formular odoslany metodou GET ?

    $form->create('User', array('type' => 'get'))

    V $this->data ich nenajdem, vraj by mali byt v $this->params[‚url‘] …, tam ale pri korektnom odoslani v tvare /nieco?var1=ab­c&var2=def najdem len premennu var2. Bug alebo ficura? :)

  2. Titulok: RE: Odoslanie cez GET
    Autor: Tibor
    Vytvorený: 15. 05. 2008 15:09

    No keby si to poriadne skusal, tak zistis, ze to co pises je pravda. Ked sa data odosielaju cez get, posielaju sa cez url, takze ich urcite najdes v $this->params[‚url‘]

    Cize keby som formular z clanku odosielal formou get, po odoslani by mala url adresa napr. takyto tvar

    /users/add?name=name&email=&password=&birthdate=05&birthdate=15&birthdate=2008

    Cize vsetky data z formulara sa nachadzaju v url a teda k nim pristupujes ako pole v $this->params['url] coho dokazom je aj vypis premennej $this->params po odoslani formulara

    Array
    (
        [pass] => Array
            (
            )
    
        [named] => Array
            (
            )
    
        [controller] => users
        [action] => add
        [plugin] =>
        [form] => Array
            (
            )
    
        [url] => Array
            (
                [url] => users/add
                [name] => name
                [email] =>
                [password] =>
                [birthdate] => 2008
            )
    
        [bare] => 0
        [webservices] =>
    )
  3. Titulok: povinny titulok
    Autor: Stevo
    Vytvorený: 15. 05. 2008 17:18

    Chapem… Pouzivam cakephp 1.2, a problem je v tom ze

    /users/add?name=name&email=&password=&birthdate=05&birthdate=15&birthdate=2008

    mi v $this->params vrati

    Array
    (
        [pass] => Array
            (
            )
    
        [named] => Array
            (
            )
    
        [controller] => users
        [action] => add
        [plugin] =>
        [form] => Array
            (
            )
    
        [url] => Array
            (
                [url] => users/add?name=name
                [email] =>
                [password] =>
                [birthdate] => 2008
            )
    
        [bare] => 0
        [webservices] =>
    )

    Stratim prvy parameter [name] ⇒ name

    Nikde neuvadzas o akej verzii cakephp pises, ja som tiez zabudol :) Pravdepodobne sme sa v nich nezhodli.

  4. Titulok: RE: povinny titulok
    Autor: Tibor
    Vytvorený: 15. 05. 2008 18:06

    Pouzivam verziu Beta: 1.2.0.6311. Cake urcite nevynechava ziadny argument posielany cez GET a to je jedno o aku verziu sa jedna, takze fakt netusim v com moze byt problem. Jedine zeby to bol nejaky bug v niektorej z verzii.