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 :

communication entre ajax et twig


Sujet :

Symfony PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2013
    Messages : 19
    Points : 12
    Points
    12
    Par défaut communication entre ajax et twig
    Bonjour,

    j'aimerais afficher des sous-catégories en fonction d'un choix d'un choix porté dans un select, pour cela j'utilise ajax pour récupérer l'id du choix et le transmettre au contrôleur, le contrôleur récupère alors le résultat de la recherche en fonction de l'id de la catégorie choisie dans le repository de la sous catégorie et renvoie cette réponse sous format json. Jusque la tout va bien car je réussit à voir l'objet json dans la console. mon soucis se porte au niveau de récupérer cet objet json dans json et de boucler pour qu'il m'affiche les résultats. Merci de m'aider

    code dans le controleur

    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
     
       $request = $this->getRequest();
     
    if($request->isXmlHttpRequest())
    {
    $idclient = $request->request->get('id');
     
        if ($idclient != null)
        {
    	$getprojet= $this->getDoctrine()
    	->getEntityManager()
    	->getRepository('EliprojectCollaborateurBundle:Projet')
    	->findBy(array('idclient'=>$idclient));
     
    	$tabProjets = array();
    	$i = 0;
     
    	foreach ($getprojet as $projet)
    	{
    	    $tabProjets[$i]['idprojet'] = $projet->getIdprojet();
    	    $tabProjets[$i]['projLibelle'] = $projet->getProjLibelle();
    	    $i++;
    	}
     
    	$response = new Response();
      	$projets = json_encode(array('projet' => $tabProjets));
      	$response->headers->set('Content-Type', 'application/json');
     	$response->setContent($projets);
     
    	return $response;
       }
    }
    ma requete ajax:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        function getprojets(idclient){
        $.ajax({
        type: 'POST',
        url: "{{ path('eliproject_collaborateur_get_projet')}} ",
        data: "&id="+idclient,
        complete: function(data) {
    				                     $('#projets').html(data.responseText)
        }
      });
    }


    dans ma vue twig
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        <select id="clients" name="client" onchange="getprojets(this.value)" >
        <option selected="selected" value="defaut">-------------------- Selectionner un client -----------------</option>
         {%for result in results %}
        <option value="{{result.idclient}}">{{result.clNomsociete}}</option>
        {%endfor%}
    </select>

    je devrais donc par la suite récupérer mon objet json et afficher les sous catégories correspondant à la catégorie choisie plus haut.

    Merci de votre aide

  2. #2
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 98
    Points : 163
    Points
    163
    Par défaut
    C'est quoi le probleme ? ton controlleur ne reçois pas les appels en ajax ?

  3. #3
    Membre expérimenté Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut
    Hello,

    Rajoute 'datatype: "json"' dans le tableau d'options passée à ta fonction ajax.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $.ajax({
        type: 'POST',
        url: "{{ path('eliproject_collaborateur_get_projet')}} ",
        data: "&id="+idclient,
        datatype: "json",
        complete: function(data) {
    	$('#projets').html(data.responseText)
        }
    });
    Et deuxième chose : ce n'est pas dans ta template initiale (twig) que tu pourras traiter les résultats retournés, mais directement dans la méthode complete (en js).

  4. #4
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2013
    Messages : 19
    Points : 12
    Points
    12
    Par défaut
    le controlleur recois bien la requete ajax.

    J'ai pensé autrement en renvoyant le résultat du controlleur vers un template intermédiaire que je vais ensuite inclure dans le template source

    controleur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
         $response = new Response();
         $projets = json_encode(array('projet' => $tabProjets));
         $response->headers->set('Content-Type', 'application/json');
         $response->setContent($projets);
         return $this->render('::getprojet.html.twig',array('reponse'=>$response));
    et dans le template de départ

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        {% include"::getprojet.html.twig" %}
    le souci ici est que je ne recois pas de réponse dans le template getprojets, encore moins dans le template de départ, je n'ai pas de méssage d'erreur mais rien ne s'affiche

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 98
    Points : 163
    Points
    163
    Par défaut
    Bonjour op,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <script>
     
        function getprojets(idclient){
        $.ajax({
        type: 'POST',
        url: "{{ path('eliproject_collaborateur_get_projet')}} ", # Comment est-ce que tu fais pour appeler une methode twig dans un script JS ?
        data: "&id="+idclient,
        complete: function(data) {
    				                     $('#projets').html(data.responseText)
        }
      });
    }
    </script>
    Essaie de jeter un oeil à FOSjsRouting, il faut rajouter un dataType comme te l'as dit nicoF

  6. #6
    Membre expérimenté Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut
    # Comment est-ce que tu fais pour appeler une methode twig dans un script JS ?
    Je pense que son script se trouve dans la template twig et non dans un fichier js.

    J'ai du mal à comprendre l'intérêt du dernier morceau de code que tu as posté : tu fais une nouvelle réponse, qui contient un tableau en json, qui va être traité dans une template, qui va être affiché depuis le javascript. Pourquoi faire simple quand tu peux faire compliqué

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    use Symfony\Component\HttpFoundation\JsonResponse;
     
    $response = new JsonResponse();
    $response->setData(array(
        'data' => 123
    ));
    Ça c'est ce qu'on trouve dans la doc et qui permet de retourner une réponse Json : pas besoin de plus.

    Et ensuite c'est dans ta méthode 'complete' que tu vas traiter ton json, en javascript.

    Tu peux aussi passer par les template du xxx.js.twig (ça se rapproche un peu plus de ce que tu souhaites faire) mais je n'aime pas du tout cette manière de faire car on perd en lisibilité : lorsque je regarde un appel AJAX j'aime savoir quelle route il appelle et quel traitement il fait, chose qu'on perd avec ta méthode ou en utilisant les js.twig

  7. #7
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 98
    Points : 163
    Points
    163
    Par défaut
    @nico_T,
    il utilise une réponse en JSON, depuis symfony 2.2(la flemme de vérifier exactement ) l'objet JsonResponse est là pour faciliter les retours en json, c'est meme classe fille de Response normalement son code php devrai fonctionner sans souçis.

    Meme s'il est dans un template twig, il auras un gros souçis d'exécution:
    Twig en bon moteur de template vas charger le DOM completement en ignorant tout ce qui est JS pour créer une page php
    Une fois le DOM pret les scripts JS (et jquery ) vont se declencher
    à ce moment si un appel à twig est fait c'est trop tard, twig à déja convertis le fichier en php.

Discussions similaires

  1. Communication entre fichier js et une servlet Java via Ajax
    Par belpg dans le forum Ext JS / Sencha
    Réponses: 3
    Dernier message: 17/01/2013, 12h21
  2. probleme communication entre getUrl flash et page html via ajax
    Par sooprano dans le forum Intégration
    Réponses: 0
    Dernier message: 08/07/2009, 16h00
  3. Communication entre processus
    Par markopolo dans le forum C++Builder
    Réponses: 2
    Dernier message: 26/06/2003, 16h21
  4. Réponses: 5
    Dernier message: 25/03/2003, 19h43
  5. communication entre programmes
    Par jérôme dans le forum C
    Réponses: 12
    Dernier message: 16/04/2002, 08h05

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