web-dev-qa-db-ja.com

2つの引数をコールバックに渡すCodeigniter

「id」と「url」という2つのフィールドを持つフォームを投稿した後、次のコードを取得します。

_$this->load->library('form_validation');
$this->form_validation->set_rules('id', 'id', 'trim|xss_clean');
$this->form_validation->set_rules('url', 'url|id', 'trim|xss_clean|callback_url_check');
_

Dbクエリには両方のフィールドが必要です。

関数url_check($ str、$ id)が呼び出されますが、この場合、「id」の値は常に0です。

私がやるだけなら:

_$this->form_validation->set_rules('url', 'url', 'trim|xss_clean|callback_url_check');
_

そして、url_check($str)を呼び出します。

問題は、どのように2つの値をurl_check($str, $id)に渡すかです。

25
pigfox

$ this-> input-> postを直接使用できます:

function check_url() {
   $url = $this->input->post('url');
   $id = $this->input->post('id');

   // do some database things you need to do e.g.
   if ($url_check = $this->user_model->check_url($url, $id) {
       return TRUE;
   }
   $this->form_validation->set_message('Url check is invalid');
   return FALSE;
}
47
Teej

説明されているように、それを正しい方法で(少なくともCI 2.1+の場合) ドキュメントで

$this->form_validation->set_rules('uri', 'URI', 'callback_check_uri['.$this->input->post('id').']');
// Later:
function check_uri($field, $id){
    // your callback code here
}
33
Philipp

これも機能するようです。

$id = 1;

$this->form_validation->set_rules('username', 'Human Username', 'callback_username_check['.$id.']');

function username_check($str, $id) {
    echo $id;
    if ($str == 'test') {
         $this->form_validation->set_message('username_check', 'The %s field can not be the Word "test"');
         return FALSE;
    }
    else {
    return TRUE;
    }
}
9
Ash

Form_validationを正しく理解している場合、各ルール(set_rules)はフォームの1つのフィールドに対するものであり、コールバックは1つのフィールドのみをチェックします。あなたの場合、「id」は範囲外と思われます。代わりに、配列をset_rules関数に渡して、コールバックを行うことができます。私はまだこれを試していません。 http://codeigniter.com/user_guide/libraries/form_validation.html#validationrulesasarray

2
Mike

他の回答で提案されているように、コールバックパラメータの使用に関する注意事項。検証ルールの作成に_app/config/form_validation.php_を使用している場合、$this->input->post('parameter')構文は機能しません。そのオブジェクトは、その内容を読み取る実行の時点ではCIローダーで使用できないためです。ファイル。あなたはあなたのコールバックルーチンで呼び出しを行う必要があります。 :

_public function _validate_user_signup($username, $password) {
  $var = $this->input->post('password');
_

この場合、メソッドに渡される2番目のパラメーターにはパスワードが含まれませんが、$ varは呼び出し後に含まれます。

私はそれが明確であることを望みます。マット

1
Matt G

検証されているデータを取得するには、フォーム検証ライブラリを使用することをお勧めします。

データが$ _GETまたは$ _POSTになるとは限りません( https://www.codeigniter.com/userguide3/libraries/form_validation.html#validating-an-array-other-than-post を参照) )。

検証コールバック内でデータにアクセスする最良の方法は次のとおりです。

$this->form_validation->validation_data

「validation_data」は、CI_Form_validationクラスのパブリックプロパティです。

1
Beto Aveiga