Codeigniter: Formularele – Lectia 2: Validarea formularelor. Cum validezi un formular in Codeigniter

Odata ce am realizat formularul, trebuie sa verificam daca vizitatorul a introdus toate datele cerute.

Pentru asta ne intoarcem in controller-ul Formular unde vom realiza metoda catre care trimite formularul. Iti amintesti cum am deschis formularul?

echo form_open(‘formular/trimite’);

Prin aceasta am spus browser-ului ca imediat ce vizitatorul apasa pe “Trimite comentariul”, toate datele sa fie trimise catre metoda trimite() care apartine clasei Formular.

Validarea

Asadar, in formular.php adaugam metoda trimite(). In aceasta metoda vom cauta fiecare element al formularului, il vom curata si vom realiza o validare a acestuia. In cazul in care validarea are loc cu succes vom trece mai departe. Daca insa validarea nu are loc, vizitatorul va fi trimis inapoi la formular pentru a-l completa.

Pentru a realiza validarea formularelor, framework-ul Codeigniter s-a gandit ca ne-ar fi de ajutor o biblioteca (library) de functii (unul dintre principalele motive pentru care am ales sa lucrez cu framework-uri). Aceasta se numeste form validation library.

Aici se repeta povestea pe care v-am spus-o si in lectia unu privind realizarea formularelor. Astfel, puteti incarca aceasta biblioteca de functii fie cand ai nevoie de ea, fie prin autoload (incarcarea bibliotecii de fiecare data, de-a lungul intregii aplicatii). In cazul in care vrei sa incarci biblioteca in controller, poti face asta cu linia:

$this->load->library(‘form_validation’);

Daca insa stii ca nu exista pagina care sa nu aiba nevoie de o validare pe site-ul tau, ar fi preferabil sa iti iei o grija de pe cap si sa incarci biblioteca prin modificarea autoload.php din folderul config al aplicatiei:

De asemenea, de cele mai multe ori, cand lucrezi cu formulare ai nevoie si de activarea bibliotecii pentru sesiunile de lucru… In controller poti incarca prin intermediul liniei:

$this->load->library(‘session’);

OK. Hai sa vedem cum va arata formular.php…

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Formular extends CI_Controller
{
  public function index()
  {
    /* $this->load->helper('form'); daca doresti sa incarci helperul 'form' in acest controller... */
    $this->load->view('formular_view');
  }
  public function trimite()
  {
    $this->form_validation->set_rules('nume','Numele tau','trim|required|xss_clean');
    $this->form_validation->set_rules('email','Adresa de email','trim|required|valid_email|xss_clean');
    $this->form_validation->set_rules('siteweb','Site web','trim|xss_clean');
    $this->form_validation->set_rules('parere','Parere','trim|required|alpha|xss_clean');
    $this->form_validation->set_rules('comentariu','Comentariu','trim|required|min_length(3)|xss_clean');
    if($this->form_validation->run()==FALSE)
    {
      $this->load->view('formular_view');
    }
    else
    {
      echo 'ok';
    }
  }
}

Dupa cum iti poti imagina, toata magia are loc prin intermediul metodei form_validation. Uita-te intre liniile 12 si 16. Este totul atat de simplu ca aproape ca nu mai este nevoie de nicio explicatie. Aici luam fiecare element in parte si ii stabilim niste reguli de validare.

Hai sa intram mai in amanunt luand primul element al formularului ca exemplu:

$this->form_validation->set_rules(‘nume’,’Numele tau’,’trim|required|xss_clean’);

Prin aceasta linie cerem aplicatiei sa valideze elementul de formular ‘nume’ si, in cazul in care elementul nu este validat, acest eveniment sa fie propagat mai departe pentru a fi afisat vizitatorului prin stringul ‘Numele tau’.

Regulile de validare

Acum sa vedem regulile de validare. Acestea sunt despartite printr-o linie verticala ‘|’ (‘pipe’, in engleza). Ordinea lor reprezinta de fapt pasii pe care vrei sa ii urmeze biblioteca in validarea elementului: ‘trim|required|xss_clean’.

Aici ii cerem bibliotecii ca intai sa scoata spatiile libere din dreapta si stanga valorii trimise de vizitator (trim). In acest fel ne asiguram ca nu a introdus pur si simplu un spatiu.

Prin required ii spunem bibliotecii ca (,) completarea acestui element este necesara, in caz contrar validarea returnand false.

Prin xss_clean ne asiguram ca vizitatorul nu a introdus cod in elementul de formular nume.

La celelalte elemente de formular mai poti vedea cateva reguli de validare. Astfel, valid_email se asigura ca vizitatorul a introdus o adresa valida de email.

