web-dev-qa-db-ja.com

カスタムcodeigniter検証ルールの作成

私のログインフォームには、電子メールとパスワードがデータベースの値と一致するかどうかをチェックする機能があり、一致する場合は、ユーザーをシステムにログインさせます。

この関数がfalseを返す場合、検証エラーを表示したいと思います。

私の問題は、これを作成する方法がわからないことです。メッセージはパスワードと電子メールの両方のフィールドに関連しているため、各入力フィールドに1つのメッセージを表示するだけのルールは必要ありません。

これを達成するためにflashdataを使用してみましたが、ページが更新されたときにのみ機能します。

関数$this->members_model->validate_member()専用の新しい検証ルールを作成するにはどうすればよいですか?

$this->form_validation->set_error_delimiters('<div class="error">', '</div>');
        $this->form_validation->set_rules('email_address', '"Email address"', 'trim|required|valid_email');
        $this->form_validation->set_rules('password', '"Password"', 'trim|required');

        if ($this->form_validation->run() == FALSE)
        {
            $viewdata['main_content'] = 'members/login';
            $this->load->view('includes/template', $viewdata);
        }
        else
        {       
                if($this->members_model->validate_member())
                {
24
hairynuggets

callback_ルールの例: callbacks を参照してください。

$this->form_validation->set_rules('email_address', '"Email address"', 'trim|required|valid_email|callback_validate_member');

コントローラにメソッドを追加します。このメソッドは、TRUEまたはFALSEを返す必要があります

function validate_member($str)
{
   $field_value = $str; //this is redundant, but it's to show you how
   //the content of the fields gets automatically passed to the method

   if($this->members_model->validate_member($field_value))
   {
     return TRUE;
   }
   else
   {
     return FALSE;
   }
}

次に、検証が失敗した場合に対応するエラーを作成する必要があります

$this->form_validation->set_message('validate_member','Member is not valid!');
47
Damien Pirsy

これを実現する最良の方法の1つは、CodeIgniterのフォーム検証ライブラリを拡張することです。データベーステーブルusersのフィールドaccess_code_uniqueaccess_codeという名前のカスタムバリデーターを作成するとします。

MY_Form_validation.phpディレクトリにapplication/librariesという名前のClassファイルを作成するだけです。メソッドは常にTRUE OR FALSEを返す必要があります

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

class MY_Form_validation extends CI_Form_validation {
    protected $CI;

    public function __construct() {
        parent::__construct();
            // reference to the CodeIgniter super object
        $this->CI =& get_instance();
    }

    public function access_code_unique($access_code, $table_name) {
        $this->CI->form_validation->set_message('access_code_unique', $this->CI->lang->line('access_code_invalid'));

        $where = array (
            'access_code' => $access_code
        );

        $query = $this->CI->db->limit(1)->get_where($table_name, $where);
        return $query->num_rows() === 0;
    }
}

これで、新しく作成したルールを簡単に追加できます

$this->form_validation->set_rules('access_code', $this->lang->line('access_code'), 'trim|xss_clean|access_code_unique[users]'); 
10
BoCyrill