首页 文章

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

提问于
浏览
1

我试图实现一些非常简单但不确定是否支持,可能或意外行为 . 我有一个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>

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

有什么建议?

1 回答

  • 0

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

    如果可以,那么事情就相对容易了 . 实际上,您需要为选择字段类型提供不同的 ChoiceList 实现 - 这实际上是 Entity 类型已经执行的操作 . 我不熟悉这样做的正确方法,我相信这个方法在Symfony 2.6和2.7之间有所改变,但我会调查像 Symfony\Bridge\Doctrine\Form\Type\EntityType 这样的类以及基础 Symfony\Component\Form\Extension\Core\Type\ChoiceType .

    简短版:它并非完全直截了当,但绝对可行 .

相关问题