poniedziałek, 28 września 2009

Simple_Validation

jak szalec to szalec. inne podejscie do walidacji, bardziej elastyczne, z regulami walidacji w modelu.

1) libraries/MY_controller.php
class Controller extends Controller_Core {

 //reguly walidacji
 public $form_rules = array();
 //pola do walidacji
 public $form_fields = array();
 //bledy walidacji
 public $form_errors = array();
 //obiekt walidatora
 public $form_post;
 
 //dodanie nowego pola do walidacji i formularza 
 public function make_field($field, $rules = array(), $default = '')
 {
  $this->form_fields[$field] = $default; //przypisanie domyslnej wartosci
  $this->form_errors[$field] = ''; //ustawienie pustej wiadomosci o bledzie 
 }
 
 //jak wyzej tylko hurtowo
 public function make_fields($fields = array()) 
 {
  if (!empty($fields) AND is_array($fields))
   foreach ($fields as $field)
   {  
    //ustalenie domyslnej pustej wartosci
    $this->form_fields[$field] = ''; 
    //ustawienie pustej wiadomosci o bledzie
    $this->form_errors[$field] = '';  
   }
 }
 
 //przypisanie wartosci do pol
 public function assign_values($fields = array()) 
 {
  if (!empty($fields) AND is_array($fields))
   foreach ($fields as $field => $value)
   {  
    $this->form_fields[$field] = $value;  //ustalenie wartosci dla pola
   }
 }
 
 //przepisanie wartosci i bledow po walidacji
 public function set_fields($submit) 
 { 
  if (!empty($submit))  
  {
   $this->form_fields = arr::overwrite($this->form_fields, $this->form_post->as_array());
   $this->form_errors = arr::overwrite($this->form_errors, $this->form_post->errors());
  }
 }
 
 //ustawienie regul walidacji 
 public function set_rules($all_rules) 
 { 
  if (!empty($all_rules) as is_array($all_rules))  
  {
   foreach ($all_rules as $field => $rules)
   {
    foreach ($rules as $rule) 
    {
     //przypisanie reguly do pola
     $this->form_post->add_rules($field, $rule); 
    }
   }
  }
 }
} 

2)kontroler
$this->form_post = Validation::factory($this->input->post())->pre_filter('trim');
//stworz pola formularza (wartosc oraz ew. blad walidacji)
$this->make_fields(array_keys($crud_model->validation)); 
//przypisz reguly walidacji
$this->set_rules($crud_model->validation);
//opcjonalnie mozna przypisac domyslne wartosci
$this->assign_values(array('page_title'=>'tytuł'));
//waliduj
$this->form_post->validate();
//reszta jak w poprzednim przykladzie

3) model
public $validation = array(
     'page_title' => array('required'),
     'meta_title' => array('required'),
     'meta_keywords' => array('required','length[4,7]'),
     'meta_description' => array('required')
     ); 
}

gotowe. plusy sa takie, ze pola deklarujemy tylko raz w modelu, nie ma potrzeby ponownego ich wpisywania. mozna dowolnie nimi manipulowac, dodawac nowe, kasowac juz dodane (jesli np. ktores pole nie jest w danym formularzu potrzebne). mozna dowolnie zmieniac reguly walidacji, nie jestesmy uwiazani z tymi, ktore sa w modelu.

generalnie to koncept, tak jak poprzedni przyklad nie jest super hiper extra rozwiazanie powalajace na kolana, zamieszczam w celach edukacyjnych, moze ktos posklada z tego swoja wizje obslugi formularzy i bedzie szczesliwy :) formularze i CRUD sa podstawa kazdej administracji strona, im latwiej (jest to kwestia indywidualna i wzgledna) bedzie sie nam z nimi pracowalo, tym wydajniejsi bedziemy :)

0 komentarze:

Prześlij komentarz