CakePHP未填充单选按钮在提交时更改为不需要的值

时间:2011-06-23 19:56:03

标签: php validation forms cakephp

我有这个表单元素:

$form->input('ChecklistResponseGovernmentInfo.driversLicenseIsOnline', array('type'=>'radio', 'empty'=> true, 'options'=>array(0 => 'No', 1 => 'Yes')))

这是它的验证规则:

'driversLicenseIsOnline' => array(
    'boolean' => array(
        'rule' => array('boolean'),
        'allowEmpty' => false,
    ),
),

这是它的数据库字段(MySQL):

`driversLicenseIsOnline` tinyint(1) unsigned NOT NULL

当我第一次加载表单的新副本时,单选按钮组未被选中。如果我在没有做任何其他事情的情况下提交表单,当表单重新加载时,单选按钮将填入“否”,并且验证flash消息显示“此字段不能留空”。

当我停止使用零(0)作为“否”的值时,问题就消失了,但我希望Cake将此值存储为布尔值,而不是像我必须手动翻译的其他值那样来回布尔值。

如果在没有选择收音机的情况下提交此元素,我如何阻止Cake自动填写该元素的值?

4 个答案:

答案 0 :(得分:1)

在我自己寻找答案时偶然发现了这个问题。

这个讨厌的黑客为我修复了它(在CakePHP 2.1中 - 应该在1.3中工作):

验证失败后,取消设置$ this-> request->数据中的值,如果它为空:

if ($this->Model->save($this->request->data) {
  // data saved
}
else {
  // data failed to save
  // unset radio if empty
  if ($this->request->data['Model']['radio_field'] == "") {
    unset($this->request->data['Model']['radio_field'];
  }
}

呃。

答案 1 :(得分:0)

设置单选按钮的方式实际上有3种选择:

  1. 没有选择
  2. '否'已选中
  3. '是'已选择
  4. 单选按钮应never have no choice selected(见第9点); (1)上面不应该发生。所以不要直接回答你的问题,我会说你应该考虑使用复选框。复选框非常适合布尔值,在这种情况下可能更有用。

    如果数据库字段为tinyint(1),Cake会假设您需要一个复选框,这样您就可以在FormHelper调用中删除options数组。

答案 2 :(得分:0)

所以我在调查问卷上遇到了类似的问题,当一个是或否的问题仍未得到答复时,单选按钮保持空白在某种程度上在语义上是正确的。在这种情况下,这似乎不正确:

你吸烟了吗? [是?]

这更好:

你吸烟了吗? (是)(无)

我解决这个问题的方法是'options'=>array(1 => 'No', 2 => 'Yes')

答案 3 :(得分:0)

编辑:好吧,我不认为Cake自动用0填充该值,很可能是浏览器行为。保存失败时,您可以通过调试($ this->数据)对其进行测试。 (万一它确实存在,你可以在那里设置那个值)