Не добавляя значения к сущности в форме Symfony

В форме Symfony у меня есть одно поле с именем slot который соответствует объекту с пользовательским запросом. скажем так:

->add('slot', 'entity', array(
'label'             => 'Slot',
'class'             => 'FooBarBundle:Slot',
'property'          => 'name',
'required'          => false,
'query_builder'     => function(\Foo\BarBundle\Entity\SlotRepository $er) use ($ids) {
return $er->createQueryBuilder('u')
->where('u.id IN(:ids)')->setParameter('ids', $ids);
}
))

пока что все работает. slot это ManyToOne соответствие на Team объект (для которого форма), поэтому может быть выбран только один слот за один раз. Как я уже сказал, все идет по плану. Пользователь может выбрать слот и сохранить его, и каждый будет счастлив.

Проблема начинается, когда вы пытаетесь «отменить выбор» слота (да, это должно быть возможно). Так что мне нужно добавить none значение с надписью, как None of the listed items или что нибудь. Вопрос в том, как я могу это сделать?

1

Решение

Вы должны использовать empty_data а также empty_value:

->add('slot', 'entity', array(
'label'             => 'Slot',
'class'             => 'FooBarBundle:Slot',
'property'          => 'name',
'required'          => false,
'query_builder'     => function(\Foo\BarBundle\Entity\SlotRepository $er) use ($ids) {
return $er->createQueryBuilder('u')
->where('u.id IN(:ids)')->setParameter('ids', $ids);
},

'empty_data'  => null,
'empty_value' => 'None of the listed items' /* or null */
))
1

Другие решения

Способ выбора полей (который entity поле расширяется) отображаются в формах Symfony определяется определенной разновидностью логики (документация). Я предполагаю, что вы оказываете <select> раскрывающийся список, в этом случае, если вы используете Symfony 2.6 или выше, placeholder это то, что ты хочешь (документация). Однако следует помнить, что с некоторыми базами данных (например, Postgres) placeholder опция была сломана в Symfony 2.7.0 и (я думаю) 2.7.1.

empty_data / empty_value Проблема с формами является частью давней путаницы. Короче говоря, используйте placeholder,

0

По вопросам рекламы [email protected]