CakePHP 2循环生成多选复选框数组时name属性异常,求解决
解决CakePHP多选复选框数组命名异常的问题
我之前在CakePHP 2.x里也碰到过一模一样的问题,FormHelper对数组类型字段的命名规则有点特殊——你直接写tag_id[]会被它当成字段名的一部分,而不是数组标识,这就是为什么生成的name变成了data[GroupTag][tag_id[]]而不是预期的data[GroupTag][tag_id][]。
快速修复:使用点语法修改字段名
把你视图里的'tag_id[]'改成'tag_id.'(注意末尾的点),FormHelper会自动识别这是一个数组字段,生成正确的name属性:
<?php echo $this->Form->create('GroupTag'); ?> <?php foreach ($tags as $tag_id => $tag): ?> <div class="checkbox"> <label> <?php echo $this->Form->checkbox('tag_id.', array( 'value'=> $tag_id )); ?> <?php echo $tag; ?> </label> </div> <?php endforeach; ?>
更优雅的方式:使用FormHelper的内置多选复选框
其实CakePHP已经提供了更简洁的方式来生成多选复选框,不用自己手动循环,直接用input方法并设置multiple为checkbox,它会自动帮你处理所有标记和命名:
<?php echo $this->Form->create('GroupTag'); ?> <?php echo $this->Form->input('tag_id', array( 'type' => 'select', 'multiple' => 'checkbox', 'options' => $tags, // 可添加Bootstrap类适配样式 'class' => '', 'label' => false )); ?>
这种方式生成的HTML结构和你手动循环的效果一致,而且FormHelper会自动处理编辑场景下的选中状态回显,更符合框架的最佳实践。
控制器里获取选中项的方法
不管用哪种方式,提交后你都可以在控制器里通过$this->request->data['GroupTag']['tag_id']拿到所有选中的标签ID数组,直接遍历这个数组就能处理选中项了。
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

