我正在尝试实现一些非常简单但不确定是否支持,可能或意外行为。我有一个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>
由于此字段是通过事件侦听器填充的(因为它依赖于另一个字段值),因此我无法在此处添加视图转换器。
有什么建议吗?
答案 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 中找到更多信息。