0

我试图通过从下拉菜单中选中复选框来更新学生班级列表。我选择了四个复选框。因此,调试正确显示 248,268,244,1220。Warning (2): Illegal string offset 'id' [APP/controllers/customers_controller.php, line 728]但由于“classroom_id”而出现错误。无论如何只显示选定复选框ID的列表吗?

我正在尝试通过选中复选框来更新多个记录/行。如何将多个选定的 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 } ?>

控制器

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
4

3 回答 3

1

您获得 5 个值而不是 4 个值的原因是因为教室 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'] 这允许您访问数组中的 POST 数据。生成的表单输入将如下所示(<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]);
    }
}
于 2013-04-24T04:36:12.457 回答
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.
于 2013-04-23T06:49:45.273 回答
0

如果您确定警告不重要,请使用error_reporting(E_ERROR);

于 2013-04-23T05:16:44.020 回答