2010-08-20 92 views
5

我有這個控制器設置爲登錄:笨表單驗證回調檢查多個字段

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


    } 

} 

我所看到的是,做表單驗證回調>>$this->form_validation->set_rules(array('username','password'), 'Username', 'callback_terminal_login_check[$username,$password]');

我知道行這個不對。基本上我想要做的是檢查用戶名和密碼對照Authentication-> DoTerminalAuthentication模型來處理用戶的登錄。我想通過$username$password表單字段。這是我的表單視圖,如果它有幫助:

<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

如果有任何問題的答案回答了你的問題,你真的應該接受一個。如果不這樣做,你會發現人們不太願意在未來幫助你。 – musoNic80 2010-08-27 06:37:41

回答

9

據我所知,表單驗證在字段的基礎上工作。爲了實現你想要的,我會將回調附加到其中一個字段(可能密碼字段最好),然後使用全局POST數組訪問其他表單字段數據。這樣你就不需要將任何東西作爲參數傳遞給回調函數。

7

在您的控制器中使用它來設置您的驗證規則。

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

和一個像這樣的回調。如果您將發佈數據與數據庫進行比較,我會使用模型。

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

編輯2013年7月9日:添加所需字段密碼驗證規則,這樣你就不必打DB如果有人不添加密碼。

+1

+1這比使用全局變量要好得多,因爲codeigniter鼓勵使用輸入類來代替全局變量。 – 2013-06-22 13:44:52

2

我更喜歡使用表單驗證來進行簡單的輸入驗證,比如檢查空字段,無效的電子郵件地址,太短的密碼等等。我傾向於不對更復雜的邏輯如驗證使用表單驗證。我會把認證檢查放在action方法而不是驗證回調函數中。它會通過旁路來解決您的特定問題。

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

然後在視圖中,您可以把這個下方的登錄表單

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