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