我有这个表单元素:
$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自动填写该元素的值?
答案 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种选择:
单选按钮应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->数据)对其进行测试。 (万一它确实存在,你可以在那里设置那个值)