alpha cere ca elementul introdus sa contina doar valori cu caractere alfabetica.

min_length(3) stabileste ca regula o limita minima de trei caractere ca valoare a elementului de formular.

Bineinteles ca acestea nu sunt toate regulile posibile. Pentru a vedea o analiza mai atenta a regulilor de validare a elementelor de formular te poti uita pe minunatul manual al CodeIgniter.

Validarea s-a incheiat cu succes?

Dupa ce am stabilit regulile de validare a elementelor de formular, vom vedea daca tot ce a introdus vizitatorul a respectat aceste reguli. Astfel, dupa cum poti vedea intre liniile 17 si 24, in cazul in care validarea a returnat false, aplicatia va intoarce vizitatorul la acelasi formular pentru ca acesta sa il completeze mai bine. In cazul in care completarea formularului s-a realizat prin respectarea conditiilor, am cerut controllerului sa returneze un echo ‘ok’. Bineinteles ca partile de afisare nu trebuie sa le pui in controller ci intr-un view. Asadar, ar trebui in principiu sa incarci un view prin care sa anunti vizitatorul ca a completat cu succes formularul. Deci in locul echo-ului, poti sa pui o linie de genul: $this->load->view(‘formular_succes_view’);

Intoarcerea la formular

Dar, fir-ar sa fie, vizitatorul nu a completat cum trebuie formularul si va trebui sa il intoarcem din drum…

In cazul in care valorile introduse de vizitator nu au fost conforme cu regulile de validare a formularului, aplicatia va incarca view-ul formularului pentru a permite vizitatorului sa il completeze cum trebuie.

Dar daca view-ul formularului ramane exact asa cum a fost facut in prima lectie, vizitatorul nu va sti deloc cu ce a gresit. Asa ca va trebui sa modificam putin view-ul…

In primul rand va trebui sa il anuntam pe vizitator cu ce a gresit si facem asta prin afisarea erorilor propagate ca urmare a regulilor de validare. Astfel, inainte de liniile care realizeaza formularul vom mai scrie o linie: echo validation_errors(‘<div style=”color:red”>’, ‘</div>’);

Dupa cum poti vedea, prin functia validation_errors(), cer aplicatiei sa puna fiecare eroare intr-un div scris cu rosu…

Dar ce se intampla cu elementele de formular? Acestea nu vor avea nicio valoare introdusa, daca vom lasa formularul nemodificat, iar toata munca vizitatorului va fi irosita.

Pentru a returna valorile introduse anterior de vizitator, ne vom folosi de informatiile pastrate in sesiune de aplicatie. Biblioteca de validare, nu doar ca a propagat erorile de validare, anuntand vizitatorul unde a gresit, dar a trecut si in variabilele de sesiune valorile introduse de acesta in formular. Afisarea acestora se face destul de simplu prin set_value(‘numeelement’);

Ia sa vedem cum va arata formular_view.php acum…

<!DOCTYPE HTML>
<html>
  <head>
    <title>Formular</title>
  </head>
  <body>
    <?php
    echo validation_errors('<div class="error">', '</div>');
    echo form_open('formular/trimite');
    echo form_label('Cum te numesti:','nume');
    echo '<br />';
    echo form_input('nume', set_value('nume'));
    echo '<br />';
    echo form_label('Adresa de email:','email');
    echo '<br />';
    echo form_input('email', set_value('email'));
    echo '<br />';
    echo form_label('Adresa web:','siteweb');
    echo '<br />';
    echo form_input('siteweb',set_value('siteweb'));
    echo '<br />';
    echo form_label('Ce parere ai despre acest tutorial?','parere');
    echo '<br />';
    $optiuni = array('multumit'=>'Sunt multumit','nemultumit'=>'Sunt nemultumit');
    echo form_dropdown('parere',$optiuni,set_value('parere'));
    echo '<br />';
    echo form_label('Comentarii:','comentariu');
    echo '<br />';
    echo form_textarea('comentariu', set_value('comentariu'));
    echo '<br />';
    echo form_submit('trimite','Trimite comentariul');
    echo form_close();
    ?>
  </body>
</html>

Acum, daca vizitatorul a gresit doar la o parte din formular, acesta nu va trebui sa rescrie tot formularul… Sper ca ai inteles. Daca nu ai inteles, poti oricand sa imi scrii un rand-doua in rubrica de comentarii. Multumesc pentru rabdarea de care ai dat dovada.

 

Lasă un răspuns

Your email address will not be published. Required fields are marked *

No spam? * Time limit is exhausted. Please reload CAPTCHA.