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 : Retourner un render de template en json


Sujet :

Symfony PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 21
    Points : 11
    Points
    11
    Par défaut Ajax : Retourner un render de template en json
    Bonjour à tous,

    Je ne sais pas si le titre est bien clair. Je vais essayer d'exposer les choses pas à pas.

    Je souhaite, à l'aide d'Ajax, afficher dynamiquement un template twig généré par mon contrôleur dans une div particulière de ma page actuelle. Jusque là, pas de problème.

    Mon problème est que je souhaite, selon les cas, afficher ma réponse dans tel ou tel div.

    Pour ça, j'ai utilisé un retour en json (pas spécialement par choix mais parce qu'après pas mal de recherches, c'est la direction qu'il m'a semblé falloir prendre) avec la mention dataType:'json' côté js.

    Ça donnait quelque chose comme ça côté Controller :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $response = array();
    $response['status'] = 0;
    $response['message'] = 'Mon message';
    return new Response(json_encode($response));
    et côté js :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    dataType: 'json',
    success: function(data){
    	if (data.status == 0) {
    		$('#mon_div').html(data.message);
    	}
    	else if (data.status == 1) {
    		$('#mon_autre_div').html(data.message);
    	}
    }
    Jusque là tout va bien. Le problème arrive lorsque j'essaie de parser non pas 'Mon message' mais un template $this->render('exempleBundle:Exemple:index.html.twig', array('ma_variable'=>$ma_valeur).

    J'ai tenté pas mal de chose à commencer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $response['message'] = $this->render('exempleBundle:Exemple:index.html.twig', array('ma_variable'=>$ma_valeur));
    Puis d'autres choses en utilisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $response->headers->set('Content-Type', 'application/json');
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $response = new JsonResponse();
    mais rien n'y fait.

    Du coup j'en appelle à vos avis. Par ailleurs, je ne tiens pas spécialement au format json si d'autres moyens plus simples existent.

    Je pose la question un peu abruptement car je me dis que la solution est peut-être très évidente, mais si vous avez besoin que je vous décrive tous mes essais avec les comportements en retour, dites-moi.

    Merci par avance !

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 21
    Points : 11
    Points
    11
    Par défaut
    Je viens finalement de trouver la solution (ça peut paraître louche mais je vous promets que j'avais cherché un bout de temps avant de poster )

    En fait, c'était les entêtes qui faisaient planter. Du coup, j'ai réglé le problème en rajoutant ->getContent().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $response['message'] = $this->render('exempleBundle:Exemple:index.html.twig', array('ma_variable'=>$ma_valeur))->getContent();
    Je ne mets pas tout de suite le sujet comme résolu car ma méthode ne me paraissant pas forcément très propre cela m'intéresserait d'avoir vos avis là dessus.

  3. #3
    Membre expert
    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
    Points : 3 004
    Points
    3 004
    Par défaut
    yoooooooooo maaaaaaaaaaaaaaaaaaaaan,

    arrêtons d'utiliser ce terme "propre" qui ne veut rien dire. c'est un terme de geek que je n'aime pas.


    en tout cas, c'est une façon de faire car il n'y en a pas d'autre
    (en tout cas pas à ma connaissance)

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 21
    Points : 11
    Points
    11
    Par défaut
    ok, alors sans parler de "propre" ou "pas propre", je m'inquiétais de si cette méthode ne pouvait pas avoir des conséquences auxquelles je ne pense pas (genre au niveau du cache ou autre) ?

  5. #5
    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
    Mmmh, arrête moi si je me trompe je ne suis pas un grand gourou de jQuery mais il me semble que la méthode success() est dépréciée. (cf. done(), fail(), always())

    Ensuite deuxième chose je ne connais pas ton cas de figure mais est-ce qu'il s'agit d'un statut success et l'autre error ? Ou bien deux succès différents ?

    Dans le premier cas tu ne devrais pas tout mettre dans la partie success (ou done()) et ton dataType peut rester HTML. Tu auras dans les deux cas une réponse HTML, mais dans la méthode .done() tu afficheras le contenu dans une div, et dans la méthode .fail() tu l'afficheras dans une autre. Ca t'évite de devoir passer par du JSON inutilement.

    Par contre si tu as deux comportement de success différents, alors c'est une solution valable.

Discussions similaires

  1. [Ajax] Retourner un objet en Json ?
    Par Odawin dans le forum Spring
    Réponses: 19
    Dernier message: 28/01/2014, 15h11
  2. Retourner un tableau d'objet avec json vers javascript
    Par beegees dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 09/04/2013, 20h20
  3. [MooTools] Requête Ajax retourne tout le temps une erreur 503
    Par xillibit dans le forum Bibliothèques & Frameworks
    Réponses: 4
    Dernier message: 25/11/2011, 07h59
  4. [AJAX] Requete Ajax retournant un 403
    Par Jim_Crayon dans le forum AJAX
    Réponses: 14
    Dernier message: 06/08/2011, 12h14
  5. Mvc et ajax: retourner une information
    Par mermich dans le forum ASP.NET MVC
    Réponses: 2
    Dernier message: 16/12/2010, 16h13

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