我是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);
}