私は Codeigniter を初めて使用し、Codeigniter 2.1.3 を使用しています。
シナリオ:
私は「レッスン」の記録を持っています。
「Lesson」はゼロまたは複数の「Lesson_student」レコードを持つことができます。
各 'Lesson_student' レコードには、支払いタイプと支払い金額 (すべての必須フィールド) が必要です。
その生徒の payment_type (その 'Lesson_student' レコード内) に応じて、金額には異なる検証ルールがあります。
例えば、
その特定の「Lesson_student」レコードの payment_type が「前払い」の場合、金額は 0 でなければなりません。
その特定の 'Lesson_student' レコードの payment_type が 'Discount code' の場合、金額は 0 より大きくなければなりません (何でもかまいません)。
私のフォームでは、jquery を使用して「Lesson Student」フィールドを動的に作成するため、各「Lesson_student」レコードには次のフィールドが含まれます。
<input type="text" name="student_names[]" />
<input type="text" name="payment_types[]" />
<input type="text" name="payment_amounts[]" />
フォームを送信すると、次のようになります。
Array
(
[student_names] => Array
(
[0] => Test name 1
[1] => Test name 2
)
[payment_types]=> Array
(
[0] => Discount
[1] => Pre-pay
)
[payment_amounts] => Array
(
[0] => 5
[1] => 0
)
)
ここに質問があります:
質問 1:
次のように検証ルールを設定した場合:
array(
'field' => 'student_names[]',
'label' => 'Student name',
'rules' => 'trim|xss_clean'
),
array(
'field' => 'payment_types[]',
'label' => 'Payment type',
'rules' => 'trim|xss_clean'
),
array(
'field' => 'payment_amounts[]',
'label' => 'Payment amount',
'rules' => 'trim|xss_clean'
),
「Lesson」レコードに0 個以上の「Lesson_student」レコードを含めることを許可します。
ただし、この設定では、student_name または payment_type のない 'Lesson_student' レコードを検出できません。
例えば
Array
(
[student_names] => Array
(
[0] =>
[1] => Test name 2
)
[payment_types]=> Array
(
[0] => Discount
[1] =>
)
[payment_amounts] => Array
(
[0] => 5
[1] => 0
)
)
しかし、検証ルールを次のように設定した場合:
array(
'field' => 'student_names[]',
'label' => 'Student name',
'rules' => 'trim|xss_clean|required'
),
array(
'field' => 'payment_types[]',
'label' => 'Payment type',
'rules' => 'trim|xss_clean|required'
),
array(
'field' => 'payment_amounts[]',
'label' => 'Payment amount',
'rules' => 'trim|xss_clean|required'
),
私の「Lesson」レコードには、少なくとも 1 つの「lesson_student」レコードが必要になりましたが、これも正しくありません。
質問: 両方を同時に達成できる方法はありますか?
質問 2:
上記の検証設定のいずれかを使用すると、同じ「Lesson_student」レコードの他のフィールドとは関係なく、各フィールドを個別に確認することしかできません
検証ルールのセットアップで値 $_POST['payment_types'][1] に対して値 $_POST['payment_amounts'][1] を検証する方法はありますか?
どんな助けでも素晴らしいでしょう。
ありがとう
================================================== ====================
[編集] ここに記載されている手法を使用して解決策を見つけました:動的フォーム入力名の codeigniter フォーム検証
$_POST データをループし、$_POST データに基づいて「Lesson_student」配列を作成しました。したがって、次のようになります。
Array
(
[0] => Array
(
[student_name] => Test name 1
[payment_type] => Discount
[payment_amount] => 5
)
[1] => Array
(
[student_name] => Test name 2
[payment_type] =>
[payment_amount] => 0
)
)
次に、私のモデルでは
foreach ($lesson_students as $index => $info) {
$this->form_validation->set_rules('student_names[' . $index . ']', 'Student name', 'trim|required');
$this->form_validation->set_rules('payment_types[' . $index . ']', 'Payment type', 'trim|required');
$rule = 'trim|required|numeric';
$rule .= ($info['payment_type'] == 'Discount') ? '|greater_than[0]' : '';
$this->form_validation->set_rules('payment_amounts[' . $index . ']', 'Payment Amount', $rule);
}