-1

カスタムフォームエラーを入力しようとすると、ユーザーに「アカウントがありません。ここをクリックしてサインアップしてください。しかし、現時点では、正しくないユーザー名を入力するとビューに何も表示されません。私のプロファイル データベースに存在します. 私は、autoload.php ファイルで既に定義したこのエラーをロードする lang ファイルを持っています: $autoload['language'] = array('myerrors'); ビューに問題がありますか? I form_error 行を使用する必要があると思いますが、正確な場所ではありません... 定義されたエラーの名前は validateUser_error です。

モデル:

   function validateUser($username, $password)
     {
      $this->db->select('*')->from('membership');
      $this->db->where('username', $username);
      $this->db->where('password', $password);
      $query = $this->db->get();
      if ($query ->num_rows ==1)
     {
        $this->form_validation->set_message('validateUser_error');

        return true;
    }

    else{
        return false;

       }
    }

意見:

<?php echo validation_errors(); ?>

<?=form_open('login/loguserin');?>
  <p>
    username <?=form_input('username');?>
  </p>
  <p>
    password <?=form_password('password');?>
  </p>
  <p>
  <?=form_submit('submit', 'Login'); ?>
  <?=form_close(); ?>
</p>

コントローラ:

関数 loguserin()

{

$this->load->helper(array('form', 'url'));

$this->load->library('form_validation');

$this->form_validation->set_rules('username', 'Username', 'required|min_length[4]|max_length[12]|callback_validateUser_error|trim');
$this->form_validation->set_rules('password', 'Password', 'required|md5|trim');


$username = $this->input->post('username');
$password = $this->input->post('password');

$valid = $this->membership->validateUser($username, $password);

if ($this->form_validation->run() && $valid == true)
{
    $this->session->set_userdata('status', 'OK');
    $this->session->set_userdata('username', $username);

    redirect('home');
}
else
{
    $this->session->set_userdata('status', 'NOT_OK');
    $this->load->view('shared/header');
    $this->load->view('account/logintitle');
    $this->load->view('account/loginview');
    $this->load->view('shared/footer');
}
}
4

2 に答える 2

0

モデルメソッドを変更して、trueまたはfalseを返すようにします。失敗した場合にビューに表示するメッセージを作成します。

 if( $this->membership->validateUser($username, $password) == false ) 
 {
      $data['error_msg'] = 'OMG what is up with your fat fingers? ';
      // load view, pass $data, $error_msg will be available in yr view
      $this->load->view('account/loginview', $data);
 } 
 else
 {
      // keep going 

 }

また、ユーザー名を確認してからパスワードを確認すると、より多くのオプションが表示されます。

それを行う別の方法は、失敗した場合は別のメソッドを用意し、$this->error_msgなどを使用することです。特に、多数のビューをロードしている場合は、それを繰り返す必要はありません。

 if( $this->membership->validateUser($username) == false ) 
  {
  $this->error_msg = 'No user by that name ';   
  $this->loginFail();
  } 
  elseif( $this->membership->validatePass($password) == false ) 
  {
  $this->error_msg = 'Password does not match this user name';   
  $this->loginFail();
  }

次に、loginFail()でビューをロードすると、適切なエラーメッセージが自動的にビューに渡されます。

 $data['error_msg'] = $this->error_msg ;   
于 2012-12-23T01:42:29.527 に答える
0

このメッセージをモデルに設定するのは少し奇妙です-そうするための通常の場所はコントローラーです...

また、自動ロードを行う場合form_validation、なぜコントローラーに再度ロードするのですか?また、そうでない場合でも、メッセージをモデルに設定する場合は、モデルにロードする必要があります。

ただし、重要なことは、関数がfalseを返した場合にのみ検証メッセージが表示されるvalidateUser_errorことです。この関数は、サンプルに存在していないようです。

コードを変更するにはさまざまな方法がありますが、基本的に、validateUser()はvalidateUser_error()(検証ルールに含まれているため、CIによって自動的に呼び出されます)によって呼び出される必要があります。これにより、フォームフィールドからデータを取得し、無条件に呼び出すことができます。

$this->form_validation->set_message('validateUser_error', 'Error message');

お役に立てば幸いです。

于 2012-12-22T21:34:04.953 に答える