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 :

Ma première requête en ajax. [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 284
    Points : 149
    Points
    149
    Par défaut Ma première requête en ajax.
    Bonsoir,

    J'aimerais faire ma première requête en AJAX sous symfony2, seulement je n'ai pas l'impression que le processus passe par mon contrôleur, en tout cas la requête échoue...

    Voici le code:

    le routeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    searchbar:
        pattern:  /rechercher
        defaults: { _controller: SiteMainBundle:Main:rechercher }
        requirements:
            _method: POST
    Le controller (d'ailleurs ici, est-ce possible de retourner uniquement les donnés ? Je vais les intégrer dans la vue qui les appellent (via JQuery) donc je ne vois pas trop quelle vue appeller...):
    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
    public function rechercherAction()
    	{
    		echo 'TEST !';
    		$res = "";
    		$request = $this->get('request');
    		if ($request->isXmlHttpRequest())
    		{
    			$keyword = $request->request->get('keyword');
     
    			$em = $this->get('doctrine')->getEntityManager();
     
    			/*Faire la requête*/
    		}
    		return $this->render('???.html.twig', array
    		(
    			'res' => $res
    		));
    	}
    La fonction JQuery (bien appelée)
    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
    function getSearchSugests(keyword)
    {
    	var DATA = "keyword="+keyword;
    	$.ajax
    	({
    		type: "POST",
    		url: "{{ path('searchbar') }}",
    		data: DATA,
    		success: function(res)
    		{
    			alert("OK !");
    			$('div#sugestResults').html(data);
    		}
    	});
    	return (false);
    }
    Merci pour les explications !

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2009
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 96
    Points : 111
    Points
    111
    Par défaut
    Bonjour;

    ça donne quoi comme erreur; déjà dans ta fonction JQuery il faut modifier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    			$('div#sugestResults').html(data);
    ...
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    			$('div#sugestResults').html(res);
    ...

  3. #3
    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
    Salut.

    Tu peux renvoyer du JSON par exemple, c'est le plus conseillé pour les requêtes AJAX, surtout pour traiter données en retour. Et en fait c'est assez simple, il suffit de renvoyer dans ta réponse ce genre de choses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return new Response(json_encode($json_data));
    Il faut se dire qu'une requête AJAX n'a rien de plus compliqué, ta requête est une action dans un controller. Ensuite tu peux restreindre d'avantage de choses, comme tu a fait pour la route avec la methode POST, ou bien sur la réponse renvoyée en précisant le format ou autres choses. Tu peux regarder l'élément Symfony\Component\HttpFoundation\Response pour plus d'informations.
    Par exemple en étant plus précis pour le retour en JSON, tu peux faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $response = new Response();
    $response->headers->set('Content-Type', 'application/json');
    $response->setContent(json_encode(array('attr' => $value)));
    return $response;

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 284
    Points : 149
    Points
    149
    Par défaut
    Bonjour,

    Merci pour ces explications !

    Voici les modifications effectuées:

    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
    public function rechercherAction()
    	{
    		echo 'TEST !';
    		$res = "test";
    		$request = $this->get('request');
    		if ($request->isXmlHttpRequest())
    		{
    			$keyword = $request->request->get('keyword');
     
    			$em = $this->get('doctrine')->getEntityManager();
     
    			/*Mon tratement à venir...*/
    		}
    		return (new Response(json_encode($res)));
    	}
    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
    function getSearchSugests(keyword)
    {
    	var DATA = "keyword="+keyword;
    	$.ajax
    	({
    		type: "POST",
    		url: "{{ path('searchbar') }}",
    		data: DATA,
    		success: function(res)
    		{
    			alert("OK !");
    			$('div#sugestResults').html(res);
    		}
    	});
    	return (false);
    }
    Sur firebug, je n'ai rien dans réseau/JS mais dans reseau/Tous j'ai une erreur 404 !

    No route found for "POST /{{ path('searchbar') }}"

    Pourtant cette route est bien en place...

  5. #5
    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
    Je pense que ton Twig n'est pas interprété dans ton Javascript. Soit tu inclus ton script dans ton fichier .html.twig, soit tu créée un fichier .js.twig (meilleure solution à mon avis) pour que ta fonction 'path' soit correctement exécutée.

    Sinon ce que je fais régulièrement de mon côté sur des pages "light", je créée le path dans le href de mon lien déclenchant la requête Ajax (donc dans mon html), et je le récupère facilement ensuite en javascript.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 284
    Points : 149
    Points
    149
    Par défaut
    Bonjour,

    J'ai tenté d'ajouter l'extension .twig à mon js et ai bien modifié le fichier inclus, mais j'ai toujours la même erreur...

    Je précise que la requête entrait dans le success avant que je rajoute du code, je pense donc qu'il doit y avoir une petite erreur quelque part mais qui m'échappe.

    Voici le code côtè html.twig

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <input type="text" id="search_bar" onKeyUp="getSearchSugests(this.value);"/>
    			<div id="sugestResults"></div>
    EDIT:

    J'ai suivit ta méthode en implémentant un "href" et en le récupérant en JS, effectivement ça fonctionne. Est-il donc définitivement impossible d'utiliser du TWIG dans un JS inclus ?

  7. #7
    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
    Perso j'utilise une route et un controller générique pour charger mon javascript quand il a besoin de twig :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    /**
     * @Route("/js/{file}.js", name="js_loader", requirements={"file" = ".*"})
     */
    public function getJS($file) {
            return new Response($this->renderView('BundleName::'.$file.'.js.twig'));
    }
    Après je ne sais si c'est la bonne solution, mais ca fonctionne et ca me convient

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

Discussions similaires

  1. [AJAX] faire une requête mysql ajax
    Par affreuxzozo dans le forum AJAX
    Réponses: 1
    Dernier message: 04/05/2009, 13h16
  2. Réponses: 4
    Dernier message: 25/02/2009, 14h22
  3. Réponses: 3
    Dernier message: 19/05/2008, 10h36
  4. [AJAX] [DWR] Première tentative avec Ajax
    Par bzoler dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 27/03/2008, 17h12
  5. [AJAX] Enchainer plusieurs requêtes avec Ajax
    Par Bobtop dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 01/08/2006, 08h13

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