在symfony 1.4中使用Doctrine我定义了几个布尔列(在mySQL中存储为tinyint)。即使返回值为“0”,复选框窗口小部件也始终呈现为已选中状态。它似乎与this ticket有关。
这是一个常见问题吗?有解决方法吗?
我可以通过将sfWidgetFormInputCheckbox中的第70行更改为:
来实现它if (null !== $value && $value !== false && $value !== 0)
但我宁愿不改变核心symfony文件。
答案 0 :(得分:2)
在不更改Symfony类的情况下解决此错误的另一个方法是将数据库中字段的默认值设置为0(未选中):
chk_field: { type: boolean, default: 0 }
在Form.class中设置小部件如下:
$this->setDefault('chk_field', $this->getOption('default'));
这应该在表单中将“chk_field”字段显示为“未选中”
答案 1 :(得分:1)
Symfony未解决的错误,请参阅http://www.devexp.eu/2009/04/23/sfwidgetforminputcheckbox-unchecked-bug/
您的数据库为未选中的复选框返回0,但Symfony将其复制为已选中。
您可以通过编辑symfony / lib / widget / sfwidgetforminputcheckbox.class,第70行(版本1.4.6)进行自我修补,更改:
if (null !== $value && $value !== false)
在
if (null !== $value && $value !== false && $value != 0)
答案 2 :(得分:0)
不确定在什么情况下您会看到问题。我可以得到以下工作:
$database_field = '1;0;1;0;1;0;1';
$checked = explode(';', $database_field);
$this->form->getWidget('a_set_of_checkboxes')->setDefault($checked);
...选中1的复选框,0不是。
我正在使用“sfWidgetFormChoice”窗口小部件,其属性为“multiple:true”和“expanded:true”,因此它们不是单独的复选框窗口小部件,而是包含复选框/值数组的单个窗口小部件。