2011-11-18 8 views
18

Ho una funzione nel mio modulo di accesso che controlla se l'e-mail e la password corrispondono ai valori nel database e, in tal caso, registrano l'utente nel sistema.Creazione di una regola di convalida del codeign personalizzato

Vorrei visualizzare un errore di convalida se questa funzione restituisce false.

Il mio problema è che non sono sicuro su come procedere per la creazione di questo. Il messaggio riguarda sia la password che i campi di posta elettronica, quindi non vorrei che una regola per ogni campo di input mostri semplicemente un singolo messaggio.

Ho provato a utilizzare flashdata per ottenere ciò, ma funziona solo quando la pagina è stata aggiornata.

Come è possibile creare una nuova regola di convalida esclusivamente per la funzione $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()) 
       { 

risposta

38

si utilizza il callback_ nelle regole, vedere callbacks, ad es.

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

e aggiungere il metodo nel controller. Questo metodo deve restituire VERO o FALSO

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; 
    } 
} 

È quindi necessario creare un corrispondente errore nel caso in cui la convalida non riesce

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

Nome "_validate_member" sarà meglio .. – Ivan

+0

@Ivan Non è necessario, ma può aggiungere su leggibilità, grazie –

+6

Potrebbe non essere necessario, ma un trattino basso principale impedirà l'accesso al metodo tramite "/ controller_name/validate_member/blah" ... e l'utilizzo di un doppio trattino basso è perfettamente accettabile IMO "callback__validate_member";) –

5

Un modo migliore per raggiungere questo obiettivo si sta estendendo libreria Form Validation di CodeIgniter. Diciamo che vogliamo creare un validatore personalizzato chiamato access_code_unique per il campo access_code della tabella del database users.

Tutto ciò che dovete fare è creare un file di classe denominato MY_Form_validation.php nella directory application/libraries. Il metodo deve sempre tornare TRUE O 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; 
    } 
} 

Ora è possibile aggiungere facilmente la tua nuova regola creata

$this->form_validation->set_rules('access_code', $this->lang->line('access_code'), 'trim|xss_clean|access_code_unique[users]'); 
Problemi correlati