我有一个仅两个字段(id和value)的ThemePlace实体。
我有一个PlaceType表单,我希望在此表单中将所有主题值打印在选择列表中。
这是我的PlaceType中的内容
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('content')
->add('title')
->add('theme', ChoiceType::class, [
'choices' => $options['themes'],
])
->add('maxUser')
->add('longitude')
->add('latitude')
->add('avatarPath',FileType::class, array('data_class' => null,'required' => false));
}/**
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\Place',
'themes' => 'AppBundle\Entity\ThemePlace'
));
}
但是我认为我得到0 / 1 / 2
而不是拥有Theme1 / Theme2 / Theme3
{{ form_widget(form.theme) }}
{{ form_errors(form.theme) }}
我已经在堆栈上看到了一些关于在构建器内部使用choice_value的话题,但我无法使其正常工作。
感谢您的帮助。
答案 0 :(得分:1)
symfony的ChoiceType有所不同:
choices数组的结构为:{displayed value} => {actual value}
(这可能是由于以下事实:值通常比字符串复杂得多,而显示值几乎总是字符串-或至少将它们转换为字符串无害。)
我假设您有[theme1,theme2,theme3]
的缩写
[
0 => theme1,
1 => theme2,
2 => theme3,
]
如果主题是字符串,则可以将它们加倍:
[
theme1 => theme1,
theme2 => theme2,
theme3 => theme3,
]
如果它们是实体,请使用EntityType
代替ChoiceType
(https://symfony.com/doc/current/reference/forms/types/entity.html#reference-forms-entity-choices)
$builder->add('themes', EntityType::class, [
'class' => Theme::class, // your class here!
'choices' => $options['themes'],
'choice_label' => function($theme) {
return $theme->getName(); // <-- use your display value
},
]);
但是,您可能必须在主题实体中添加toString,或者在choice_label
选项中使用属性路径代替匿名函数。