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 :

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


Sujet :

Symfony PHP

  1. #21
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2004
    Messages : 318
    Points : 362
    Points
    362
    Par défaut
    Ce que tu peux faire par exemple, c'est au changement de la sélection d'un département, tu envois une requête Ajax avec l'ID du département, te répondant l'ID du pays correspondant.
    Au retour de la requête tu peux alors affecter la valeur du pays à ton select de pays, et par exemple tu peux le rendre "disabled" pour empêcher de changer de pays.
    Si tu ne choisis aucun département, alors tu enlèves le "disabled" et tu remets la valeur par défaut.

  2. #22
    Membre régulier
    Profil pro
    IED Web
    Inscrit en
    Octobre 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : IED Web

    Informations forums :
    Inscription : Octobre 2006
    Messages : 60
    Points : 90
    Points
    90
    Par défaut
    Entre pays et département, il te faut une relation http://www.doctrine-project.org/docs...-bidirectional, l'as-tu ?
    Ainsi, cela te permet d'avoir acces à la liste des departements associés à un pays avec $departements.

    Ensuite, comme le disai Guybrush113, il te faut qlq chose du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
               'query_builder' => function (EntityRepository $repository) use ($deptId) 
                                  {                                        
                                   $qb = $repository->createQueryBuilder('pays')->select('dept')->join('pays.departements', 'dept')                       
    if ($deptId) {                  
                                   $qb = $qb->where('dept.id = :deptId')->setParameter('deptId', $deptId);
    } 
                                   return $qb;                                    
                                  }
    avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
           if($data instanceof Province) 
           {                 
            $refreshPays($form, $data->getDepartement()->getId());                 
           }

  3. #23
    Membre régulier
    Profil pro
    IED Web
    Inscrit en
    Octobre 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : IED Web

    Informations forums :
    Inscription : Octobre 2006
    Messages : 60
    Points : 90
    Points
    90
    Par défaut
    Citation Envoyé par dubitoph Voir le message
    Si je comprends bien, lorsque j'utilise un query_builder, à ce moment, il travaille directement avec les champs de la base de données et non avec les entités?

    Dans ce cas, comme argument dans mon tableau pour créer le champ, je ne devrais pas avoir 'query_builder', mais quelque chose qui me permette, dans ma fonction, d'instancier l'objet 'Pays' adéquat lorsqu'un département est choisi.

    ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pays = $departement->getPays();
    Un café de réanimation plus tard.. il est vrai que tu peux te passer d'un query_builder, dans le cas où ton $departement est non null :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
           if($data instanceof Province) 
           {                 
            $refreshPays($form, $data->getDepartement()->getPays());                 
           }

    Dans ce cas tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
             $form->add($factory->createNamed('entity','pays',null, array(                 
               'class' => 'HotelsGestionAnnoncesBundle\Entity\Pays',                 
               'property' => 'name',                 
               'label' => 'Pays',                 
               'choices' => array($pays->getId() => $pays));

  4. #24
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 803
    Points : 356
    Points
    356
    Par défaut
    Désolé, je n'avais pas vu qu'il y avait une seconde page avec vos réponses. Je faisait un refresh de la première... Merci beaucoup pour votre implication.

    Je vais tenter d'appliquer vos solutions, mais je suis actellement hospitalisé et je dois maintenant aller passer quelques examens. Je reprendrai le tout d'ici 1h.

  5. #25
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 803
    Points : 356
    Points
    356
    Par défaut
    Bonjour,

    Ne m'en sortant pas avec la méthode proposée par bendede (un grand merci pour ton aide tout de même), j'en suis revenu à une méthode Ajax que je maîtrisais hors Symfony en suivant la proposition de Guybrush113.

    Donc dans mon template .twig, j'ai ajouté ceci en début de fichier :

    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
    <script type="text/javascript">
     function getXhr()
     {
      var xhr = null;
     
      if(window.XMLHttpRequest) // Firefox et autres
    	 xhr = new XMLHttpRequest();
      else if(window.ActiveXObject)
    	{ // Internet Explorer
    	 try
    	  {
    	   xhr = new ActiveXObject("Msxml2.XMLHTTP");
    	  }
     
    	 catch (e)
    	  {	   
         xhr = new ActiveXObject("Microsoft.XMLHTTP");
    	  }
    	}
      else
    	{ // XMLHttpRequest non supporté par le navigateur
    	 alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
    	 xhr = false;
    	}
     
      return xhr;
     }
     
     function paysByDepartement(idDepartement)
      {
        xhrPaysByDepartement = getXhr();
     
        xhrPaysByDepartement.onreadystatechange = function()
         {
          if(xhrPaysByDepartement.readyState == 4 && xhrPaysByDepartement.status == 200)
           //document.getElementById('hotels_gestionannoncesbundle_provincetype_pays').value = xhrPaysByDepartement.responseText;
           document.getElementById('hotels_gestionannoncesbundle_provincetype_pays').disabled = true;
         }
     
        xhrPaysByDepartement.open("POST","{{ path('province_paysByDepartement')}}",true);
        xhrPaysByDepartement.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
        xhrPaysByDepartement.send("idDepartement=" + idDepartement);
      }
    </script>
    Question : je suppose que, comme je le faisais auparavant, il est préférable de sortir les scripts Javascript du template. Au niveau de Symfony, quelle est la convention quant à l'endroit de stockage de ceux-ci?

    Dans mon fichier .yml, j'ai ajouté la route reprise dans le script précédent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    province_paysByDepartement:
        pattern:  /paysByDepartement
        defaults: { _controller: "HotelsGestionAnnoncesBundle:Province:paysByDepartement" }
        requirements: { _method: post }
    Dans ProvinceController.php, j'ai ajouter cette fonction :

    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
        public function paysByDepartementAction()
         {
          /*$request = $this->container->get('request');
     
          if($request->isXmlHttpRequest())
          {
              $idDepartement = '';
              $idDepartement = $request->request->get('idDepartement');
     
              $em = $this->container->get('doctrine')->getEntityManager();
     
              if($idDepartement != '')
              {
                     $qb = $em->createQueryBuilder();
     
                     $qb->select('p')
                        ->from('HotelsGestionAnnoncesBundle:Pays', 'p')
                        ->where("p.id = :idDepartement")
                        ->orderBy('p.nom', 'ASC')
                        ->setParameter('idDepartement', '%'.$idDepartement.'%');
     
                     $query = $qb->getQuery();               
                     $pays = $query->getResult();
              }
              else {
                  $pays = $em->getRepository('HotelsGestionAnnoncesBundle:Pays')->findAll();
              }
     
              return $pays;
          }*/
     
          return array(); //Tout le reste est commenté, retour d'un tableau vide uniquement pour essai
         }
    Lorsque j'exécute le tout, rien ne se passe. Le champs pays n'est pas désactivé. Je n'obtiens aucune erreur de Symfony. Par contre, dans Firebug, j'obtiens une erreur qui ne m'est pas parlante :

    ""NetworkError: 500 Internal Server Error - http://localhost/Symfony/web/app_dev.php/Hotels/GestionProvince/paysByDepartement"

    En regardant un peu plus loin, j'ai vu que mon xhrPaysByDepartement.status n'avait jamais la valeur 200, mais toujours 500. Cependant, je ne sais pas ce que cela signifie.

    Quelqu'un aurait une idée?

    Merci d'avance.

  6. #26
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 803
    Points : 356
    Points
    356
    Par défaut
    Dans mon template, je viens de modifier mon script Javascript en utilisant JQuery :

    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
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js" type="text/javascript"></script>
     
    <script type="text/javascript">
     function paysByDepartement(idDepartement)
      {
        var DATA = "idDepartement="+idDepartement;
     
        $.ajax
    	  ({
    		  type: "POST",
    		  url: "{{ path('province_paysByDepartement') }}",
    		  data: DATA,
     
          success: function(res)
    		   {
    			  alert("OK !");
    			  //$('div#sugestResults').html(data);
    		   }
    	  });
     
    	  return (false);
      }</script>
    Lors de l'exécution, j'obtiens toujours la même erreur 500.

  7. #27
    Membre régulier
    Profil pro
    IED Web
    Inscrit en
    Octobre 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : IED Web

    Informations forums :
    Inscription : Octobre 2006
    Messages : 60
    Points : 90
    Points
    90
    Par défaut
    Tu trouvera ton erreur dans les logs Symfony, détaillé avec l'environnement dev.

  8. #28
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 803
    Points : 356
    Points
    356
    Par défaut
    Bonjour bendede,

    Je suis en environnement de développement (url = http://localhost/Symfony/web/app_dev...onProvince/new), mais je n'obtiens aucun message de Symfony.

    Dans le fichier de logs, je trouve ceci qui pourrait indiquer quelque chose :

    "[2011-12-02 11:52:16] request.CRITICAL: LogicException: The controller must return a response (null given). Did you forget to add a return statement somewhere in your controller? (uncaught exception) at C:\wamp\www\Symfony\app\cache\dev\classes.php line 3899 [] []"

  9. #29
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 803
    Points : 356
    Points
    356
    Par défaut
    En tentant de modifier le retour de la fonction dans le controller, j'obtiens toujours le même type d'erreur :

    "[2011-12-02 12:20:34] request.CRITICAL: LogicException: The controller must return a response (Array(a => 1) given). (uncaught exception) at C:\wamp\www\Symfony\app\cache\dev\classes.php line 3899 [] []"

  10. #30
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2004
    Messages : 318
    Points : 362
    Points
    362
    Par défaut
    Il faut lui renvoyer un objet Response, tout est dans la description de l'erreur

  11. #31
    Membre régulier
    Profil pro
    IED Web
    Inscrit en
    Octobre 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : IED Web

    Informations forums :
    Inscription : Octobre 2006
    Messages : 60
    Points : 90
    Points
    90
    Par défaut
    Il faut que tu approfondisses la documentation symfony2 et tutoriels. Et dans le cas présent : http://symfony.com/doc/current/book/...ring-templates

    Soit tu effectue le rendu via une vue avec par exemple un :
    return $this->render('AcmeHelloBundle:Hello:index.html.twig', array('name' => $name));

    Soit directement des données avec un Response :
    return new \Symfony\Component\HttpFoundation\Response('<html><body>Hello '.$name.'!</body></html>');

    Après il semble que tu veuilles renvoyer $pays, qui sera un tableau d'objet, donc tu pourra pas le renvoyer tel quel. Tu as du le remettre sous forme de html dans ton template je suppose et donc il faut bien que tu utilises le rendu via une vue.

    Pour les rendu du template, et autres cas généraux, il faut vraiment que tu lises la documentation pour t'en sortir seul, ou revenir à un framework plus simple ou pas de framework du tout... Symfony2 est pas simple.

  12. #32
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 803
    Points : 356
    Points
    356
    Par défaut
    Ok, merci beaucoup pour tous ces renseignements. Je pensais que le message signifiait qu'il attendait un 'return'. Je n'ai jamais pensé qu'il attendait un objet reponse.

    J'avais cherché de la documentation sur l'Ajax dans Symfony, mais je n'ai pas trouvé grand chose.

    Un grand merci pour ton aide.

  13. #33
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 803
    Points : 356
    Points
    356
    Par défaut
    Pour info, voici la manière dont j'ai finalement procédé.

    Dans mon template :

    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
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js" type="text/javascript"></script>
     
    <script type="text/javascript">
     function paysByDepartement(idDepartement)
      {
        var DATA = "idDepartement="+idDepartement;
     
        $.ajax
    	  ({
    		  type: "POST",
    		  url: "{{ path('province_paysByDepartement') }}",
    		  data: DATA,
     
          success: function(res)
    		   {
    			  document.getElementById('hotels_gestionannoncesbundle_provincetype_pays').disabled = true;
    			  document.getElementById('hotels_gestionannoncesbundle_provincetype_pays').value = res;
    		   }
    	  });
     
    	  return (false);
      }
    </script>
    Dans mes routes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    province_paysByDepartement:
        pattern:  /paysByDepartement
        defaults: { _controller: "HotelsGestionAnnoncesBundle:Province:paysByDepartement" }
        requirements: { _method: post }
    Dans mon controller :

    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
        public function paysByDepartementAction()
         {
          $request = $this->container->get('request');
     
          if($request->isXmlHttpRequest())
          {
              $idDepartement = $request->request->get('idDepartement');
     
              $em = $this->container->get('doctrine')->getEntityManager();
     
              $departement = $em->getRepository('HotelsGestionAnnoncesBundle:Departement')->find($idDepartement);
              $idPays = $departement->getPays()->getId();
     
              return new \Symfony\Component\HttpFoundation\Response($idPays);
          }
         }

  14. #34
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 10
    Points : 7
    Points
    7
    Par défaut BONJOUR
    salut
    je peux voir le controller s'il vous plait MERCI

    je suis confronté au même problème

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [DOM] Deuxieme liste déroulante liée via ajax, encore inclure ajax?
    Par clara1 dans le forum Général JavaScript
    Réponses: 48
    Dernier message: 16/05/2008, 15h06
  2. [AJAX] Listes déroulantes liées
    Par Jiraiya42 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 14/04/2008, 09h58
  3. ajax, php et 3 listes déroulantes liées
    Par jfox dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 04/04/2008, 14h13
  4. Plusieurs listes déroulantes liées (ajax)
    Par sassien dans le forum Struts 2
    Réponses: 1
    Dernier message: 18/03/2008, 13h52
  5. [AJAX] Listes déroulantes liées avec Ajax
    Par paupiette dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 01/08/2006, 16h51

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