2

我是 Codeigniter 的新手,我正在使用 Codeigniter 2.1.3。

设想:

我有一个“课程”记录,

“Lesson”可以有零个或多个“Lesson_student”记录,

每个“Lesson_student”记录都需要一个 payment_type 和一个付款金额(所有必填字段),

根据该学生的 payment_type(在“Lesson_student”记录中),金额有不同的验证规则。

例如,

如果该特定 'Lesson_student' 记录的 payment_type 是 'Pre-pay',则金额必须为 0,

如果该特定“Lesson_student”记录的 payment_type 是“折扣码”,则金额必须大于 0。(可以是任何值)

在我的表单中,我使用 jquery 动态创建“课程学生”字段,因此每个“课程学生”记录将具有以下字段:

<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
        )
)

问题来了:

问题一:

如果我将验证规则设置如下:

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_student”记录的其他字段无关

在我的验证规则设置中,我有什么方法可以根据值 $_POST['payment_types'][1] 验证值 $_POST['payment_amounts'][1] 吗?

任何帮助都会非常有用。

谢谢

==================================================== =====================

[编辑] 找到了一个解决方案,使用这里提到的技术:codeigniter form validation for dynamic form input names

我遍历了 $_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