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 :

Deux listes déroulantes liées [2.x]


Sujet :

Symfony PHP

  1. #1
    Nouveau membre du Club
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 38
    Points : 30
    Points
    30
    Par défaut Deux listes déroulantes liées
    Bonjour,
    Dans mon application j'ai deux entités liés (personne et entreprise), j'aimerais avoir deux listes déroulantes : une fois que je choisi dans la liste déroulante entreprise, les personnes de cette entreprise se chargent automatiquement dans la liste déroulante personne...

    D'après ce que j'ai pu lire, il faut absolument passer par Ajax (outils que je ne maîtrise pas), est-ce qu'il y a d'autre moyen ou, à défaut, comment le faire avec Ajax ou Js? merci beaucoup pour votre aide!

  2. #2
    Nouveau membre du Club
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 38
    Points : 30
    Points
    30
    Par défaut
    Bonjour, entre temps j'ai essayé ceci mais ça ne marche pas :

    Dans le contrôleur, une action pour remplir la 2ème liste :

    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
    public function remplirPersonneAction()
        {
            $request = $this->getRequest();
            $em = $this->getDoctrine()->getEntityManager();
            if($request->isXmlHttpRequest()) // pour vérifier la présence d'une requete Ajax
            {
                $id = '';
                $id = $request->get('id');
            if ($id != '')
            {
                $personnes = $em->getRepository('TacheBundle:Tache')->getCbPersonne($id); // qui retourne une collection d'objet 
                $tabObjet = array();
                $i = 0;
            foreach($tesObjets as $tonObjet) // pour transformer la réponse de la requete en tableau qui replira le select2
            {
            $tabObjet[$i]['idDeLoption'] = $tonObjet->getId();
            $tabObjet[$i]['libDeLoption'] = $tonObjet->getLib();
            }
            $response = new Response();
            $data = json_encode($tabObjet); // c'est pour formater la réponse de la requete en format que jquery va comprendre
            $response->headers->set('Content-Type', 'application/json');
            $response->setContent($data);
            return $response;
            }
            }
            return new Response('Erreur');
        }
    La route de l'action :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    remplir_cb_personne:
        pattern: /remplir_cb_personne
        defaults: { _controller: TacheBundle:TacheController:remplirPersonne}
        requirements:
            _method: POST
    La fonction JS:

    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
    function remplirPersonne(){
    var id_select = $('#sortirplus_tachebundle_tachetype_entreprise').val();
      $.ajax({
        url: "{{ path('remplir_cb_personne }}",
        type: 'POST',
        data: {'id': id_select},
        dataType: 'json',
        success: function(json){ // quand la réponse de la requete arrive
          $('#sortirplus_tachebundle_tachetype_personne').html(''); //je vide la 2ème list
          $.each(json, function(index, value) { // et une boucle sur la réponse contenu dans la variable passé à la function du success "json"
          $('#sortirplus_tachebundle_tachetype_personne').append('<option value="'+ value.idDeLoption +'">'+ value.libDeLoption +'</option>');
          });
        }
      });
    }
    La requête dans le repository :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public function getCbPersonne($id)
    	{
    		$q = $this->_em->createQuery("SELECT p FROM EntrepriseBundle:Personne p JOIN EntrepriseBundle:Entreprise e ON p.entreprise_id = :id");
    		$q->setParameter('id',$id);
    		return $q->getResult();
     
    	}
    Et les deux select dans la vu twig:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      </tr>
      <tr>  
        <td>{{ form_label(form.entreprise)}}</td>
        <td>{{ form_widget(form.entreprise, {'attr': {'onChange': 'remplirPersonne();'}}) }}</td>
        <td>{{ form_errors(form.entreprise)}}</td>
      </tr>
      <tr>  
        <td>{{ form_label(form.personne)}}</td>
        <td>{{ form_widget(form.personne)}}</td>
        <td>{{ form_errors(form.personne)}}</td>
      </tr>
      <tr>
    A priori j'ai quelque chose qui cloche puisque je n'ai aucune erreur déclenchée mais ça ne marche pas non plus...
    J'ai insérer la librairie jquery comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <script src="http://code.jquery.com/jquery-1.7.2.js" type="application/javascript"></script>
    Et la fonction JS dans la vue twig :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    {% block javascripts %} <!-- Bloc fichiers js -->
    {{ parent() }}
    <script src="{{ asset('bundles/tache/js/select.js') }}" type="text/javascript"></script>
    {% endblock %}
    Si quelqu'un peut m'aider je serai reconnaissant, merci beaucoup!

  3. #3
    Nouveau membre du Club
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 38
    Points : 30
    Points
    30
    Par défaut
    Bonjour, j'ai avancé un peu dans le problème. J'ai vérifié séparément le contrôleur et la requête (en donnant un id de manière statique à la requête et en remplaçant et en passant par GET au lieu de POST comme méthode ); quand je tape le lien j'ai l'id et la propriété censés être récupérés. Seulement quand je reviens à l'ajax, les données récupérés ne servent à rien, la 2ème liste déroulante ne change pas. Voici mon code pour le contrôleur :
    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
    /**
         * Combobox.
         *
         * @Route("/remplir_cb_personne", name="remplir_cb_personne")
         * @Method("post")
         */
        public function remplirPersonneAction()
        {
            $request = $this->getRequest();
            $em = $this->getDoctrine()->getEntityManager();
            if($request->isXmlHttpRequest()) // pour vérifier la présence d'une requete Ajax
            {
                $id = '';
                $id = $request->get('id');
                if ($id != '')
                {
                $personnes = $em->getRepository('EntrepriseBundle:Personne')->getCbPersonnes($id); 
                $tabPersonnes = array();
                $i = 0;
                    foreach($personnes as $personne) // pour transformer la réponse à ta requete en tableau qui replira le select2
                    {
                        $tabPersonnes[$i]['idP'] = $personne->getId();
                        $tabPersonnes[$i]['nomP'] = $personne->getPrenomNom();
                    }
                $response = new Response();
                $data = json_encode($tabPersonnes); // c'est pour formater la réponse de la requete en format que jquery va comprendre
                $response->headers->set('Content-Type', 'application/json');
                $response->setContent($data);
                return $response;
                }
     
            }
          return new Response('Erreur');  
        }
    Et la fonction javascript:
    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
    function remplirPersonne(){
    var id_select = $('#sortirplus_tachebundle_tachetype_entreprise').val();
    //alert(id_select)
      $.ajax({
        url: "{{ path('remplir_cb_personne') }}",
        type: 'POST',
        data: {'id': id_select},
        dataType: 'json',
        success: function(response){ // quand la réponse de la requete arrive
          $('#sortirplus_tachebundle_tachetype_personne').html('');
          $.each(json, function(index, value) { // et  boucle sur la réponse contenu dans la variable passé à la function du success "json"
          $('#sortirplus_tachebundle_tachetype_personne').append('<option value="'+ value.idP +'">'+ value.nom +'</option>');
          });
        }
      });
    }
    Je n'arrive pas à trouver le problème, si quelqu'un peut avoir une idée qu'il en soit remercié à vie

  4. #4
    Nouveau membre du Club
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 38
    Points : 30
    Points
    30
    Par défaut
    Et voilà j'ai résolu le problème, je poste la solution, ça peut servir :

    Pour le contrôleur, voici le code :

    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
    /**
         * Combobox.
         *
         * @Route("/remplir_cb_personne", name="remplir_cb_personne")
         * @Method("post")
         */
    public function remplirPersonneAction()
    {
            $request = $this->getRequest();
            $em = $this->getDoctrine()->getEntityManager();
            if($request->isXmlHttpRequest()) // pour vérifier la présence d'une requete Ajax
            {
                $id = '';
                $id = $request->get('id');
                if ($id != '')
                {
                $personnes = $em->getRepository('EntrepriseBundle:Personne')->getCbPersonnes($id); 
                $tabPersonnes = array();
                $i = 0;
                    foreach($personnes as $personne) // pour transformer la réponse à ta requete en tableau qui replira le select2
                    {
                        $tabPersonnes[$i]['idP'] = $personne->getId();
                        $tabPersonnes[$i]['nomP'] = $personne->getPrenomNom();
                        $i++;
                    }
                $response = new Response();
                $data = json_encode($tabPersonnes); // c'est pour formater la réponse de la requete en format que jquery va comprendre
                $response->headers->set('Content-Type', 'application/json');
                $response->setContent($data);
                return $response;
                }
     
            }
          return new Response('Erreur');  
    }
    La fonction JS
    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
     
    function remplirPersonne(){
    var id_select = $('#sortirplus_tachebundle_tachetype_entreprise').val();
    //alert(id_select)
      $.ajax({
        url: "{{ path('tache_new') }}",
        type: 'POST',
        data: {'id': id_select},
        dataType: 'json',
        success: function(json){ // quand la réponse de la requete arrive
          $('#sortirplus_tachebundle_tachetype_personne').html('');
          $.each(json, function(index, value) { // et  boucle sur la réponse contenu dans la variable passé à la function du success "json"
          $('#sortirplus_tachebundle_tachetype_personne').append('<option value="'+ value.idP +'">'+ value.nomP +'</option>');
          });
        }
      });
    }
    Et le select concerné dans la vue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <tr>  
        <td>{{ form_label(form.entreprise)}}</td>
        <td>{{ form_widget(form.entreprise, {'attr': {'onChange': 'remplirPersonne();'}}) }}</td>
        <td>{{ form_errors(form.entreprise)}}</td>
      </tr>
    Et j'ai inclut la librairie jQuery :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <script src="http://code.jquery.com/jquery-1.7.2.js" type="application/javascript"></script>

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

Discussions similaires

  1. gestion de Deux Listes Déroulantes liées entre elles
    Par sisiniya dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 09/06/2009, 14h53
  2. Réponses: 8
    Dernier message: 03/08/2008, 14h59
  3. Deux listes déroulantes liées ..
    Par wulfgar57 dans le forum IHM
    Réponses: 1
    Dernier message: 09/09/2007, 19h16
  4. Réponses: 12
    Dernier message: 08/02/2007, 11h59
  5. Plus de deux listes déroulantes liées
    Par Mateache dans le forum ASP
    Réponses: 2
    Dernier message: 23/08/2006, 12h00

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