Codeigniter - 如何验证动态输入字段列表,其中验证规则依赖于另一个动态创建的字段

时间:2013-05-18 12:49:16

标签: codeigniter validation dynamic

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

情境:

我有一个'课程'记录,

'课程'可以有零或多个'Lesson_student'记录,

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

取决于该学生的payment_type(在'Lesson_student'记录中),该金额具有不同的验证规则。

例如,

如果特定“Lesson_student”记录的payment_type为“预付款”,则金额必须为0,

如果特定'Lesson_student'记录的payment_type是'折扣代码',那么金额必须大于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
        )
)

问题出在此处:

问题一:

如果我按照以下方式设置验证规则:

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

我允许“课程”记录 0或更多'Lesson_student'记录,

但是,使用此设置,如果没有student_name或payment_type,我将无法检测到“Lesson_student”记录。

E.g

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'记录,这也是不对的。

问题:无论如何我可以同时实现这两个目标吗?

问题二:

上述任何验证设置只允许我以相同的'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);
}

0 个答案:

没有答案