2

私は 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);
}
4

0 に答える 0