John Davidson

PHP Symfony FormType EntityCollection into Choices

0 comments
Message:


I am beginner in PHP and Symfony and I started recently on a project.


We have 2 entities which are related by doctrine Annotation ManyToMany with JoinTable


Example: entity and datatable Room, entity and datatable Person and datatable RoomPerson (entity does not exist and just exist in doctrine annotation JoinTable).


The entity Room has a property Collection of Persons.


With a formType it is rendered in page as a select html element multiple (so we can choose several persons)


FormType with preEvent to fill list of possible persons:


$allowedPersons = $this->em->getRepository(Person::class)->findBy(***);
$form
->add('personList', EntityType::class, [
'class' => Person::class,
'choices' => $allowedPersons ,

public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Room::class,

New request is to order the list of Persons.


So I made changes described in some tutorials to change declare the Entity RoomPerson et remove annotations ManyToMany for ManyToOne and OneToMany. I added the property "Order" on RoomPerson.
I Added the methods AddRoomPerson and RemoveRoomPerson to make updates of the list by the mapping of my FormType.


So my entity "Room" now only contains a property Collection of RoomPerson.
But I don't know how to use it in my FormType because I always want to show the list of Persons.


I tried a lot of things without success.


example:


$allowedPersons = $this->em->getRepository(Person::class)->findBy(***);
$form
->add('roomPersonList', EntityType::class, [
'class' => RoomPerson::class,
'choices' => $allowedPersons ,
'choice_value' => function(?RoomPerson $roomPerson) {
return $roomPerson? $roomPerson->getPerson()->getIdPerson() : '';
},
'choice_label' => function(?RoomPerson $roomPerson) {
return $roomPerson? $roomPerson->getPerson()->getName() : '';
},

I get following error:



Argument 1 passed to App\Form\RoomPersonType::App\Form{closure}() must be an instance of App\Entity\RoomPerson or null, instance of App\Entity\Person given, called in ..\vendor\symfony\form\ChoiceList\ArrayChoiceList.php on line 200"



So please I need help to transform my list of RoomPerson in my formtype and to make an update of this list in page.



My Answer:
entityManager->getRepository(Person::class)->findAll();
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($allowedPersons) {
$form = $event->getForm();
$form->add('persons', EntityType::class, [
'class' => Person::class,
'choices' => $allowedPersons,
'multiple' => true,
'expanded' => true,
]);
});

In this example, we are using the EntityType form field type to render a select element with multiple options for choosing persons. The $allowedPersons variable is populated with all the Person entities from the database, and then passed as choices to the EntityType field. The 'multiple' => true option allows for selecting multiple persons, and the 'expanded' => true option renders the select element as a list of checkboxes for easier selection.

Make sure to adjust the code according to your specific entities and requirements.

Rate this post

5 of 5 based on 8099 votes

Comments




© 2024 Hayatsk.info - Personal Blogs Platform. All Rights Reserved.
Create blog  |  Privacy Policy  |  Terms & Conditions  |  Contact Us