ChoiceType внутри формы отправить ключ, а не значение - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть объект 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 Ответ

1 голос
/ 03 апреля 2019
ChoiceType

в Symfony немного отличается:

массив выбора имеет структуру: {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 к объекту Theme или использовать путь свойства вместо анонимной функции в опции choice_label.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...