2012-04-26 4 views
0

У меня есть следующий код:на функцию обратного вызова не показывать

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 

class Login extends MY_Controller 
{ 

function __construct() 
{ 
    parent::__construct(); 
    $this->load->model('users/user_model'); 
    $this->load->library('form_validation'); 
} 

function _load_login_page() 
{ 
    $this->load->model('sysconfig/sysconfig_model'); 

    $a = $this->sysconfig_model->get_sysconfig(); 
    $row = $a[0]; 

    $this->lang->load('klas',$row->sysconfig_language); 

    $data['sys_name'] = $row->sysconfig_system_name;   
    $data['template_name'] = $row->systemplate_name; 
    $data['css_script'] = base_url().'assets/'.$row->systemplate_name; 

    if($row->sysconfig_maintenance === 'Y') 
    { 
     $this->load->view('sysconfig/maintenance',$data); 
    } 
    else { 

     $this->load->view('login',$data); 
    } 
} 

function index() 
{    
    $this->form_validation->set_rules('username', 'Username', 'trim|required|max_length[12]|xss_clean|callback_check_auth'); 
    $this->form_validation->set_rules('password','Password','trim|required'); 

    if($this->form_validation->run($this) == FALSE) 
    { 
     $this->_load_login_page();  
    } else { 
     redirect('welcome','refresh'); 
    } 

} 

function check_auth() 
{ 
    if($this->user_model->authentication()) 
    { 
     return TRUE; 
    } 

    $this->form_validation->set_message('check_auth',$this->lang->line('invalid_username')); 
    return FALSE; 
} 
?> 

user_model.php

<?php 

class User_Model extends CI_Model 
{ 
function authentication() 
{ 
    $this->db->where('useracc_id', $this->input->post('username')); 
    $this->db->where('useracc_password', md5($this->input->post('password'))); 
    $q = $this->db->get('base_useracc'); 

    if($q->num_rows() == 1) 
    { 
     $session_data = array('isUserLogged'=>TRUE); 

     $this->session->set_userdata($session_data); 

     return TRUE; 
    } 
} 
?> 

здесь мы можем увидеть, если пользователь не заполнили имя пользователя и пароль поля , он покажет ошибку, и все будет работать так, как ожидалось. Проблема в том, что если пользователь указал неверное имя пользователя или пароль, сообщение об ошибке не будет отображаться.

для информации, я уже поставил $lang['invalid_username'] = 'Invalid username or password'; на файл с языком.

Я делаю это с использованием техники HMVC. Пожалуйста, помогите мне.

ответ

0

Вы, кажется, не передаете какие-либо данные своей функции обратного вызова. Функции обратного вызова ожидают, что значение поля ввода будет передано в качестве параметра. Я не думаю, что вы можете сделать эту работу обратным вызовом проверки формы, потому что метод аутентификации, по-видимому, должен знать как пароль, так и имя пользователя. В настоящее время вы не передаете какие-либо данные в свой метод check_auth или, действительно, в свой метод user_model-> authentication(). Вот почему form_validation игнорирует это.

Вместо того, чтобы вызывать check_auth как обратный вызов, почему бы не запустить сначала form_validation (это действительно то, для чего это необходимо - проверка правильности и дезинфекции данных), а затем передать значения из вашей формы в вашу функцию check_auth как часть если утверждение. Вы не сможете использовать метод form_validation set_message для отображения ошибок, но я думаю, что это более чистый подход.

Подводя итог, используйте form_validation для проверки данных, которые вы получаете, в порядке и отобразите соответствующие сообщения, если это не так. Аутентификация пользователя на основе этой информации - это отдельная процедура, которая, как мне кажется, не относится к проверке. Вы видите разницу?

+0

Я пытаюсь реализовать другую функцию входа, используя тот же код, но тот не является hmvc, и он работает. – softboxkid

0

из вики страницы HMVC:

При использовании формы проверки с MX вам нужно будет расширить класс CI_Form_validation, как показано ниже, перед назначением регулятора тока в качестве переменных $ CI в библиотеку form_validation. Это позволит вашим методам обратного вызова функционировать должным образом. (Это также обсуждалось на форумах CI). то есть:

<?php 
/** application/libraries/MY_Form_validation **/ 
class MY_Form_validation extends CI_Form_validation 
{ 
    public $CI; 
} 

<?php 
class Xyz extends MX_Controller 
{ 
    function __construct() 
    { 
     parent::__construct(); 

     $this->load->library('form_validation'); 
     $this->form_validation->CI =& $this; 
    } 
} 
Смежные вопросы