Intr-un articol precedent va prezentam principiile de baza ale validarii server-side cu CodeIgniter. Am descris acolo cum se pot valida destul de usor cateva tipuri de campuri cu acest framework.
Clasa FormValidation pe care CodeIgniter ne-o pune la dispozitie este mult mai ampla de atat, iar acest articol isi propune sa rafineze putin validarea inceputa in articolul trecut.
Asa cum cativa din cititori au observat, data trecuta am validat formularul in cauza, dar campurile nu erau repopulate atunci cand utilizatorul era redirectat inapoi la formular. Aceasta este una din problemele pe care le vom aborda aici.
Incepem cu formularul de data trecuta:
<?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>
Cea mai simpla varianta de a repopula formularul dupa validare este sa folosim functia set_value()
. Asa cum spuneam intr-un articol anterior, form_input()
, ia ca parametru secund, atributul value
. Astfel, pentru repopularea campului name, vom transforma:
<?php echo form_input('name'); echo form_label('Name', 'name') ?>
astfel:
<?php echo form_input('name', set_value('name')); echo form_label('Name', 'name') ?>
Cu toate ca aceasta metoda este foarte buna pentru formulare simple cu putine campuri, de multe ori vom avea de-a face cu situatii mai complexe in care vom vrea mai mult control.
Din acest motiv eu propun ca repopularea campurilor sa se faca folosind urmatoarea metoda:
<?php $inputName = array( 'name' => 'name', 'id' => 'name', 'value' => set_value('name'), 'maxlength' => '100', 'size' => '50', 'style' => 'width: 150px' ); $inputEmail = array( 'name' => 'email', 'id' => 'email', 'value' => set_value('email'), 'maxlength' => '100' ); $inputWebsite = array( 'name' => 'website', 'id' => 'website', 'value' => set_value('website'), 'maxlength' => '100' ); $textArea = array( 'id' => 'comment', 'name' => 'comment', 'value' => set_value('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($inputName); echo form_label('Name', 'name') ?></p> <p><?php echo form_input($inputEmail); echo form_label('E-mail', 'email') ?></p> <p><?php echo form_input($inputWebsite); 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 in definirea proprietatilor fiecarui camp, value
este setat cu ajutorul functiei set_value()
. Astfel, putem nu numai sa repopulam campul cu pricina, dar sa avem si un control mult mai bun asupra celorlalte atribute, fara sa incarcam codul pe ficare tag in parte.
Si pentru ca fiecare proiect in parte are caracteristicile lui speciale, CodeIgniter nu putea sa ne lase doar cu banalele mesaje de eroare implicite. Vom vedea in continuare cum putem modifica aceste mesaje de eroare, pentru fiecare mesaj in parte.
Pentru asta mergem in controller. Sa vedem cu ce am lucrat data trecuta:
<?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 } } ?>
Pentru a seta mesajul particularizat, vom folosi functia denumita sugestiv set_message()
, care ia doi parametri. Primul este regula la care se aplica mesajul, iar al doi-lea este mesajul de eroare in sine.
Astfel, noul controller va arata in felul urmator:
<?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_length[3]'); $this->form_validation->set_rules('email', 'E-mail', 'required|valid_email'); $this->form_validation->set_rules('comment', 'Comment', 'required'); $this->form_validation->set_message('required', 'Campul %s este obligatoriu'); $this->form_validation->set_message('valid_email', 'Campul %s trebuie sa fie un email valid'); $this->form_validation->set_message('min_length', 'Campul %s trebuie sa aiba minim %d caractere'); 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 } } ?>
Observati ca pentru campul Comment
, am folosit %s
si %d
in mesajul de eroare. Atunci cand folosim aceasta sintaxa, %s
se inlocuieste cu cel de-al doi-lea parametru din functia set_rules()
. Al doi-lea parametru este acela pe care CodeIgniter il denumeste "numele uman", si pe care il foloseste in mesajele de eroare implicite.
In schimb, %d
, este folosit pentru valori numerice dinamice. In cazul de fata, %d
va fi inlocuit cu 3, pentru aceasta este minimul de caractere cerut de regula. Concret, mesajul va fi: "Campul Comment
trebuie sa aiba cel putin 3
caractere".
Acestea sunt cateva din optiunile pe care clasa FormValidation ni le pune la dispozitie. Lista de functii este mult mai ampla si foarte bine descrisa in documentatia CodeIgniter. Va invit sa consultati aceasta documentatie pentru a aprofunda subiectul.