Bonjour, je fais un site de réservation d'hotel et pour chaque hotel il y a un formulaire pour donner son avis.
Dans ce formulaire il y a un champ pour choisir pour quelle réservation nous voulons donner un avis, il faut donc que ces choix soient propre à chaque utilisateur, il ne faut pas qu'un utilisateur A donne un avis sur la réservation d'un utilisateur B.
J'ai vu que l'on peut faire sa propre requette comme ceci :

->add('Field', EntityType::class, [
            'class'     => 'Entity::class',
            'choice_label' => 'name',
            'query_builder' => function (EntityRepository $repo) {
                return $repo->createQueryBuilder('e')
                    ->andWhere('e.id = :id')
                    ->getQuery()
                    ->getResult();
            },
        ])

Le problème c'est que j'ai besoin d'un autre paramètre qui est l'utilisateur et je ne vois pas comment l'ajouter.
Du coup j'ai essayé :

 ->add('booking', EntityType::class, [
                'class' => Booking::class,
                'query_builder' => function (BookingRepository $repo, Users $user) {
                    return $repo->createQueryBuilder('b')
                        ->andWhere('b.user_id = :id')
                        ->setParameter('id', $user->id)
                        ->getQuery()
                        ->getResult();
                }
           ])

Mais ça ne fonctionne pas evidemment...
Est ce qu'il y a une meilleure façon de procéder ?

9 réponses


Curvata
Réponse acceptée

Pardon, il faut laisser

'data_class' => Reviews::class

donc

$user = $options['user'];

        $builder
            ->add('name')
            ->add('rating')
            ->add('message')
            ->add('booking', EntityType::class, [
                'class' => Booking::class,
                'choices' => $user->getBooking(),
                'multiple' => false,
                'expanded' => true,
            ])
            ->add('Send', SubmitType::class)
        ;
  $reviewsForm = $this->createForm(ReviewsFormType::class, $review, [
            'data_class' => Reviews::class,
            'user' => $this->getUser()
        ]);
    ````
    public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults([
        'user' => array()
    ]);
}
````

Salut,

public function buildForm(FormBuilderInterface $builder, array $options)
    {        
        $user = $options['user'];

        $builder
            ->add('booking', EntityType::class, [
                'label' => 'Réservation',
                'class' => Booking::class,
                'choices' => $user->getReservations(),
                'multiple' => false,
                'expanded' => true,
            ]);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'user' => array()
        ]);
    }

Dans ton controller

$form = $this->createForm(CommentType::class, null, [
              'user' => $this->getUser()
        ]);

Merci, par contre apparemment on ne peut pas choisir le nom de la clé il faut choisir dans cette liste

J'avance parce que maintenant dans le formulaire je récupère bien l'utilisateur mais j'ai encore un problème,
j'ai fais :

$user = $options['data'];

        $builder
            ->add('name')
            ->add('rating')
            ->add('message')
            ->add('booking', EntityType::class, [
                'class' => Booking::class,
                'choices' => $user->getBooking(),
                'multiple' => false,
                'expanded' => true,
            ])
            ->add('Send', SubmitType::class)
        ;

et dans le controller :

$reviewsForm = $this->createForm(ReviewsFormType::class, $review, [
            'data_class' => Users::class,
            'data' => $this->getUser()
        ]);

Et j'ai :

Can't get a way to read the property "name" in class "App\Entity\Users".

Je ne comprend pas pourquoi il cherche cette propriété...

Ton formulaire représente un commentaire et non un utilisateur donc il faut changer ton data_class

Mais du coup ça me dit qu'il attendait une instance de Reviews et il reçois un User dans 'data' :
The form's view data is expected to be a "App\Entity\Reviews", but it is a "App\Entity\Users". You can avoid this error by setting the "data_class" option to null or by adding a view transformer that transforms "App\Entity\Users" to an instance of "App\Entity\Reviews".

Ceci fonctionne parfaitement

$user = $options['user'];

        $builder
            ->add('name')
            ->add('rating')
            ->add('message')
            ->add('booking', EntityType::class, [
                'class' => Booking::class,
                'choices' => $user->getBooking(),
                'multiple' => false,
                'expanded' => true,
            ])
            ->add('Send', SubmitType::class)
        ;
$reviewsForm = $this->createForm(ReviewsFormType::class, $review, [
            'data_class' => Users::class,
            'user' => $this->getUser()
        ]);
public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'user' => array()
        ]);
    }

J'ai toujours la même erreur :
The form's view data is expected to be a "App\Entity\Users", but it is a "App\Entity\Reviews". You can avoid this error by setting the "data_class" option to null or by adding a view transformer that transforms "App\Entity\Reviews" to an instance of "App\Entity\Users".

Merci beaucoup, j'ai compris le fonctionnement.