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 :

Charger dynamiquement le contenu d'un <select> par AJAX [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre habitué Avatar de Pahcixam
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2006
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2006
    Messages : 289
    Points : 191
    Points
    191
    Par défaut Charger dynamiquement le contenu d'un <select> par AJAX
    Bonjour.

    J'ai actuellement un projet Symfony2 dans lequel je dois gérer des relations entre Entités de type parent => fils. J'ai donc un formulaire qui va me chercher la liste des entités parentes existantes et qui me les affiche dans un select. A présent le parent peut être de deux types, soit deux entités différentes. J'ai ajouté un champ typeSource qui précise à quelle entité parente j'ai affaire.

    Schématiquement j'ai ceci:

    Type de Source :
    |--> select:
    |------> None
    |------> Source1 (correspond à l'entité de type 1)
    |------> Source2 (correspond à l'entité de type 2)

    Source:
    |--> select:
    |------> None (readonly)
    |------> Liste des Entité de type 1
    |------> Liste des Entité de type 2

    Au chargement de la page, type de Source et vide et le champ source est vide. Quand l'utilisateur choisi Source 1, je voudrais que le select Source charge la liste des entité et idem pour la source 2.

    En AJAX simple c'est assez simple à gérer. Mais avec Symfony il faut que le formulaire soit valide. J'ai trouvé des articles avec des events listener et je pense que je suis sur la bonne voie, mais il n'y a pas de relation entre mes tables puisque le "typeSource" n'est pas une table.

    Grossièrement, il faudrait que le listener renvoi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if ('typeSource' == 'Source1') {
        return $entite1;
        //On renvoie la liste des options du select en AJAX
    }
    else if ('typeSource' == 'Source2') {
        return $entite2;
        //On renvoie la liste des options du select en AJAX
    }
    else {
        Exception;
    }
    Je ne sais pas comment attaquer ce problème pourtant simple, et les exemples que je trouve me semblent très compliqué pour pas grand chose.

    En vous remerciant d'avance.
    Quelques conseils:

    Utilisez <?php plutôt que <?
    Utilisez des ' et la concaténation plutôt que "
    Pensez à revenir à la ligne après chaque ; pour plus de clarté.
    // Commentez votre code un maximum

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    freelance
    Inscrit en
    Mars 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : freelance
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 16
    Points : 30
    Points
    30
    Par défaut
    formulaire 1 : envoie automatique en ajax vers un controlleur pour valider et renvoyer les donnée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Type de Source :
    |--> select:
    |------> None
    |------> Source1 (correspond à l'entité de type 1)
    |------> Source2 (correspond à l'entité de type 2)
    formulaire 2 : reste inchangé avec ton select vide

    sépare les deux formulaires .
    en ce qui concerne la récupération des données , tu peut récuperer les donées en html avec une vue twig personalisé pour n'envoyer que le contenu du select sans la balise : doc
    en espérant avoir bien compris ton probleme

  3. #3
    Membre habitué Avatar de Pahcixam
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2006
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2006
    Messages : 289
    Points : 191
    Points
    191
    Par défaut
    Bonjour et merci de votre réponse.

    J'ai avancé de mon côté. Le remplissage en AJAX via jQuery des champs fonctionne très bien. Mon formulaire est valide car je passe à l'enregistrement, donc les events doivent fonctionner. Par contre j'ai une erreur à l'enregistrement car toutes les valeurs du formulaires sont "NULL". On dirait qu'une fois validé, le formulaire est remis à 0.

    Je ne vois pas du tout d'où peut venir le problème. Si vous avez une idée, je suis preneur !

    Voici mes scripts:

    L'entité est basique et ne contient que les getters et setters.

    Mon formulaire:

    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    <?php
     
    namespace YYY\GestionnaireBundle\Form\Type;
     
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\Form\FormEvents;
    use Symfony\Component\OptionsResolver\OptionsResolverInterface;
    use Doctrine\ORM\EntityRepository;
     
    class LotType extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder->add('nomlot', 'text', array('label' => 'Nom du Lot'));
            $builder->add('typesource', 'choice', array('label' => 'Type de source', 'empty_value' => 'Choisissez un type de source', 'choices' => array(                
                    'maille' => 'Maille',
                    'lot' => 'Lot'
                )));
     
            [...]
     
            $ff = $builder->getFormFactory();
     
            // Pour ajouter la liste des sources dynamiquement
            $func = function (\Symfony\Component\Form\FormEvent $e) use ($ff) {
                $data = $e->getData();
                $form = $e->getForm();
                if ($form->has('nomsource')) {
                    $form->remove('nomsource');
                }
     
                $cat = isset($data['typesource'])?$data['typesource']:null;
     
                //On charge les valeurs à retourner
     
                //Dans le cas où la source est une maille
                if ($cat == 'maille') {
                    $form->add($ff->createNamed('nomsource', 'entity', null, array(
                        'required' => false,
                        'label' => 'Nom de la maille (si dispo.)',
                        'class' => 'YYGestionnaireBundle:Centroides',
                        'query_builder' => function(EntityRepository $repository) { 
                            return $repository->createQueryBuilder('p')                            
                                    ->orderBy('p.nomMaille', 'asc');                     
                            }                
                    )));
                }
                //Dans le cas où la source est un lot
                elseif ($cat == 'lot') {
                    $form->add($ff->createNamed('nomsource', 'entity', null, array(
                        'required' => false,
                        'label' => 'Nom du Lot (si dispo.)',
                        'class' => 'YYGestionnaireBundle:Infolots',
                        'query_builder' => function($repository) { 
                            return $repository->createQueryBuilder('p')
                                    ->where('p.termine = :termine')
                                    ->setParameter('termine', 1)
                                    ->orderBy('p.id', 'desc');                     
                            }                
                    )));
                }
                else {
                    //$listeSource = array('' => '');
                    $form->add($ff->createNamed('nomsource', 'choice', null, array('choices' => array())));
                }
            };
     
            // On enregistre les listeners
            $builder->addEventListener(FormEvents::PRE_SET_DATA, $func);
            $builder->addEventListener(FormEvents::PRE_BIND, $func);
        }
     
        public function getName()
        {
            return 'lot';
        }
     
        public function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'YY\GestionnaireBundle\Entity\Lots',
            ));
        }
    }
    Mon contrôleur du formulaire
    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
    47
    public function testNouveauAction(Request $request)
        {
            $lot = new Lots();
     
            $form = $this->createForm(new LotType());
     
            if ($request->getMethod() == 'POST') {
                $form->bind($request);
     
                if ($form->isValid()) {
                    $em = $this->getDoctrine()->getManager();
     
                    /*
                     * Bloc concernant la table infoLots
                     */
     
                    //On met à jour les champs du même lot / maille
                    if($lot->getNomlot() != ''){
                        //J'enregistre des données sur une autre table
                        //Pour le moment on ne rentre pas dans ce bloc comme toutes les valeurs sont nulles
                        [...]
                    }
     
                    /*
                     * Bloc concernant la table lots
                     */
                    // On enregistre le tout
                    $em->persist($lot);
                    $em->flush();
     
                    return $this->redirect($this->generateUrl('YY_gestionnaire_nouveau_lot'));
                }
                else {
                    return $this->render('YYGestionnaireBundle:Gestionnaire:formulaireLotsNouveau.html.twig', array(
                        'form' => $form->createView(),
                        'errors' => $form->getErrors(),
                        'action' => 'nouveauLot'
                    ));
                }
            }
            else {
                return $this->render('YYGestionnaireBundle:Gestionnaire:formulaireLotsNouveau.html.twig', array(
                    'form' => $form->createView(),
                    'action' => 'nouveauLot'
                ));
            }
        }
    En vous remerciant.
    Quelques conseils:

    Utilisez <?php plutôt que <?
    Utilisez des ' et la concaténation plutôt que "
    Pensez à revenir à la ligne après chaque ; pour plus de clarté.
    // Commentez votre code un maximum

  4. #4
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2011
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2011
    Messages : 477
    Points : 677
    Points
    677
    Par défaut
    Bonjour,

    Peux tu tester si tu passes par les points indiqués dans le code ci-dessous ?

    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
     
            if ($request->getMethod() == 'POST') {
               // suis je bien en POST ?
                $form->bind($request);
               // dump la $request pour voir ce qui y a dedans
               // et aussi $form après le bind.
                if ($form->isValid()) {
                 // Mon formulaire est valide ?
                    $em = $this->getDoctrine()->getManager();
     
                    /*
                     * Bloc concernant la table infoLots
                     */
     
                    //On met à jour les champs du même lot / maille
                    if($lot->getNomlot() != ''){
                        //J'enregistre des données sur une autre table
                        //Pour le moment on ne rentre pas dans ce bloc comme toutes les valeurs sont nulles
                        [...]
                    }
     
                    /*
                     * Bloc concernant la table lots
                     */
                    // On enregistre le tout
                    $em->persist($lot);
                    $em->flush();
     
                    return $this->redirect($this->generateUrl('YY_gestionnaire_nouveau_lot'));
                }

  5. #5
    Membre habitué Avatar de Pahcixam
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2006
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2006
    Messages : 289
    Points : 191
    Points
    191
    Par défaut
    Alors, je suis bien dans le POST, les valeurs sont bien passées dans le $form, le formulaire semble valide. Par contre mon $lot est toujours rempli de NULL.
    Quelques conseils:

    Utilisez <?php plutôt que <?
    Utilisez des ' et la concaténation plutôt que "
    Pensez à revenir à la ligne après chaque ; pour plus de clarté.
    // Commentez votre code un maximum

  6. #6
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2011
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2011
    Messages : 477
    Points : 677
    Points
    677
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $form = $this->createForm(new LotType(),$lot);
    Normalement, dans la méthode createForm tu passe le LotType et l'objet qui va bien.

  7. #7
    Membre habitué Avatar de Pahcixam
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2006
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2006
    Messages : 289
    Points : 191
    Points
    191
    Par défaut
    Effectivement, je m'en suis rendu-compte aussi. Ça fonctionne très maintenant. Je passe le sujet en résolu. Merci.
    Quelques conseils:

    Utilisez <?php plutôt que <?
    Utilisez des ' et la concaténation plutôt que "
    Pensez à revenir à la ligne après chaque ; pour plus de clarté.
    // Commentez votre code un maximum

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 08/02/2014, 00h23
  2. Lire le contenue d'une page web généré par Ajax
    Par icb3a dans le forum Web & réseau
    Réponses: 7
    Dernier message: 26/07/2010, 23h46
  3. Requête Ajax sur éléments d'un select remplis par Ajax
    Par descurai dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 30/04/2009, 17h04
  4. [AJAX] Click sur select alimenté par ajax plante ie
    Par Pgs dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 08/04/2008, 10h45
  5. [Tableau] Allocation dynamique du contenu
    Par VincenzoR dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 08/05/2004, 20h57

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