IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Formulaire servant de filtre selon une donnée présente en DB


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Chomeur
    Inscrit en
    Octobre 2019
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Chomeur

    Informations forums :
    Inscription : Octobre 2019
    Messages : 19
    Par défaut Formulaire servant de filtre selon une donnée présente en DB
    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 :
    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;
        }
     
    }
    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
    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,
            ]);
        }
    }
    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
     
    //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 : "
                ]);
        }
    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
    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();
        }
    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é..

    Merci beaucoup à ceux qui prendront le temps de lire.

  2. #2
    Membre confirmé Avatar de Skunka
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2018
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2018
    Messages : 135
    Par défaut
    Salut,

    Pour la liste déroulante: https://symfony.com/doc/current/refe...es/entity.html
    Dans tes classes, il faut que ton attribut genre soit du type relation avec ton entité Genre (si j'ai bien compris, tu en as une). Cela devrait résoudre ton problème qui est, selon moi, le suivant:

    Ton entité 'Film' contient un attribut du type relation avec l'entité 'Genre' et ton entité 'RechercheFilm' contient un attribut de type string.
    Quand tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ->setParameter(':genre', $rechercheFilm->getGenre());
    , Doctrine (l'orm de symfony) compare l'attribut relation 'genre' avec un string et ne trouve donc aucun résultat.

    Passer l'attribut 'genre' de l'entité 'RechercheFilm' permettra à ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ->setParameter(':genre', $rechercheFilm->getGenre());
    de comparer deux entités 'genre' entre elles et de potentiellement retourner un résultat.
    C'est normalement ta seule modification à faire.

    J'espère avoir était clair et de ne pas me tromper!

    Skunka.

  3. #3
    Membre averti
    Homme Profil pro
    Chomeur
    Inscrit en
    Octobre 2019
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Chomeur

    Informations forums :
    Inscription : Octobre 2019
    Messages : 19
    Par défaut
    Bonsoir Skunka,

    Je te remercie pour ta réponse. Elle m'a aidé d'une certaine amnière, car elle m'a amenée à la solution. C'était en fait tout simple, mais j'étais passé à côté car j'avais fais une erreur dans les namespaces.

    D'abord il faut utiliser les deux namespaces suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    use App\Entity\NomDeLEntité;
    use Symfony\Bridge\Doctrine\Form\Type\EntityType;
    puis il suffit de faire ceci dans le buildform() :
    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 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 à : "
                ])
                ->add('genre', EntityType::class, [
                    'class' => Genre::class,
                    'choice_label' => 'genre'
                ]) 
     
     
            ;
        }
    Merci beaucoup pour tes conseils !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Filtre selon une colonne et copie des données propres dans nouvelle feuille
    Par Kaera dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 07/12/2011, 23h43
  2. Réponses: 8
    Dernier message: 23/01/2009, 11h40
  3. Réponses: 5
    Dernier message: 12/06/2007, 01h17
  4. Réponses: 2
    Dernier message: 07/06/2007, 16h07
  5. [Formulaire] Alerte avant suppression d'une donnée via un formulaire
    Par leloup84 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 26/01/2006, 10h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo