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 :

ChoiceType avec fonction du repository renvoie un select vide


Sujet :

Symfony PHP

  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 092
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 092
    Points : 268
    Points
    268
    Par défaut ChoiceType avec fonction du repository renvoie un select vide
    Bonjour à tous,

    J'ai créé dans mon formulaire un select sensé proposer le choix d'un mois et année venant d'une fonction contenue dans mon repository, cependant, le select ne propose aucun choix alors que la fonction du repository elle retourne les bons résultats... Symfony ne m'affiche aucune erreur mais le select reste désespéramment vide !

    Merci d'avance pour votre expertise

    RendezVousRepository.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        public function getListeMoisRdv()
        {
            return $this->createQueryBuilder('r')
                ->select("DISTINCT date_format(r.horaire_debut,'%m-%Y') As mois")
                ->orderBy('mois', 'DESC')
                ->getQuery()->getScalarResult();
        }
    RendezVousType.php :
    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
    41
    42
    43
    44
    45
    46
    <?php
     
    namespace App\Form;
     
    use App\Entity\EtatsRdv;
    use App\Repository\RendezVousRepository;
    use Symfony\Bridge\Doctrine\Form\Type\EntityType;
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
    use Symfony\Component\Form\Extension\Core\Type\SearchType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolver;
     
    class RechercherRdvType extends AbstractType
    {
     
        public function buildForm(FormBuilderInterface $builder, array $options): void
        {
     
            $builder
                ->add('champRecherche', SearchType::class, [
                    'mapped' => false, 'label' => 'Rechercher : ', 'attr' => ['placeholder' => 'Rechercher par nom, prénom, date ...(min. 2 caractères)']
                ])
                ->add('rechercherEtatRdv', EntityType::class, [
                    'class' => EtatsRdv::class, 'placeholder' => '-- Veuillez choisir un état de rdv --', 'multiple' => false, 'choice_label' => 'getEtat'
                ])
                ->add('listeRdvParMois', ChoiceType::class, [
                    'expanded'=>false,
                    'multiple'=>false,
                    'choice_value'=>'mois',
                    'choice_label' => function (RendezVousRepository $rendezVousRepository) {
                        return $rendezVousRepository->getListeMoisRdv();
                    },
                    'placeholder' => '-- Veuillez choisir un mois --'
                ]);
        }
     
     
     
        public function configureOptions(OptionsResolver $resolver): void
        {
            $resolver->setDefaults([
                'attr' => ['id' => 'formRecherche']
            ]);
        }
    }

  2. #2
    Membre confirmé
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 321
    Points : 642
    Points
    642
    Par défaut
    Bonjour,

    Il faut utiliser l'option choices à la place de choice_label pour définir les éléments de ton ChoiceType : https://symfony.com/doc/current/refe...es/choice.html

  3. #3
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 092
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 092
    Points : 268
    Points
    268
    Par défaut
    Bonjour Pytet et merci d'avoir répondu

    J'avais pensé aussi à mettre 'choices' mais il me dit :

    "ChoiceType": The option "choices" with value Closure is expected to be of type "null" or "array" or "Traversable", but is of type "Closure"."

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 156
    Points : 136
    Points
    136
    Par défaut
    Bonjour,
    Une piste à tenter : mettre getArrayResult au lieu de getScalarResult, qu'est ce que ça donne ?
    En espérant que ça aide...

  5. #5
    Membre confirmé
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 321
    Points : 642
    Points
    642
    Par défaut
    C'est effectivement une bonne piste, getSingleColumnResult() semble mieux adapté ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        public function getListeMoisRdv()
        {
            return $this->createQueryBuilder('r')
                ->select("DISTINCT date_format(r.horaire_debut,'%m-%Y') AS mois")
                ->orderBy('mois', 'DESC')
                ->getQuery()->getSingleColumnResult();
        }
    On ne sait pas comment tu as défini l'option choices, il exemple simple qui fonctionne :
    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
    <?php
     
    namespace App\Form;
     
    use [...];
     
    class RechercherRdvType extends AbstractType
    {
        public function __construct(private RendezVousRepository $rendezVousRepository)
        {
        }
     
        public function buildForm(FormBuilderInterface $builder, array $options): void
        {
            $builder
                // [...]
                ->add('listeRdvParMois', ChoiceType::class, [
                    'expanded' => false,
                    'multiple' => false,
                    'choices' => $this->rendezVousRepository->getListeMoisRdv(),
                    'choice_label' => function ($choice, string $key, mixed $value): TranslatableMessage|string {
                        return $value;
                    },
                    'placeholder' => '-- Veuillez choisir un mois --'
                ]);
        }

  6. #6
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 092
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 092
    Points : 268
    Points
    268
    Par défaut
    Merci Pytet,

    ça marche en simplifiant ta réponse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
                ->add('listeRdvParMois', ChoiceType::class, [
                    'expanded'=>false,
                    'multiple'=>false,               
                    'choices'=>$this->rendezVousRepository->getListeMoisRdv(),
                    'choice_label'=>function ( mixed $value) {
                        return $value;
                    },                
                    'placeholder' => '-- Veuillez choisir un mois --'
                ]);
    et en remplaçant scalarResult (qui marche) par singleColumnResult() pour éliminer les clés indexes devant chaque valeur.

    Merci à tous

  7. #7
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 092
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 092
    Points : 268
    Points
    268
    Par défaut
    Citation Envoyé par merou19 Voir le message
    Bonjour,
    Une piste à tenter : mettre getArrayResult au lieu de getScalarResult, qu'est ce que ça donne ?
    En espérant que ça aide...
    Merci mais il me semble que les deux sont similaires ...

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 156
    Points : 136
    Points
    136
    Par défaut
    Ha oui, tu as raison, de ce que je comprends, la différence est au niveau de l'hydratation des données, mais les résultats retournés devraient être les mêmes.
    Bon, ton code fonctionne maintenant, c'est l'essentiel !

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

Discussions similaires

  1. select avec fonction table compliquée
    Par da_latifa dans le forum Développement
    Réponses: 4
    Dernier message: 21/07/2014, 15h38
  2. Probleme itemlistener avec fonction select et composant Choice
    Par simonphenix dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 07/07/2009, 11h23
  3. Probleme avec fonction SELECT FROM WHERE
    Par tatann22 dans le forum Langage
    Réponses: 5
    Dernier message: 27/03/2009, 01h01
  4. Ecoute réseau avec fonction select
    Par ptit fab dans le forum Réseau
    Réponses: 1
    Dernier message: 06/06/2008, 08h48
  5. Requête de sélection avec fonction "compte"
    Par KEROZEN dans le forum Access
    Réponses: 3
    Dernier message: 25/05/2006, 10h11

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