Cu ceva timp in urma, va povesteam despre felul in care putem face validare client-side cu ajutorul jQuery. Puteti citi despre asta aici si aici. In cele doua articole insistam ca, desi este eleganta, validarea client-side nu este niciodata suficienta. Cu cateva click-uri utilizatorul poate dezactiva JavaScript-ul din browser trecand de regulile noastre. Aici intervine validarea server-side.
CodeIginter ne pune la dispozitie unelte foarte usor de folosit pentru a face o astfel de validare. Form Validation Class ne pune la dispozitie cateva functii prin care putem valida rapid si eficient datele dintr-o astfel aplicatie.
Bineinteles ca validarea se poate face folosind PHP simplu, dar CodeIgniter ne face viata mai usoara printr-un set de reguli predefinite si altor cateva functionalitati pe care le vom vedea pe parcurs.
Vom folosi ca baza, formularul pe care l-am construit intr-un articol anterior folosind FormHelper.
N-am sa mai postez codul pentru construirea formularului pentru ca il puteti lua din link-ul de mai sus. Vom considera acesta punctul de plecare.
Vom incepe cu controller-ul, pentru ca acolo se intampla adevarata actiune. Primul lucru pe care trebuie sa-l facem, este sa includem clasa Form Validation. Acest lucru se poate face, la fel ca si pentru toate celelalte clase, cu o singura linie de cod:
$this->load->library('form_validation');
Bineinteles, daca avem o aplicatie in care vom folosi acesta librarie in mai multe controllere, este indicat sa folosim autoload. Pentru asta, vom merge in fisierul config/autoload.php
si vom modifica $autoload['libraries']
astfel incat sa arate asa:
$autoload['libraries'] = array('session', 'template', 'form_validation');
Acum ca avem la dispozitie clasa FormValidation, e timpul sa aplicam niste reguli. Acest lucru se face cu ajutorul functiei set_rules()
. Functia primeste trei parametri. Primul este numele input-ului pe care il validam. Al doi-lea este numele afisat in mesajul de eroare, iar al trei-lea parametru contine regulile de validare. Exemplu:
$this->form_validation->set_rules('name', 'Name', 'required');
Deci, ce face codul de mai sus? Pai, valideaza input-ul ‘name’ din formular, care in mesajul de eroare va fi identificat cu aliasul ‘Name’ si ii aplica regula ‘required’. Asta inseamna ca daca input-ul ‘name’ este gol se va genera o eroare de genul: Campul ‘Name’ este obligatoriu.
De asemenea, putem vedea de ce CodeIgniter este mai usor de folosit pentru o astfel de validare decat PHP-ul simplu. Sa zicem ca vrem sa validam un camp de tip email. Acesta trebuie sa NU fie gol, sa fie un email valid si sa aiba cel putin 4 caractere. Pentru asta trebuie sa construim functii separate care sa valideze fiecare regula in parte.
In CodeIgniter lucrurile stau un pic diferit. Aici avem optiunea de a folosi mai multe reguli de validare in aceeasi functie, daca le despartim prin caracterul ‘|’. Astfel, validarea despre care vorbeam mai sus, va arata, cu ajutorul lui CodeIgniter, in felul urmator:
$this->form_validation->set_rules('email', 'E-mail', 'required|valid_email|min_lenght[4]');
Astfel, cu o singura linie de cod, facem toate validarile necesare pentru acest camp.
Bun, am stabilit regulile de validare pentru fiecare camp in parte. Ce ramane de facut? Pai, trebuie sa rulam validarea si, in functie de rezultatul ei, sa luam o decizie in privinta la ce este de facut.
Validarea se ruleaza cu ajutorul functiei run()
si intoarce true
daca trece de toate validarile, sau false
daca nu. Decizia o luam in felul urmator:
if(!$this->form_validation->run()) { $this->load->view('contact'); } else { $this->sendToDb(); $this->load->view('contact'); }
Sa explicam putin codul. Daca functia run()
intoarce false
, oprim orice alta executie si intoarcem utilizatorul la formularul initial, cu tot cu erorile generate. Altfel, rulam functia sendToDb()
si apoi redirectam utilizatorul catre formular, dar fara erori.
Functia sendToDb()
nu este una nativa din CodeIgniter. Este doar exemplificativa. Este acolo doar ca sa arate ca in cazul in care validarea nu intoarce erori, putem sa continuam executia codului inainte sa incarcam view-ul.
Acum sa vedem ce trebuie facut in view
pentru ca erorile de validare sa ajunga la ecran. Nimic mai simplu. Undeva in codul HTML
trebuie sa chemam functia validation_errors()
. Aceasta va face output la erorile de validare, daca ele exista. Daca nu, functia nu intoarce nimic.
Sa facem deci, o recapitulare. Pentru validare trebuie sa avem un controller
care sa arate asa:
<?php class Contact extends Controller { function __construct() { parent::Controller(); } function index() { $this->load->view('contact'); } function send() { $this->load->library('form_validation'); $this->form_validation->set_rules('name', 'Name', 'required|min_lenght[3]'); $this->form_validation->set_rules('email', 'E-mail', 'required|valid_email'); $this->form_validation->set_rules('comment', 'Comment', 'required'); if(!$this->form_validation->run()) { $this->load->view('contact'); } else { $this->sendToDb(); $this->load->view('contact'); } } function sendToDb() { // Cod care trebuie rulat daca // validarea se face cu succes } } ?>
Iar view-ul va arata in genul acesta:
<?php $textArea = array( 'id' => 'comment', 'name' => 'comment', 'cols' => '45', 'rows' => '8' ); ?> <div id="form"> <?php echo validation_errors(); ?> <?php echo form_open('contact/send'); ?> <?php echo form_hidden('id', 0); ?> <?php echo form_fieldset('Add comment'); ?> <p><?php echo form_input('name'); echo form_label('Name', 'name') ?></p> <p><?php echo form_input('email'); echo form_label('E-mail', 'email') ?></p> <p><?php echo form_input('website'); echo form_label('Website', 'website') ?></p> <p><?php echo form_label('Comment', 'comment') ?><br /><?php echo form_textarea($textArea); ?> <?php echo form_fieldset_close(); ?> <?php echo form_submit('sumbit', 'Save'); ?> <?php echo form_close(); ?> </div>
Observati ca imediat inainte de deschiderea formularului am apelat functia validation_errors()
care va face output la eventuale erori de validare.
Am sa ma opresc aici cu acest articol, pentru ca deja devine foarte lung. Nu inainte de a va spune ca abia am acoperit notiunile de baza in legatura cu validarea server-side cu ajutorul lui CodeIgniter. Vom mai discuta despre acest subiect in unul sau mai multe articole viitoare.