我试图实现一些非常简单但不确定是否支持,可能或意外行为 . 我有一个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 回答
这实际上比在表面上看起来更复杂 .
Entity
表单类型假定选择选择器的"values"是实体的唯一标识符,这允许表单类型(及其关联的转换器)查找和转换来自相关实体的传递值 . 所以第一个问题是 - 你能用字符串"Cars"或"Electronics"唯一地识别你的实体吗?如果你不能,那么下一个问题是你打算如何将该字符串转换为实体?如果可以,那么事情就相对容易了 . 实际上,您需要为选择字段类型提供不同的
ChoiceList
实现 - 这实际上是Entity
类型已经执行的操作 . 我不熟悉这样做的正确方法,我相信这个方法在Symfony 2.6和2.7之间有所改变,但我会调查像Symfony\Bridge\Doctrine\Form\Type\EntityType
这样的类以及基础Symfony\Component\Form\Extension\Core\Type\ChoiceType
.简短版:它并非完全直截了当,但绝对可行 .