2017-12-09 2 views
1

私は今、私は唯一の1を検証する必要があり、最大10のみ1つの配列[] CodeIgniterのフォームバリデーションにおける10の分野から必要とされる

に複数のユーザーを追加することができます1人の追加ユーザーフォームを持っていますフィールドはform_validationのルールで必要です。しかし、私が今必要としているのは、固定フィールドではありません。を検証しました。したがって、フォーム内のランダム化フィールドに関するデータを送信できます。 (利用可能な10のフィールドがあり、必要なフィールドは1つだけ必要ですが、もう一度固定フィールドではない固定フィールドを試して、本当に私を悩ましていたからです)。すべてuser[]のフィールドが必要になるので、私はrequireduser[]に検証ルールを追加しようとしている

if (! empty($this->input->post('user', TRUE))) 
{ 
    $this->form_validation->set_rules('user[]', 'User', 'trim|alpha_numeric|min_length[2]'); 
} 

コントローラの関数内

<form action="x" method="post" class="form-horizontal"> 
<?php for ($i=1; $i<=10; $i++) { ?> 
    <div class="form-group"> 
     <label class="control-label col-sm-3">Username <?php echo $i; ?></label> 
     <div class="col-sm-9"> 
     <input type="text" class="form-control" name="user[]"> 
     </div> 
    </div> 
<?php } ?> 

検証ルールは、その作業はありません。

次に、$this->form_validation->set_rules('user[0]', 'User', 'trim|required|alpha_numeric|min_length[2]');をフォーム検証規則に追加しようとしています。そのため、コードは次のようになります。それが正常に一つのフィールドのために検証された

if (! empty($this->input->post('user', TRUE))) 
{ 
    $this->form_validation->set_rules('user[0]', 'User', 'trim|required|alpha_numeric|min_length[2]'); 
    $this->form_validation->set_rules('user[]', 'User', 'trim|alpha_numeric|min_length[2]'); 
} 

は、それが配列0Username 1分野で必要とされています。 しかし、たまにはUsername 1に1人の新規ユーザーしか入力できないことがあります。

Username 4またはUsername 9にカーソルが近くにあるので、ときどき入力するのが本当に簡単だったので、

user[]フィールドは、フィールドが1つでも必要な場合のみ必要です。 Username 3のようにおそらくUsername 7にあります。

答えて

1

あなたform_validationのルールを作成する前foreachを使用して簡単な検証を行うことができます。

form_validationから必要なものを削除するだけで、データが有効でないことを検証する必要がある場合は、ヘルパー変数を1つ以上使用してその操作を行うことができます。たとえば、$data = 0を使用しています。 $this->input->post('user', TRUE);入力はすべて、その後、空$dataまだ0に設定されている場合はnullが送信されたユーザーフィールドであるとされていない場合

$data = 0; 
$user = $this->input->post('user', TRUE); 
foreach ($user as $u) { 
    if ($u != '') 
    { 
     $data++ 
    } 
} 

if ($data == 0) { /* then set some message to said "At least 1 data required" */ } 
else 
{ 
    $this->form_validation->set_rules('user[]', 'User', 'trim|alpha_numeric|min_length[2]'); 
} 

// then validate if form_validation run 
if ($this->form_validation->run()) 
{ 
    // your code.. 
} 

これは、$dataが設定され検証されます++ 1.だから、入力することができますデータをuser 1またはuser 8または任意のフィールドに入力してください。

$data1以上になった後、あなたはform_validation新しいルールの検証を設定し、その後、あなたのコードはform_validationルールにおける要件を検証一致した場合に実行されます。

form_validationの要件がflashdataを使用して一致する場合、データが正常に送信されたことを確認できます。要件が一致しないかどうかをチェックするには、elseを使用します。

if ($this->form_validation->run()) 
{ 
    $this->session->set_flashdata('message', 'We got your submitted user : '.$data.' username'); 
} 
+0

これは機能します!非常にシンディーありがとうございます。 – Zinc

0

短い回答、いいえ。

フォーム検証ライブラリのメイン実行関数を見ると、$_POSTフィールドが配列であるかどうかを確認し、そうであれば、配列の各項目で検証関数を個別に実行します。これを確認するには、独自の検証関数を記述し、関数の先頭に何かをエコーし​​ます。アイテムごとに1回の繰り返しが実行されます。以下のような

public function required_array($unused, $config) { 
    $config = explode(',', $config); 
    $items = $_POST[$config[0]]; 
    $i = 0; 
    foreach ($items as $item) { 
     if (!empty($item)) { 
      $i++; 
     } 
    } 
    //echo 'num items: ' . $i; 
    $req = isset($config[1]) ? $config[1] : 1; 
    if ($i < $req) { 
     $this->set_message('required_array', 'Atleast ' . $req . ' {field} must be filled in.'); 
     return false; 
    } else { 
     return true; 
    } 
} 

使用:$this->form_validation->set_rules('user[]', 'User', 'required_array[user, 3]');

しかしだけではなく、これは、これが到達することはありません、ハックであることをあなたはライブラリ/ MY_Form_validation.phpに、このようなルールを作ることができると述べた状態で

CIに特別な処理方法があるため、配列に項目がない場合は、システムファイルであるために関数を追加することはできません。ここで

は、作業からソリューションを防ぎ、検証からのコードのセクションは次のとおりです。

if (
     ($postdata === NULL OR $postdata === '') 
     && $callback === FALSE 
     && $callable === FALSE 
     && ! in_array($rule, array('required', 'isset', 'matches'), TRUE) 
    ) 
    { 
     continue; 
    } 

だからあなたの最善の策は、一つは、CIの検証の外側に充填されているかどうかを確認することです。

+0

アレックスありがとうございます! – Zinc

+0

ようこそ。この回答が投票を助けた場合は歓迎です:) – Alex

関連する問題