Filtrer propositions d'un champ de formulaire

Par Alex-trem, il y a 5 ans


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, il y a 5 ans

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() ]);
Alex-trem, il y a 5 ans

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

Alex-trem, il y a 5 ans

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é...

Curvata, il y a 5 ans

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

Alex-trem, il y a 5 ans

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".

Curvata, il y a 5 ans

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() ]); }
Alex-trem, il y a 5 ans

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".

Curvata, il y a 5 ans

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()
    ]);
}
````
Alex-trem, il y a 5 ans

Merci beaucoup, j'ai compris le fonctionnement.