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 :

Remplir dynamiquement un champ select avec ajax


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 39
    Par défaut Remplir dynamiquement un champ select avec ajax
    Bonjour,

    Je débute avec Symfony2 et j'utilise la libraire FOSUserBundle pour la gestion de mon espace membre.

    J'ai modifié mon formulaire d'inscription en ajoutant deux champs de type select ( pays et région). Je voudrais qu'en sélectionnant le pays que la liste région soit celle du pays sélectionné.

    J'utilise ajax pour remplir ma liste de régions, cependant quand je sélectionne un pays et que j'affiche sa valeur, elle est indéfinie.

    Quelqu'un pourrait-il m'aider à résoudre ce problème. Ci-dessous mes différents codes.

    Le formulaire twig:
    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
     
    {% block javascripts %}
        <script src="{{ asset('bootstrap-3.0.3/userbundle/js/fillRegistration.js') }}"  type="application/javascript"></script>
    {% endblock %}
     
    <form  "action="{{ path('fos_user_registration_register') }}" {{ form_enctype(form) }} method="POST" class="fos_user_registration_register
    form-horizontal" role="form">
     
     
     
            <div class="col-md-3 white-background"></div>
           <div class="col-md-6">
            <div class="row">
                          <div class="form-group">
                    <label class="col-sm-5 control-label">{{ form_label(form.country) }}</label>
                    <div class="col-sm-7">
                    {{ form_widget(form.country, {'attr': { 'class': 'form-control', 'onChange': 'fillRegion();', 'id': 'country'}}) }}
                    </div>
                  </div>
                      <div class="form-group">
                    <label class="col-sm-5 control-label">{{ form_label(form.region) }}</label>
                    <div class="col-sm-7">
                    {{ form_widget(form.region, {'attr': {'class': 'form-control'}}) }}
                    </div>
                  </div>               
            </div>
                 <div class="form-group">
            <div class=" col-sm-12 align-center-button">
                <button type="submit" id="_submit" name="_submit" class="btn btn-btn btn-primary">{{ 'registration.submit'|trans({},          'FOSUserBundle') }}</button>
            </div>
        </div>
           </div>
        <div class="col-md-3 white-background"></div>
    Le code 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
    17
    18
    19
    20
     
    function fillRegion()
    {
            var id_country = "";
        alert(' avant ===> '+id_country);
        id_country = $("select.country option:selected").val();
        alert(' après ===> '+id_country);
        $.ajax({
          url: "{{ path('pme_registration_fill_region }}",
          type: 'POST',
          data: {'id': id_country},
          dataType: 'json',
          success: function(json){
         $('#region').html('');
         $.each(json, function(index, value) {
        $('#region').append('<option value="'+ value.regCode +'">'+ value.regName +'</option>');
          });
        }
      });
    }
    Le code du 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    public function fillRegionAction()
        {
          $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 != '')
            {
              $tesObjets = $em->getRepository('PmeUserBundle:Countries')
                      ->find($id); // qui retourne une collection d'objet je présume
              $tabObjet = array();
              $i = 0;
              foreach($tesObjets as $tonObjet) // pour transformer la réponse à ta requete en tableau qui replira le select2
              {
            $tabObjet[$i]['regCode'] = $tonObjet->getAlpha2();
            $tabObjet[$i]['regName'] = $tonObjet->getLangFr();
              }
              $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 vers l'appel ajax:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    pme_registration_fill_region:
        pattern: /fillRegion
        defaults: { _controller: PmeUserBundle:UserBundle:fillRegion}
        requirements:
            _method: POST

    Merci d'avance pour votre aide

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $tesObjets = $em->getRepository('PmeUserBundle:Countries')
                      ->find($id); // qui retourne une collection d'objet je présume
    Et non, c'est findAll() qui renvoit tous les objets d'une table.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 39
    Par défaut
    Merci @gototog pour ton retour.

    En utilisant find($id), je veux juste recupérer l'entité correspondant à l'id $id.
    Cependant j'ai utilisé findAll() et j'ai toujours le même problème.
    Le problème devrait se trouver entre le fichier twig, le js et la route puisque je n'arrive même pas à afficher le contenu de mon formulaire.
    Mais pour l'instant je ne trouve pas c'est quoi le problème.

  4. #4
    Membre extrêmement actif
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Par défaut
    procède par étape, tu as bien un retour de ta requête ajax ?

    ensuite analyse les données du retour ajax , sous forme? tableau, objet etc ...



    tu peux voir avec firebug si ça se passe bien aux niveau des requêtes.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 39
    Par défaut
    Merci @dukoid pour cette piste.

    En affichant les erreurs ajax, j'ai un statut d'erreur 404 (Page not found).
    C'est certainement un problème de route. je vais regarder ça de plus près.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 39
    Par défaut
    avec firebug j'ai cette erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    POST http://findjob.local/app_dev.php/%7B%7B %20path(%27pme_registration_fill_region%20%7D%7D 404 Not Found
    c'est bien un problème de route mais je ne sais pas comment résourdre ce problème.

    Merci encore pour votre aide.

Discussions similaires

  1. Réponses: 3
    Dernier message: 26/10/2010, 09h27
  2. remplir un select avec ajax
    Par gtraxx dans le forum jQuery
    Réponses: 4
    Dernier message: 12/06/2009, 09h31
  3. Réponses: 0
    Dernier message: 13/09/2007, 08h33
  4. Initialisation Select avec Ajax (php)
    Par VooDooNet dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 07/08/2007, 09h45
  5. Inserer dynamiquement des champs input avec attribut
    Par titou250 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 12/01/2007, 09h44

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