表单内的ChoiceType发送键而不是值

时间:2019-04-03 09:31:09

标签: symfony

我有一个仅两个字段(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的话题,但我无法使其正常工作。

感谢您的帮助。

1 个答案:

答案 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代替ChoiceTypehttps://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选项中使用属性路径代替匿名函数。