Symfony Forms - 带有query_builder的实体字段,没有choices_as_values?

时间:2015-11-12 09:13:35

标签: forms symfony entity

我正在尝试实现一些非常简单但不确定是否支持,可能或意外行为。我有一个Symfony实体字段,它根据另一个字段的选择加载一些数据。数据加载好,但我希望选项名称和值相同。目前,它正在填充名称ok,但我希望值与名称相同(Symfony选项字段中的choices_as_values选项)。这在实体领域是否可行。

以下是一个示例代码:

    $builder
        ->addEventListener(
            Form\FormEvents::POST_SET_DATA,
            function (Form\FormEvent $event) {
                $attributeData = $event->getData();

                $event->getForm()->add(
                    'group',
                    'entity',
                        array(
                        'class'         => 'AppBundle:CategoryAttributeData',
                        'placeholder'   => 'Select a data group',
                        'label'         => 'Attribute Group',
                        'choice_label'  => 'content',
                        'required'      => false,
                        'query_builder' => function (Repository\CategoryAttributeData $repository) use ($attributeData) {
                            $queryBuilder = $repository->createQueryBuilder('u')
                                ->select('u')
                                ->where('u.type = :type')
                                ->andWhere('u.group IS NULL')
                                ->setParameter('type', $attributeData->getType())
                            ;

                            return $queryBuilder;
                        }
                    )
                );
            }
        )
    ;

输出结果为:

<select id="attribute_data_group" name="attribute_data[group]" class="form-control">
<option value="">Select a data group</option>
<option value="1">Cars</option>
<option value="2">Electronics</option>
<option value="3">Furniture</option>
</select>

我想要实现的目标是:

<select id="attribute_data_group" name="attribute_data[group]" class="form-control">
<option value="">Select a data group</option>
<option value="Cars">Cars</option>
<option value="Electronics">Electronics</option>
<option value="Furniture">Furniture</option>
</select>

由于此字段是通过事件侦听器填充的(因为它依赖于另一个字段值),因此我无法在此处添加视图转换器。

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

这实际上比表面看起来更复杂。 Entity表单类型假定&#34;值&#34;选择选择器是实体的唯一标识符,这允许表单类型(及其关联的转换器)查找和转换来自相关实体的传递值。所以第一个问题是 - 你能用字符串&#34;汽车&#34;或者电子&#34;来唯一地识别你的实体?如果你不能,那么下一个问题是你打算如何将该字符串转换为实体?

如果可以,那么事情就相对容易了。实际上,您需要为选择字段类型提供不同的ChoiceList实现 - 这实际上是Entity类型已经实现的。我不熟悉这样做的正确方法,我相信这个方法在Symfony 2.6和2.7之间发生了变化,但我会研究像Symfony\Bridge\Doctrine\Form\Type\EntityType这样的类以及基类Symfony\Component\Form\Extension\Core\Type\ChoiceType。< / p>

简短版本:它并非完全直截了当,但绝对可能。

答案 1 :(得分:0)

它可以通过选项'choice_value'来完成,例如:

'choice_value' => function (?Team $team) {
     return $team ? $team->getBesoccerId() : '';
}

它与 'query_builder' 选项 100% 兼容。继续同一个例子:

->add('team', EntityType::class, array(
     'class' => Team::class,
     'label' => 'Equipo',
     'query_builder' => function (EntityRepository $er) use ($lang) {
                          return $er->createQueryBuilder('t')
                            ->andWhere('t.besoccerId IS NOT NULL')
                            ->andWhere('i18n.cod_lang = :cod_lang')
                            ->setParameter('cod_lang', $lang)
                            ->leftJoin('t.translations', 'i18n')
                            ->orderBy('t.sort', 'ASC');
                    },
     'choice_label' => 'name',
     'choice_value' => function (?Team $team) {
                         return $team ? $team->getBesoccerId() : '';
                    }
))

您可以在 documentation 中找到更多信息。