我尝试通过勾选下拉菜单中的选项来更新学生班级列表。我选择了四个复选框。因此,调试正确显示248,268,244,1220。但由于“classroom_id”,我收到了错误Warning (2): Illegal string offset 'id' [APP/controllers/customers_controller.php, line 728]
。反正只是只显示所选复选框的列表?
我正在尝试通过选中复选框来更新多个记录/行。如何将多个选定的ID发送到控制器?
任何帮助将不胜感激。
<?php echo $form->input('classroom_id', array('type' => 'select','empty' => '-- Select --','label' => false,'style'=>'width:254px;', 'options' => $classesfiltered,'validate'=>'required:true','div'=>'formfield')); ?>
<?php foreach ($students as $student) { ?>
<?php echo $form->input('Customer.'.$student['Customer']['id'].'.id', array('type' => 'checkbox', 'id' => "admin_checkbox_".$student['Customer']['id'], 'label' => false)); ?>
<?php } ?>
CONTROLLER
foreach($this->data['Customer'] as $key => $item) {
if ($item['id']) {
Debugger::Dump($this->data['Customer'][$key]);
}
}
输出
Warning (2): Illegal string offset 'id' [APP/controllers/customers_controller.php, line 728]
"classroom_id"
248
268
244
1220
答案 0 :(得分:1)
你得到5个而不是4个值的原因是因为classes_id输入:
<?php echo $this->Form->input('classroom_id', array('type' => 'select','empty' => '-- Select --','label' => false,'style'=>'width:254px;', 'options' => $classesfiltered,'validate'=>'required:true','div'=>'formfield')); ?>
由于您没有在输入的名称中包含模型的名称(例如Customer.classroom_id),因此假设您要将其包含在当前模型中(假设您没有在表单中手动指定模型)元素,当然)。
这正确地返回了5个值。
但是,在您的控制器中,您假设您将获得的唯一数据是复选框而不是选择框。您正在遍历所有“客户”表单数据,而不仅仅是复选框。
我们有两种方法可以解决这个问题:
选项#1 :(推荐)修改表单输入,然后更新循环
<?php
echo $this->Form->input('Customer.classroom_id', array('type' => 'select','empty' => '-- Select --','label' => false,'style'=>'width:254px;', 'options' => $classesfiltered,'validate'=>'required:true','div'=>'formfield'));
foreach ($students as $student) {
echo $this->Form->input('Customer.id.'.$student['Customer']['id'], array('type' => 'checkbox', 'id' => "admin_checkbox_".$student['Customer']['id'], 'label' => false));
}
?>
注意:我将输入的第一个参数从'Customer.'.$student['Customer']['id'].'.id'
切换为'Customer.id.'.$student['Customer']['id']
这允许您访问阵列中的POSTed数据。生成的表单输入将如下所示(其中<student id>
是您的实际学生ID):
<div class="input checkbox">
<input type="hidden" name="data[Customer][id][<student id>]" id="admin_checkbox_<student id>_" value="0">
<input type="checkbox" name="data[Customer][id][<student id>]" id="admin_checkbox_<student id>" value="1">
</div>
然后,您可以循环浏览控制器中的每个复选框,这应该类似于:
foreach ($this->data['Customer']['id'] as $id => $checked) {
if ($checked) {
Debugger::Dump($this->data['Customer'][$id]);
}
}
建议使用选项#1,因为它可确保您的数据正确分离。然后,您可以更快地遍历所需的数据。
选项#2:我不推荐的另一个选项是使用isset()循环遍历所有数据,但只对您想要的数据进行操作
foreach ($this->data['Customer'] as $key => $item) {
if (isset($item['id']) && $item['id']) {
Debugger::Dump($this->data['Customer'][$key]);
}
}
答案 1 :(得分:0)
如果您确定警告不重要,请使用error_reporting(E_ERROR);
答案 2 :(得分:0)
Instead of creating single single check boxes you should use proper format of cakephp. Please check below:
echo $this->Form->input('Model.field', array(
'type' => 'select',
'multiple' => 'checkbox',
'options' => $students
)
));
In above code $students is holding your check boxes values like [0]=male, [1]=female.
In your controller, you will one value same like you get value of textbox.