2010-08-20 15 views
5

Ich habe diesen Controller für ein Login einrichten:Codeigniter Form Validation Rückruf Überprüfung mehrere Felder

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


    } 

} 

Was bei Suche ist die Linie, die die Formularvalidierung Callback funktioniert >>$this->form_validation->set_rules(array('username','password'), 'Username', 'callback_terminal_login_check[$username,$password]');

Ich weiß, Das ist nicht richtig. Grundsätzlich möchte ich den Benutzernamen und das Passwort für das Authentication-> DoTerminalAuthentication-Modell überprüfen, um die Benutzeranmeldung zu verarbeiten. Ich möchte die Formularfelder $username und $password übergeben. Hier ist meine Formularansicht, wenn es hilft:

<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

Wenn eine der Antworten Ihre Frage beantwortet man wirklich sollte man annehmen. Sie werden Menschen finden, die weniger geneigt sind, Ihnen in der Zukunft zu helfen, wenn Sie das nicht tun. – musoNic80

Antwort

9

Wie ich es verstehe, funktioniert Formularvalidierung Feld für Feld. Um das zu erreichen, was Sie wollen, würde ich den Callback an eines der Felder anhängen (wahrscheinlich würde das Passwortfeld am besten sein) und dann auf die anderen Formularfelderdaten mit dem globalen POST-Array zugreifen. Auf diese Weise müssen Sie der Callback-Funktion nichts als Parameter übergeben.

7

Verwenden Sie dies in Ihrem Controller, um Ihre Validierungsregeln festzulegen.

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

Und ein Rückruf etwas wie dieses. Ich würde ein Modell verwenden, wenn Sie Ihre Postdaten mit einer Datenbank vergleichen.

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

bearbeiten 2013.07.09: hinzugefügt erforderlich Feld Gültigkeitsregel Passwort, so dass Sie getroffen haben, um die DB nicht, ob jemand ein Passwort nicht hinzugefügt werden.

+1

+1 Dies ist viel besser als die Verwendung von Globals, da Codeigniter ermutigt, die Eingabe-Klasse anstelle von Post-Globals zu verwenden. –

2

Ich bevorzuge Formularvalidierung für einfache Eingabe-Validierung wie die Überprüfung auf leere Felder, ungültige E-Mail-Adressen, zu kurze Passwörter usw. Ich neige dazu, Formularvalidierung für komplexere Logik wie Authentifizierung zu verwenden. Ich würde die Authentifizierungsüberprüfung in der Aktionsmethode statt in einer Validierungsrückruffunktion platzieren. Es würde über Ihr spezielles Problem hinausgehen, indem Sie es beiseite legen.

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

Und dann in der Ansicht können Sie unten Ihre Login-Formular platzieren diese

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