CakePHP:FormHelper不保存两个具有相同名称的输入的数据

时间:2013-11-19 23:09:19

标签: php forms cakephp cakephp-2.0

在我的表单中有一长串复选框,我想将其显示为两列复选框(出于与演示相关的原因)。因此,在以下代码中,我将选项拆分为两个单独的数组,并使用相同的名称创建两个不同的选项。当我debug($this->request->data);时,'location'键始终为空。但是,相同的代码可以作为单个输入正常工作。我做错了什么?

<?php
$count = count($location_options); //$location_options is passed from the controller
$half = round( $count/2 );

$location_options1 = array_slice($location_options, 0, $half, TRUE);
$location_options2 = array_slice($location_options, $half, NULL, TRUE);

//I CAN'T GET THIS TO WORK!!
//echo $this->Form->input('location', array('type'=>'select', 'multiple'=>'checkbox', 'options'=>$location_options1, 'div'=>array('class'=>'col-xs-12 col-sm-6 form-group', 'style'=>'margin-bottom:0;', 'selected'=>$user_location_alert_tag_ids))); 
//echo $this->Form->input('location', array('type'=>'select', 'multiple'=>'checkbox', 'options'=>$location_options2, 'div'=>array('class'=>'col-xs-12 col-sm-6 form-group', 'selected'=>$user_location_alert_tag_ids))); 

//BUT THIS WORKS JUST FINE
echo $this->Form->input('location', array('type'=>'select', 'multiple'=>'checkbox', 'options'=>$location_options, 'div'=>array('selected'=>$user_location_alert_tag_ids))); 
?>

1 个答案:

答案 0 :(得分:3)

查看生成的HTML,为每个select元素生成一个隐藏字段,以确保数据中存在相应的键。

具有相同名称的多个字段将导致生成多个隐藏字段,其中最后一个字段将覆盖以前的字段。

对于其他字段,可以使用the hiddenField option来避免这种情况,以便仅为第一个输入生成隐藏的初始化字段。从文档引用:

  

如果要在窗体上创建多个输入块,这些输入块全部组合在一起,则应在除第一个输入之外的所有输入上使用此参数。如果隐藏的输入位于多个位置的页面上,则只保存最后一组输入值。

此外,您应该为两个输入定义唯一的ID,否则您最终将得到无效的HTML,因为帮助程序将生成重复的ID。

最后但并非最不重要的是,你的括号可能有点错误,selected键嵌套在div键中,我猜这是错误的,以便定义所选的条目。

echo $this->Form->input('location', array(
    'id'       => 'location1',
    'type'     => 'select',
    'multiple' => 'checkbox',
    'options'  => $location_options1,
    'div'      => array('class' => 'col-xs-12 col-sm-6 form-group', 'style'= > 'margin-bottom:0;')
    'selected' => $user_location_alert_tag_ids
))); 
echo $this->Form->input('location', array(
    'id'          => 'location2',
    'type'        => 'select',
    'multiple'    => 'checkbox',
    'options'     => $location_options2,
    'div'         => array('class' => 'col-xs-12 col-sm-6 form-group'),
    'selected'    => $user_location_alert_tag_ids
    'hiddenField' => false
)));