Mam definicję formularza, która wykorzystuje dotychczasowy wielki typ pola entity
. Za pomocą opcji query_builder
wybieram moje wartości i są wyświetlane.Symfony2: Pole formularza encji z pustą wartością
Smutną częścią jest, że muszę wyświetlić domyślną wartość null
, taką jak all
(jest to forma filtra). Nie podoba mi się opcja choices
z entity
, ponieważ mam wartości bazy danych, a FormType
nie powinien wysyłać zapytań do bazy danych.
Moje dotychczasowe podejście polegało na wdrożeniu niestandardowego typu pola, który rozszerza entity
i dodaje pozycję pustą na początku listy. Typ pola jest załadowany i używany, ale niestety nie jest wyświetlana fikcyjna wartość.
Definicja pola:
$builder->add('machine', 'first_null_entity', [
'label' => 'label.machine',
'class' => Machine::ident(),
'query_builder' => function (EntityRepository $repo)
{
return $repo->createQueryBuilder('m')
->where('m.mandator = :mandator')
->setParameter('mandator', $this->mandator)
->orderBy('m.name', 'ASC');
}
]);
Definicja typu forma:
class FirstNullEntityType extends AbstractType
{
/**
* @var unknown
*/
private $doctrine;
public function __construct(ContainerInterface $container)
{
$this->doctrine = $container->get('doctrine');
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setRequired('query_builder');
$resolver->setRequired('class');
}
public function buildView(FormView $view, FormInterface $form, array $options)
{
$class = $options['class'];
$repo = $this->doctrine->getRepository($class);
$builder = $options['query_builder']($repo);
$entities = $builder->getQuery()->execute();
// add dummy entry to start of array
if($entities) {
$dummy = new \stdClass();
$dummy->__toString = function() {
return '';
};
array_unshift($entities, $dummy);
}
$options['choices'] = $entities;
}
public function getName()
{
return 'first_null_entity';
}
public function getParent()
{
return 'entity';
}
}
możesz użyć $ choices [''] = 'All'; w definicji typu formularza –