Symfony2 - 扩展选项(窗体)未设置默认值

时间:2013-11-26 08:23:39

标签: forms symfony choice

在表单中包含以下代码:

        ->add('groups', 'model', array(
              'class' => 'FOS\UserBundle\Propel\Group',
              'required' => true,
              'multiple' => true,
              'expanded' => true,
              'query' => GroupQuery::create()->orderByName(),
          ))

这会正确呈现复选框,但不会设置默认值。 当我设置“expanded => false”时,它变成一个选择列表,但是然后正确设置了默认值.. Symfony中的Bug?

1 个答案:

答案 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,所以我不知道为什么这不起作用。