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 :

Formulaire dynamique AJAX [1.x]


Sujet :

Symfony PHP

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 36
    Par défaut Formulaire dynamique AJAX
    Bonjour,

    J'aimerais alimenter un menu déroulant en fonction de la valeur d'un champ précédemment saisi.
    Sachant que le framework permet d'implémenter les champs du formulaire avec une classe php associée par exemple "AnnonceForm.php".

    Je ne sais pas comment faire pour intégrer AJAX et appeler ces différents champs qui sont appelés dans la classe du formulaire.

    Par exemple :
    -> Une liste déroulante qui contient la liste des régions.

    -> Une autre qui contient la liste des départements.

    En fonction de la région choisit, la deuxième liste générera les départements associés.

    Sachant que j'ai déjà 2 tables renseignées dans ma base comportant la liste des régions et de départements.

    Merci de m'expliquer la procédure ,sinon me proposez un tutoriel qui permet de faire cette manipulation avec Symfony bien sur.

    Merci d'avance pour vos précieux conseils.

  2. #2
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Tu demandes beaucoup... faudra te mouiller un peu sur le coup.

    Il n'y a pas d'objet symfony qui permettent de réaliser cette double cascade sans avoir à ouvrir le moteur.

    Le mieux est de faire un formulaire qui tourne dans un premier temps sans JS. Histoire que ceux qui n'ont pas de JS activé arrivent à gérer ton application.

    Ensuite, d'écrire du code (avec jquery probablement comme framework JS) pour faire les demandes de modification de la liste à symfony. Après, c'est à toi de voir si tu veux que symfony génère la liste avec tous le code HTML et le remplacer dans la page, ou juste te retourne les départements pour la région sous forme JSON et ton code JS fait le remplacement.

    Il (ton code) peut aussi masquer les boutons nécessaire à la page sans JS.

    Symfony va te simplifier la vie dans le traitement des requêtes JS. Et dans les possibilités de factorisation du code.

    Tu as des exemples dans la documentation de symfony sur le site de sensio, en français (les exemples, pas le site). Il ne sont pas exactement ce que tu demandes, mais donnent de bonnes bases.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 36
    Par défaut
    Salut,

    Merci pour ta réponse mais en fait je que je cherche c'est "pour faire les demandes de modification de la liste à symfony" c'est ça en fait car les déclarations sont bien faites dans les classes de formulaires comment je ferai appel à ces derniers dans le JS ?

  4. #4
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Je ne vois pas trop comment expliquer cela en une réponse.

    As-tu déjà fais de l'ajax, du JS ? As-tu déjà utilisé jquery ?

    Il faut lier du code jquery au changement de la valeur de la première liste. Ensuite récupérer les données en affichant un symbole pour prévenir l'utilisateur que l'ordi travail pour lui. Puis mettre en forme et afficher.

    Et côté symfony, il faut une action qui va récupérer les données (le code pour récupérer la liste peut être partagé) et les renvoyer.

    Après, si tu n'as jamais fait de JS ni de discutions entre la couche JS et une application PHP, il faudrait, peut-être, commencer à ce pencher sur les tutoriels correspondants. Vu que je n'ai aucune idée de ton niveau, je ne sais pas trop quoi dire d'autre.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 36
    Par défaut
    Oui en fait je travaille je suis débutant j'ai jamais fait d'AJAX c'est pour ça.
    Merci en tout cas.Je vais continuer mes recherches.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 36
    Par défaut Integration de l'AJAX
    Bonjour,

    J'ai essayé d'intégrer AJAX en procédant comme suit :

    J'ai rajouté la route suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    # routing.yml
    ...
    ajax_departement:
      url:   /ads/departement
      param: { module: ads, action: ajaxDepartement }
    ...
    L'action suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // actions.class.php
     
      /**
       * requete ajax pour avoir la liste des déparements de la région
       *
       * @param sfWebRequest $request
       */
      public function executeAjaxDepartement(sfWebRequest $request)
      {
        $region = Doctrine::getTable('Region')->findOneById(1); // j'ai mis 1 pour tester sur la première region "Alsace"
        return $this->renderPartial('selectDepartement', array('region' => $region));
      }
    Et le partial :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // _selectDepartement.php
    <option value=""></option>
    <?php foreach($region->getDepartements() as $departement): ?>
    <option value="<?php echo $departement->getId() ?>"><?php echo $departement->getNom() ?></option>
    <?php endforeach; ?>
    Et finalement mon _form.php --> formulaire de l'annonce :

    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
     
    <?php use_stylesheets_for_form($form) ?>
     
    <?php use_javascript('jquery-1.4.4.min.js') ?> 
    <?php use_javascript('ajax_reg.js') ?> 
     
    <script language="javascript">
    $(document).ready(function(){
      $("#form_Region_id").change( function() {
        $.post("/ads/departement", { region: $(this).val() },
        function(data)){
          $("#form_Departement_id").html(data);
        });
      });
    });
    </script>
     
    <?php use_javascripts_for_form($form) ?>
    <?php echo form_tag_for($form, '@ads') ?>  
      <table id="job_form">
        <tfoot>
          <tr>
            <td colspan="2">
              <input type="submit" value="Preview your ad" />
            </td>
          </tr>
        </tfoot>
        <tbody>
          <?php echo $form['Categorie_id']->renderRow() ?>
     
          <?php echo $form['Region_id']->renderRow() ?>
    	  <?php echo $form['Departement_id']->renderRow() ?> 
     
    	  <?php //echo $form['Region']['Name']->renderRow() ?> <?php //bug ?>
     
    	  <?php echo $form['CodePostal']->renderRow() ?>
    	  <?php echo $form['Ville']->renderRow() ?>
    	  <?php echo $form['TypeAnnonce']->renderRow() ?>
    	  <?php echo $form['TitreAnnonce']->renderRow() ?>
    	  <?php echo $form['TexteAnnonce']->renderRow() ?>
    	  <?php echo $form['Prix']->renderRow() ?>
    	  <?php echo $form->renderHiddenFields() ?>
    	  <?php foreach ($form['newPhotos'] as $photo): ?>
          <?php echo $photo['caption']->renderRow() ?>
          <?php echo $photo['filename']->renderRow() ?>
          <?php endforeach; ?>
     
        </tbody>
      </table>
    </form>
    Cependant rien à changer j'ai même l'impression que le code ne prend même pas en considération le javascript que j'ai ajouté, quand j'essaie de mettre n'importe quoi ça bogue pas.
    Les valeurs des deux listes déroulantes n'ont pas changé.


    Merci de me corriger ou m'éclairer un peu.

  7. #7
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2008
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Corée

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2008
    Messages : 253
    Par défaut
    je dis ça je dis rien mais je pense que ton javascript n'est jamais appelé car :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $("#form_Region_id").change
    Tu es sur de cet identifiant, ce n'est pas écrit dans ta vue !

    Essaie de mettre un alert() javascript sur cette fonction change pour voir.

    Sinon, à part ça, je ne vois pas l'intéret de faire une requête asynchrone pour ça...

    A ta place je chargerais toutes les régions et tous les département par défaut dans tes deux listes.

    Puis sur ta fonction change, tu met à jour la liste des département en javascript, seulement en les cachant (display: hidden). Bien plus rapide et ça évite des requêtes inutiles.

    Tu peux toujours vérifier dans ton contrôleur après si la région et le département sélectionné correspondent au cas ou la personne fait des modifications dans le code HTML.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 36
    Par défaut
    Salut, merci pour ta réponse.

    En fait j'avais tester l'alerte ça marche donc le javascript est bien exécuté. Et les listes déroulantes sont bien chargées avec toutes les données au départ et la liste de département ne change pas malgré un changement sur la région.
    Je comprend pas comment tu veux que je fasse un hidden sur les départements car normalement le javascript doit affiné automatiquement la liste de départements à chaque changement de région.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <script type="text/javascript">
    $(document).ready(function(){
     
      $("#annonce_Region_id").change( function() {
        $.post("/ads/departement", { region: $(this).val() },
        alert("coucou");
    	function(data){
          $("#annonce_Departement_id").html(data);
        });
      });
    });
    </script>
    Mais comme t'as dit j'ai doute sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ("#form_Region_id").change
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ("#annonceForm_Region_id").change
    Sachant que je fais appel à ce dernier depuis le template newSuccess.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?php use_stylesheet('job.css') ?>
     
    <h1>New Ad</h1>
     
    <?php include_partial('form', array('form' => $form)) ?>
    Je ne sais pas en fait quoi mettre dans le champs # pour récupérer la valeur de la liste déroulante. Pour moi le nom du formulaire c'est "form".

    Merci de m'aider à trouver la bonne syntaxe.

  9. #9
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2008
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Corée

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2008
    Messages : 253
    Par défaut
    Déjà, je suppose que tu utilise JQuery vu cette syntaxe ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ("#form_Region_id").change
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php include_partial('form', array('form' => $form)) ?>
    Cette ligne signifie que tu inclue une vue partiel dont le nom est "_form.php", tu lui passe en paramètre ton formulaire.

    Edite donc ce fichier _form.php, il se trouve dans le même dossier que newSuccess.php que tu montre.

    Si tu laisse le "echo $form" par défaut, tu ne contrôle pas grand chose à l'affichage et pour mettre des identifiants, je te laisse regarder la doc sur les forms pour plus d'indications.

    Sinon utilise tout simplement Firebug ou bien affiche la source de ta page pour trouver l'identifiant de ta liste déroulante.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 36
    Par défaut
    Merci pour ta réponse. Mais si tu regarde bien j'avais poster sur la réponse d'avant mon fichier _form :

    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
    ?php use_stylesheets_for_form($form) ?>
     
    <?php use_javascript('jquery-1.4.4.min.js') ?> 
    <?php use_javascript('ajax_reg.js') ?> 
     
    <script language="javascript">
    $(document).ready(function(){
      $("#form_Region_id").change( function() {
        $.post("/ads/departement", { region: $(this).val() },
        function(data)){
          $("#form_Departement_id").html(data);
        });
      });
    });
    </script>
     
    <?php use_javascripts_for_form($form) ?>
    <?php echo form_tag_for($form, '@ads') ?>  
      <table id="job_form">
        <tfoot>
          <tr>
            <td colspan="2">
              <input type="submit" value="Preview your ad" />
            </td>
          </tr>
        </tfoot>
        <tbody>
          <?php echo $form['Categorie_id']->renderRow() ?>
     
          <?php echo $form['Region_id']->renderRow() ?>
    	  <?php echo $form['Departement_id']->renderRow() ?> 
     
    	  <?php //echo $form['Region']['Name']->renderRow() ?> <?php //bug ?>
     
    	  <?php echo $form['CodePostal']->renderRow() ?>
    	  <?php echo $form['Ville']->renderRow() ?>
    	  <?php echo $form['TypeAnnonce']->renderRow() ?>
    	  <?php echo $form['TitreAnnonce']->renderRow() ?>
    	  <?php echo $form['TexteAnnonce']->renderRow() ?>
    	  <?php echo $form['Prix']->renderRow() ?>
    	  <?php echo $form->renderHiddenFields() ?>
    	  <?php foreach ($form['newPhotos'] as $photo): ?>
          <?php echo $photo['caption']->renderRow() ?>
          <?php echo $photo['filename']->renderRow() ?>
          <?php endforeach; ?>
     
        </tbody>
      </table>
    </form>
    En fait c'est ça la question que dois-je modifier ou dois mettre les identifiants des listes déroulantes ou du formulaire pour qu'il le reconnais en JQuery (#machin..).

    Merci

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 36
    Par défaut
    Merci beaucoup maintenant ça marche décidément fallait juste récupérer le bon ID.

  12. #12
    Invité de passage
    Femme Profil pro
    Inscrit en
    Mai 2011
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations forums :
    Inscription : Mai 2011
    Messages : 1
    Par défaut
    Bonjour,
    j'ai fait la mem chose que toi et j'ai pas de résultat (la 2ieme liste déroulante ne se change pas en fonction de la premiere:

    voici mon script jquery appelé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $(document).ready(function(){
      $("#voiture_marque").change( function() {
    	  $.post("/ajax", { marque: $(this).val() },
    			    function(data){
    			       // $("#voiture_model").empty();
    		            $("#voiture_model").html(data);
    			    });
     
      });
    });
    voici la route dans le fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    routing.yml
    ajax:
      url: /ajax
      param: { module: voiture, action: ajax }

    et voici la fonction executeAjax du module voiture:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public function executeAjax(sfWebRequest $request)
      {
        $marque =         Doctrine::getTable('Marque')->findOneByIdMarque($request->getParameter('marque'));
        return $this->renderPartial('voiture/selectModele', array('marque' => $marque));	
      }
    et finalement voici le partial selectModele appelé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <option value=""></option>
    <?php foreach($marque->getModel() as $modele): ?>
    <option value="<?php echo $modele->getIdModel() ?>"><?php echo $modele->getLibelle() ?></option>
    <?php endforeach; ?>
    SVP aidez-moi!!

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

Discussions similaires

  1. [AJAX] Formulaire dynamique
    Par kikou732 dans le forum AJAX
    Réponses: 0
    Dernier message: 26/12/2011, 22h23
  2. formulaire dynamique : ajax ?
    Par mikl86 dans le forum Services Web
    Réponses: 0
    Dernier message: 27/06/2011, 18h19
  3. formulaire dynamique, conception j'hésite PHP / AJAX /JS
    Par xavioche77 dans le forum Langage
    Réponses: 13
    Dernier message: 31/03/2011, 13h00
  4. [1.x] formulaire dynamique avec ajax
    Par belgacem.tlili dans le forum Symfony
    Réponses: 1
    Dernier message: 29/03/2010, 22h05

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