2010-08-20 9 views
5

ho questo controller impostato per un login:Codeigniter Form Validation richiamata controllo più campi

<?php 
class Login extends Controller { 

    function __construct() { 
     parent::Controller(); 
     $this->form_validation->set_error_delimiters('', ''); 
     $this->output->enable_profiler(TRUE); 
    } 

    function index(){ 

     redirect('/login/terminal'); 

    } 

    function terminal() { 
    // terminal login 

     $this->form_validation->set_rules(array('username','password'), 'Username', 'callback_terminal_login_check[$username,$password]'); 
     if ($this->form_validation->run() == FALSE) { 
      $this->load->view('login_header'); 
      $this->load->view('login_terminal'); 
      $data['version'] = $this->master->GetVersion(); 
      $this->load->view('login_footer', $data); 
     } else { 
      redirect('/terminal'); 
     } 

    } 

    function terminal_login_check($username,$password) { 
    // callback function to perform terminal login 

     if ($this->authentication->DoTerminalAuthentication($username,$password)) { 
      echo $username; 
      return TRUE; 
     } else { 
      $this->form_validation->set_message('terminal_login_check', 'Invalid'); 
      return FALSE; 
     } 


    } 

} 

Quello che sto guardando è la linea che fa il callback validazione dei form >>$this->form_validation->set_rules(array('username','password'), 'Username', 'callback_terminal_login_check[$username,$password]');

lo so Questo non è giusto. Fondamentalmente quello che voglio fare è controllare il nome utente e la password contro il modello Autenticazione-> DoTerminalAuthentication per elaborare il login dell'utente. Voglio passare i campi del modulo $username e $password. Qui è la mia vista modulo se aiuta:

<div id="title">Terminal Login</div> 
<?php 
    if (validation_errors()) { 
     echo '<div id="error">' . validation_errors() . '</div>'; 
    } 
?> 

<?=form_open('login/terminal');?> 
<?=form_label('Username', 'username')?><br /> 
<?=form_input(array('id'=>'username','name'=>'username','value'=>set_value('username')))?><br /> 
<?=form_label('Password', 'password')?><br /> 
<?=form_password(array('id'=>'password','name'=>'password'))?><br /> 
<?=form_submit(array('name'=>'passwordsubmit','value'=>'Login >>'))?><br /> 
<?=form_close();?> 
+0

Se nessuna delle risposte risposto alla tua domanda si dovrebbe accettare uno. Troverai persone meno inclini ad aiutarti in futuro, se non lo fai. – musoNic80

risposta

9

Da quanto ho capito, la validazione dei form lavora su un campo da basi campo. Per ottenere ciò che desideri, associo il callback a uno dei campi (probabilmente il campo della password sarebbe il migliore) e quindi accedo agli altri dati del campo modulo utilizzando l'array POST globale. In questo modo non è necessario passare nulla alla funzione di callback come parametri.

7

Utilizzare questo nel controller per impostare le regole di convalida.

$this->form_validation->set_rules('username', 'Username', 'required'); 
$this->form_validation->set_rules('password', 'Password', 'required|callback_terminal_login_check'); 

E una richiamata simile a questa. Userò un modello se stai confrontando i dati del tuo post con un database.

function terminal_login_check() 
{ 
    $username = $this->input->post('username'); 
    $password = $this->input->post('password'); 

    // LOAD MODEL HERE 

    if ($this->authentication->DoTerminalAuthentication($username, $password)) 
    { 
    echo $username; 
    return TRUE; 
    } 
    else 
    { 
    $this->form_validation->set_message('terminal_login_check', 'Invalid'); 
    return FALSE; 
    } 
} 

Edit 2013/07/09: Aggiunto campo richiesto per regola di convalida password in modo che non c'è bisogno di colpire il DB se qualcuno non aggiungere una password.

+1

+1 Questo è di gran lunga migliore rispetto all'utilizzo di globals, in quanto il codeigniter incoraggia a utilizzare la classe di input anziché i globali post. –

2

Preferisco utilizzare la convalida del modulo per una semplice convalida dell'input come il controllo di campi vuoti, indirizzi email non validi, password troppo brevi ecc. Tendo a non usare la convalida del modulo per una logica più complessa come l'autenticazione. Metterei il controllo di autenticazione nel metodo di azione piuttosto che in una funzione di callback di convalida. Avrebbe superato il tuo particolare problema spostandolo lateralmente.

function terminal() 
{ 
    $this->form_validation->set_rules('username', 'Username', 'required'); 
    $this->form_validation->set_rules('password', 'password', 'required'); 

    if ($this->form_validation->run()) 
    { 
     $username = $this->input->post('username'); 
     $password = $this->input->post('password'); 

     if ($this->authentication->DoTerminalAuthentication($username, $password)) 
     { 
      // Handle successful login 
     } 
     else 
     { 
      // Authentication failed. Alert the view. 
      $this->load->view('terminal', array('login_failed' => true)); 
     } 
    } 
    else 
    { 
     $this->load->view('terminal', array('login_failed' => false)); 
    } 
} 

E poi nella vista è possibile inserire questo sotto il form di login

<?php if ($login_failed) : ?> 
    <span id="login-failed-message">Login failed</span> 
<?php endif; ?>