在表单中包含以下代码:
->add('groups', 'model', array(
'class' => 'FOS\UserBundle\Propel\Group',
'required' => true,
'multiple' => true,
'expanded' => true,
'query' => GroupQuery::create()->orderByName(),
))
这会正确呈现复选框,但不会设置默认值。 当我设置“expanded => false”时,它变成一个选择列表,但是然后正确设置了默认值.. Symfony中的Bug?
答案 0 :(得分:0)
使用propel而不是doctrine时,这是一个错误。
我遇到了和你一样的问题,并发现了它为什么不起作用
vendor / symfony / symfony / src / Symfony / Component / Form / Extension / Core / ChoiceList / ChoiceList.php中有一个名为getValuesForChoices的函数。
此函数将2个对象与'==='进行比较。在学说中,这可行,但如果你使用Propel,它会返回false。
public function getValuesForChoices(array $choices)
{
$choices = $this->fixChoices($choices);
$values = array();
foreach ($choices as $i => $givenChoice) {
foreach ($this->choices as $j => $choice) {
if ($choice === $givenChoice) {
$values[$i] = $this->values[$j];
unset($choices[$i]);
if (0 === count($choices)) {
break 2;
}
}
}
}
return $values;
}
这是失败的功能。 比较将失败,因为对象具有不同的数字 例: 它试图比较这个: 对象(供应商\捆绑\模型\标签)#506 对象(供应商\捆绑\模型\标签)#397
注意:这不是解决方法,而是对问题的解释。
每当我使用propel函数检查对象是否相等时,都会填充复选框:
public function getValuesForChoices(array $choices)
{
$choices = $this->fixChoices($choices);
$values = array();
foreach ($choices as $i => $givenChoice) {
foreach ($this->choices as $j => $choice) {
if ($choice->equals($givenChoice)) {
$values[$i] = $this->values[$j];
unset($choices[$i]);
if (0 === count($choices)) {
break 2;
}
}
}
}
return $values;
}
另一个有趣的事情是InstancePooling of propel。
从文件中:
http://propelorm.org/Propel/documentation/03-basic-crud.html#propel-instance-pool
Propel会保留您已检索到的对象列表 内存以避免在PHP脚本中两次调用相同的请求。这个 list被称为实例池,并自动填充 你过去的要求。每次搜索时都会查询实例池 对于通过findPk或findOneById使用其主键的对象(其中 是前者的别名。
然而,我只是一个初学者,我不太了解推进和symfony,所以我不知道为什么这不起作用。