Bonjour tous le monde,
Je débute avec le framework Symfony, et dans le cadre d'un projet personnel, j'ai choisi de développer un site de critique de film. Pour le moment, parmi les films présents, j'ai réussi en suivant la documentation à créer un filtre via formulaire, permettant de rechercher les films sortis entre une année x et une année y.
Pour ça, j'ai créer une entité à la main, nommée RechercheFilm, dans lequel j'ai écris les infos nécessaire à ma recherche :
J'ai également le formulaire associé :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 <?php namespace App\Entity; use Symfony\Component\Validator\Constraints as Assert; class RechercheFilm { /** * @Assert\LessThanOrEqual(propertyPath="maxAnnee", message="doit être plus petit que l'année maximale") */ private $minAnnee; /** * @Assert\GreaterThanOrEqual(propertyPath="minAnnee", message="doit être plus grand que l'année minimale") */ private $maxAnnee; public function getMinAnnee() { return $this->minAnnee; } public function getMaxAnnee() { return $this->maxAnnee; } public function setMinAnnee(int $annee) { $this->minAnnee = $annee; return $this; } public function setMaxAnnee(int $annee) { $this->maxAnnee = $annee; return $this; } }
La problématique c'est que j'aimerais bien ajouter un autre filtre à mon formulaire de recherche, celui de pouvoir chercher les films par genre. J'ai d'abord pensé qu'il fallait procéder à peu près de la même manière que pour la recherche par année, et respectivement ajouter ces champs là dans les classes correspondantes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 class RechercheFilmType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('minAnnee', IntegerType::class, [ "required" => false, "label" => "Année de : " ]) ->add('maxAnnee', IntegerType::class, [ "required" => false, "label" => "Année à : " ]) ; } public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults([ 'data_class' => RechercheFilm::class, ]); } }
J'obtiens bien le formulaire de recherche, je peux rechercher un genre en tapant un string (ce qui n'est pas top niveau UX, avouons-le), mais ça ne me retourne rien, même en tapant le genre exact. Voilà comment j'avais procédé avec le filtre d'année dans le FilmRepository :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 //class RechercheFilm public function getGenre() { return $this->genre; } public function setGenre(string $genre) { $this->minAnnee = $annee; return $this; //class RechercheFilmType //... ->add('genre', TextType::class, [ "required" => false, "label" => "Genre : " ]); }
Auriez-vous une piste sur le dysfonctionnement de la recherche ? Peut être est ce parce que, dans ma table de film, le genre est déterminé par genre_id, qui est un int avec une clé étrangère qui renvoi vers une table genre ? Dans l'idéal, j'aimerais que mon formulaire fasse une liste déroulante des genres disponibles.. auriez vous une piste ? J'ai essayé de chercher au niveau de la doc, mais je n'ai rien trouvé..
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 public function findAllWithPagination(RechercheFilm $rechercheFilm) : Query { $req = $this->createQueryBuilder('f'); if($rechercheFilm->getMinAnnee()) { $req = $req->andWhere('f.annee > :min') ->setParameter(':min', $rechercheFilm->getMinAnnee()); } if($rechercheFilm->getMaxAnnee()) { $req = $req->andWhere('f.annee < :max') ->setParameter(':max', $rechercheFilm->getMaxAnnee()); } if($rechercheFilm->getGenre()) { $req = $req->andWhere('f.genre = :genre') ->setParameter(':genre', $rechercheFilm->getGenre()); } return $req->getQuery(); }
Merci beaucoup à ceux qui prendront le temps de lire.
Partager