2010-08-20 19 views
5

tengo este controlador configurado para un inicio de sesión:Formulario CodeIgniter Validación de devolución de llamada de comprobar múltiples campos

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


    } 

} 

Lo que estoy viendo es la línea que hace la devolución de llamada de validación de formularios >>$this->form_validation->set_rules(array('username','password'), 'Username', 'callback_terminal_login_check[$username,$password]');

que sé esto no está bien. Básicamente, lo que quiero hacer es verificar el nombre de usuario y la contraseña con el modelo Autenticación-> DoTerminalAuthentication para procesar el inicio de sesión del usuario. Quiero pasar los campos $username y $password. Aquí está mi vista de formulario si ayuda:

<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

Si alguna de las respuestas respondido a su pregunta que realmente debe aceptar uno. Encontrarás personas menos inclinadas a ayudarte en el futuro si no lo haces. – musoNic80

Respuesta

9

Según tengo entendido, la validación de formularios funciona campo por campo. Para lograr lo que desea, adjuntaré la devolución de llamada a uno de los campos (probablemente sea el mejor el campo de contraseña) y luego accederé a los otros datos del campo de formulario usando la matriz POST global. De esta forma, no es necesario pasar nada a la función de devolución de llamada como parámetros.

7

Use esto en su controlador para establecer sus reglas de validación.

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

Y una devolución de llamada algo como esto. Usaría un modelo si comparas tus datos de publicación con una base de datos.

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

Edición 07/09/2013: Se ha añadido requerido campo de regla de validación de contraseña de modo que no tiene que golpear la base de datos si alguien no añadir una contraseña.

+1

+1 Esto es mucho mejor que usar globals, ya que codeigniter recomienda utilizar la clase de entrada en lugar de publicar globales. –

2

Prefiero usar la validación de formularios para la validación de entradas simples como buscar campos vacíos, direcciones de correo electrónico no válidas, contraseñas demasiado cortas, etc. Tiendo a no usar la validación de formularios para una lógica más compleja como la autenticación. Pondría la verificación de autenticación en el método de acción en lugar de en una función de devolución de llamada de validación. Sería superar su problema particular al lado de paso.

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

Y luego, en la vista que se puede colocar debajo de este formulario de acceso

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