cakephp 1.2多个更新复选框,带有下拉菜单

时间:2013-04-23 05:08:57

标签: php cakephp cakephp-1.2

我尝试通过勾选下拉菜单中的选项来更新学生班级列表。我选择了四个复选框。因此,调试正确显示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

3 个答案:

答案 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.