2011-11-18 21 views
18

Mam funkcję w moim formularzu logowania, która sprawdza, czy adres e-mail i hasło są zgodne z wartościami w bazie danych, a jeśli tak, loguje użytkownika do systemu.Tworzenie niestandardowej reguły sprawdzania kodu kodu weryfikacyjnego

Chciałbym wyświetlić błąd sprawdzania poprawności, jeśli funkcja zwraca wartość false.

Mój problem polega na tym, że nie jestem pewien, jak to zrobić. Komunikat dotyczy zarówno pola hasła, jak i adresu e-mail, więc nie chcę, aby reguła dla każdego pola wejściowego wyświetlała tylko jedną wiadomość.

Próbowałem użyć flashdata, aby to osiągnąć, ale działa tylko wtedy, gdy strona została odświeżona.

Jak mogę utworzyć nową regułę walidacji wyłącznie dla funkcji $this->members_model->validate_member()?

$this->form_validation->set_error_delimiters('<div class="error">', '</div>'); 
     $this->form_validation->set_rules('email_address', '"Email address"', 'trim|required|valid_email'); 
     $this->form_validation->set_rules('password', '"Password"', 'trim|required'); 

     if ($this->form_validation->run() == FALSE) 
     { 
      $viewdata['main_content'] = 'members/login'; 
      $this->load->view('includes/template', $viewdata); 
     } 
     else 
     {  
       if($this->members_model->validate_member()) 
       { 

Odpowiedz

38

użyć callback_ w regułach, patrz callbacks, ex.

$this->form_validation->set_rules('email_address', '"Email address"', 'trim|required|valid_email|callback_validate_member'); 

i dodaj metodę do kontrolera. Metoda ta wymaga, aby powrócić PRAWDA lub FAŁSZ

function validate_member($str) 
{ 
    $field_value = $str; //this is redundant, but it's to show you how 
    //the content of the fields gets automatically passed to the method 

    if($this->members_model->validate_member($field_value)) 
    { 
    return TRUE; 
    } 
    else 
    { 
    return FALSE; 
    } 
} 

Następnie trzeba stworzyć odpowiedni błąd w przypadku sprawdzania poprawności nie powiedzie

$this->form_validation->set_message('validate_member','Member is not valid!'); 
+2

Name „_validate_member” będzie lepiej .. – Ivan

+0

@Ivan To nie jest konieczne, ale można dodać na czytelność, dziękuję –

+6

Może nie być konieczne, ale wiodące podkreślenie uniemożliwi dostęp do metody przez "/ controller_name/validate_member/blah" ... a użycie podwójnego podkreślenia jest całkowicie dopuszczalne IMO "callback__validate_member";) –

5

Jeden Najlepszym sposobem osiągnięcia tego celu jest rozszerzenie biblioteki Form Validation CodeIgniter użytkownika. Załóżmy, że chcemy utworzyć niestandardowy weryfikator o nazwie access_code_unique dla pola access_code tabeli bazy danych .

Wszystko, co musisz zrobić, to stworzyć plik klasy o nazwie MY_Form_validation.php w katalogu application/libraries. Metoda powinna zawsze powrócić TRUE LUB FALSE

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

class MY_Form_validation extends CI_Form_validation { 
    protected $CI; 

    public function __construct() { 
     parent::__construct(); 
      // reference to the CodeIgniter super object 
     $this->CI =& get_instance(); 
    } 

    public function access_code_unique($access_code, $table_name) { 
     $this->CI->form_validation->set_message('access_code_unique', $this->CI->lang->line('access_code_invalid')); 

     $where = array (
      'access_code' => $access_code 
     ); 

     $query = $this->CI->db->limit(1)->get_where($table_name, $where); 
     return $query->num_rows() === 0; 
    } 
} 

Teraz można łatwo dodać nowy utworzona reguła

$this->form_validation->set_rules('access_code', $this->lang->line('access_code'), 'trim|xss_clean|access_code_unique[users]'); 
Powiązane problemy