2010-08-20 27 views
5

Tôi có điều khiển này thiết lập cho một tên đăng nhập:CodeIgniter Form Validation Callback kiểm tra nhiều lĩnh vực

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


    } 

} 

Những gì tôi nhìn vào là dòng mà không gọi lại xác nhận hình thức >>$this->form_validation->set_rules(array('username','password'), 'Username', 'callback_terminal_login_check[$username,$password]');

tôi biết điều này không chính xác. Về cơ bản những gì tôi muốn làm là kiểm tra tên người dùng và mật khẩu với mô hình Authentication-> DoTerminalAuthentication để xử lý đăng nhập của người dùng. Tôi muốn chuyển các trường biểu mẫu $username$password. Dưới đây là dạng xem biểu mẫu của tôi nếu nó giúp:

<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

Nếu bất kỳ câu trả lời đã trả lời câu hỏi của bạn, bạn thực sự phải chấp nhận một. Bạn sẽ tìm thấy những người ít có xu hướng giúp bạn trong tương lai nếu bạn không. – musoNic80

Trả lời

9

Như tôi đã hiểu, xác thực biểu mẫu hoạt động trên cơ sở từng trường. Để đạt được những gì bạn muốn, tôi sẽ đính kèm gọi lại đến một trong các trường (có lẽ trường mật khẩu sẽ là tốt nhất) và sau đó truy cập dữ liệu trường biểu mẫu khác bằng cách sử dụng mảng POST toàn cầu. Bằng cách này, bạn không cần truyền bất cứ thứ gì cho hàm gọi lại làm tham số.

7

Sử dụng tính năng này trong bộ điều khiển để đặt quy tắc xác thực của bạn.

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

Và gọi lại như thế này. Tôi muốn sử dụng một mô hình nếu bạn đang so sánh dữ liệu bài đăng của mình với cơ sở dữ liệu.

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

Chỉnh sửa 2013-07-09: Thêm trường bắt buộc vào quy tắc xác thực mật khẩu để bạn không phải nhấn DB nếu ai đó không thêm mật khẩu.

+1

+1 Điều này tốt hơn nhiều so với việc sử dụng các hình cầu, vì người viết mã khuyến khích sử dụng lớp đầu vào thay vì các hình cầu sau. –

2

Tôi thích sử dụng xác thực biểu mẫu để xác thực đầu vào đơn giản như kiểm tra trường trống, địa chỉ email không hợp lệ, mật khẩu quá ngắn, v.v. Tôi có xu hướng không sử dụng xác thực biểu mẫu cho logic phức tạp hơn như xác thực. Tôi muốn đặt kiểm tra xác thực trong phương thức hành động thay vì trong hàm gọi lại xác thực. Nó sẽ vượt qua vấn đề cụ thể của bạn bằng cách đẩy mạnh nó.

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

Và sau đó trong giao diện bạn có thể đặt này dưới hình thức đăng nhập của bạn

<?php if ($login_failed) : ?> 
    <span id="login-failed-message">Login failed</span> 
<?php endif; ?> 
Các vấn đề liên quan