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


CakePHP Unfilled radio button changed to an unwanted value on submit

我有这个表单元素:

$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

当我第一次加载表单的新副本时,单选按钮集是未选中的。如果我在不做任何其他事情的情况下提交表单,当表单重新加载时,单选按钮会填写为"否",并且验证闪烁消息会显示"此字段不能留空"。

当我停止使用零(0)作为"否"的值时,问题就消失了,但我希望Cake将这个值存储为布尔值,而不是其他我必须手动来回转换为布尔值的值。

当Cake提交时没有选择单选项时,我如何阻止它自动填充该元素的值?

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

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

验证失败后,如果$this->request->data为空,则取消设置该值:

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. 未选择任何内容
  2. 已选择"否"
  3. 已选择"是"

单选按钮永远不应该没有选择(见第9点);(1) 上述情况不应该发生。因此,与其直接回答您的问题,我想说您应该考虑使用复选框。复选框自然适合布尔值,在这种情况下可能更有用。

如果数据库字段是tinyint(1),Cake会假设您想要一个复选框,这样您就可以在FormHelper调用中去掉选项数组。

编辑:好吧,我不认为Cake会自动用0填充这个值,很可能是浏览器行为。当保存失败时,您可以通过调试($this->data)来测试它。(以防万一,您可以在那里取消设置该值)

所以我在问卷调查中也遇到了类似的问题,当"是"或"否"的问题仍然没有答案时,单选按钮保持为空在语义上是正确的。在这种情况下,它似乎不是这样的正确:

你抽烟吗?[是吗?]

这更好:

你抽烟吗?(是)(否)

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