Как установить данные по умолчанию в раскрывающемся списке - PullRequest
0 голосов
/ 08 октября 2019

В проекте symfony3.4 у меня есть два объекта: Personne и Nationalite

В раскрывающемся списке формы я хочу выбрать по умолчанию Nationalite 'French'.

PersonneType.php:

...
public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder->add('nationalite', EntityType::class, array(
                        'class' => 'AppBundle:Nationalite',
                        'choice_label' => 'libelle',
                        'required' => false,
                        'empty_data' => function(NationaliteRepository $repo) {
                            return $repo->getNationaliteParDefaut();
                        }
                    ))
->add...

В NationaliteRepository.php:

...
    public function getNationaliteParDefaut(){
        $qb = $this->createQueryBuilder('n');
        $qb->where($qb->expr()->eq('n.codeInsee', ':code_insee'))
            ->setParameter('code_insee', 99100); //99100 is France code_insee
        return $qb->getQuery()->getOneOrNullResult();

    }
...

Этот метод генерирует следующую ошибку:

Catchable Fatal Error: Аргумент 1 передан в AppBundle \Form \ PersonneType :: AppBundle \ Form {closure} () должен быть экземпляром AppBundle \ Repository \ NationaliteRepository, экземпляром Symfony \ Component \ Form \ Form, который вызывается в /var/www/...vendor/symfony/symfony/src/Symfony/Component/Form/Form.php в строке 620 и определено

Ответы [ 2 ]

1 голос
/ 09 октября 2019

Лучший способ для сущностей / объектов - установить опцию по умолчанию для самого класса объектов, либо в самой сущности, либо перед созданием формы, либо с использованием какого-либо компоновщика / фабрики.

// let say thisis the class which will be filled with the natinalite
Class Person  {
   private $name
   // ... some other fields ...
   private $nationalite

   public function setNationalite(Nationalite $nationale) 
   {
      $this->nationalite = $nationalite
   }
}

Метод создания объекта формы

$person = new Person();
$person->setNationalite($repo->getNationaliteParDefaut());
// lets say personType is your form, that also has field nationalite
$form = $this->createForm(PersonType:class, $person);

При такой настройке форма будет предварительно заполнена данными по умолчанию из объекта, включая национал, и пользователь все равно сможет легко его изменить.

Необъектный метод Еще один способ сделать то, что вам нужно, - использовать события формы.

// in your form definition
$builder->addEventListener(FormEvents::PRE_SET_DATA, function(FormEvent $event) {
   $form = $event->getForm();
   $data = $event->getData();
   $form->add('nationalite', EntityType::class, array(
       'class' => 'AppBundle:Nationalite',
       'choice_label' => 'libelle',
       'required' => false,
       'data' => $repo->getNationaliteParDefaut()
   )
}

О empty_data Пустые данные работают только в том случае, если поле формыпусто, напримерпользователь ничего не выбрал, поэтому будет использоваться значение из пустых данных ref: https://symfony.com/doc/current/reference/forms/types/text.html#empty-data

0 голосов
/ 08 октября 2019

Попробуйте параметр предпочитаемых_четов https://symfony.com/doc/3.4/reference/forms/types/entity.html#preferred-choices. Предпочтительные_отображения появляются в верхней части списка, но не будут выбраны. Если вы хотите, чтобы элемент был выбран, создайте форму с помощью POPO (простой объект PHP-объект) с нужной вам национальностью по умолчанию.

...