В форме 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
или что нибудь. Вопрос в том, как я могу это сделать?
Вы должны использовать 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 */
))
Способ выбора полей (который entity
поле расширяется) отображаются в формах Symfony определяется определенной разновидностью логики (документация). Я предполагаю, что вы оказываете <select>
раскрывающийся список, в этом случае, если вы используете Symfony 2.6 или выше, placeholder
это то, что ты хочешь (документация). Однако следует помнить, что с некоторыми базами данных (например, Postgres) placeholder
опция была сломана в Symfony 2.7.0 и (я думаю) 2.7.1.
empty_data
/ empty_value
Проблема с формами является частью давней путаницы. Короче говоря, используйте placeholder
,