Я настраиваю форму со многими ко многим объектам и определенным конструктором запросов, чтобы отобразить это в множественном выборе.
Entity Car.php:
private $id;
private $label;
/**
* @ORM\ManyToMany(targetEntity="App\Entity\User", inversedBy="cars")
*/
private $user;
Пользователь Entity:
private $id;
private $name;
private $roles = [];
/**
* @ORM\ManyToMany(targetEntity="App\Entity\Car", mappedBy="user")
*/
private $cars;
Form \ CarType.php:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('user', EntityType::class, [
'class' => User::class,
'multiple' => true,
'query_builder' => function (EntityRepository $repo) {
return $repo->createQueryBuilder('u')
->where('u.roles like :role')
->setParameter('role', '%"'.'ROLE_EXPERT'.'"%');
},
'choice_label' => function ($user) {
return $user->getUsernameFormated();
},
'required' => true,
])
->add('role2', EntityType::class, [
'class' => User::class,
'query_builder' => function (EntityRepository $repo) {
return $repo->createQueryBuilder('u')
->where('u.roles like :role')
->setParameter('role', '%"'.'ROLE_2'.'"%');
},
'mapped' => false,
'multiple' => false,
'required' => false,
'choice_label' => function ($user) {
return $user->getUsernameFormated();
},
'placeholder' => 'Choisir une option',
'label' => 'role2'
])
CarController.php
$role2= $form->get('role2')->getData();
if($role2) $car->addUser($role2);
Первое поле (role1) ведет себя, как и ожидалось, при выборе значений ужев базе данных (потому что mutliple = true?).
С другой стороны, для role2 значение, уже находящееся в базе, не выбрано по умолчанию.
Когда я отображаю форму, выбранное значение является заполнителем (потому что множественный = ложь?) Я хочу оставить множественным = ложное для роли 2.
Цель добавить пользователя1 с ролью1 (первое поле) и user2 с role2 в Entity User.
Как я могу это сделать?
EDIT: в соответствии с предложением Arleigh Hix, я пытаюсь использовать CollectionType. Но чтобы иметь возможность фильтровать пользователей по ролям (чтобы в форме было 2 пользовательских поля), я безуспешно пытаюсь с formEvent
Form \ CarType.php:
->add('user', CollectionType::class, [
'entry_type' => UsersByRoleType::class,
])
Form \ UsersByRoleType.php
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
$form = $event->getForm();
$formOptions = [
'class' => User::class,
'multiple' => true,
'query_builder' => function (UserRepository $userRepository) {
return $userRepository->createQueryBuilder('u')
->where('u.roles like :role')
->setParameter('role', '%"'.'ROLE_EXPERT'.'"%');
},
'choice_label' => 'email',
'required' => true,
'label' => 'label.role'
];
$form->add('cars', EntityType::class, $formOptions);