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 :

Utiliser Ajax avec Symfony2 [2.x]


Sujet :

Symfony PHP

  1. #21
    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
    dans la requete ajax tu as cette ligne : data: "valeur = {{nombre_objets}} ",


    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
    ...
    		$em = $this->getDoctrine()->getManager();
     
    		//On récupère le repository de Coffre
    		$repositoryCoffre = $em->getRepository('AjaxAppliBundle:Coffre');
     
    		//On récupère le coffre que l'on souhaite (1er enregistrement de la table)
    		$coffre = $repositoryCoffre->find(1);
     
    		//On récupère le nombre d'objets contenus dans le coffre
    		$nombreObjetsEnBase = $coffre->getNombreObjets();
    
                    $nombreObjetsAfficher = $request->get('valeur');
    
    if (nombreObjetsEnBase != nombreObjetsAfficher ) {
       envois reponse AJAX avec nombreObjetsEnBase 
    }

  2. #22
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 162
    Par défaut
    Salut,

    Je te remercie, je comprends mieux.

    Du coup, j'ai suivi ce que tu m'as dit et j'ai également testé le code suivant avec Firebug mais ça n'a rien donné.

    Je n'ai rien en lançant: http://localhost/ajaxappli/app_dev.php/coffre

    Ça me fait apparaître que le chiffre qu'il y a en BDD sur la page.
    Voilà mon code:

    AjaxController.php

    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
     
    <?php
     
    namespace AjaxAppliBundle\Controller;
     
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use Symfony\Component\HttpFoundation\Response;
     
    class AjaxController extends Controller
    {
        public function nombreObjetsAction()
        {
    		//On récupère l'entityManager
    		$em = $this->getDoctrine()->getManager();
     
    		//On récupère le repository de Coffre
    		$repositoryCoffre = $em->getRepository('AjaxAppliBundle:Coffre');
     
    		//On récupère le coffre que l'on souhaite (1er enregistrement de la table)
    		$coffre = $repositoryCoffre->find(1);
     
    		//On récupère le nombre d'objets contenus dans le coffre
    		$nombreObjetsEnBase = $coffre->getNombreObjets();
     
    		$request = $this->getRequest();
     
    		$nombreObjetsAfficher = $request->get('valeur');
     
    		if ($nombreObjetsEnBase != $nombreObjetsAfficher ) 
    		{
    			//envois reponse AJAX avec nombreObjetsEnBase
    			$response = new Response(json_encode($nombreObjetsEnBase));
    			$response->headers->set('Content-Type', 'application/json');
     
    			return $response;
    		}
        }
    }
    affichage-coffre.html.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
     
    {% extends "::base.html.twig" %}
     
    {% block title %}
    Un test AJAX avec Symfony
    {% endblock %}
     
    {% block javascripts %}
    {{ parent() }}
    <h2>Test de la méthode AJAX</h2>
     
    Le coffre contient <div id="nbobjets"></div> objets actuellement.
     
    <script type="text/javascript">
    $(document).ready(function()
    { 
    	$.ajax({
            type:"POST",
            data: "valeur = {{nombre_objets}}",
            url:"{{ path('ajax_appli_coffre') }}",
            cache: false,
            success: function( msg ){
               alert("retour ok");  // un teste de retour
            }
        });
    });
    </script>
    {% endblock %}

  3. #23
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 162
    Par défaut
    J'ai également tester avec ce code pour le controller:

    AjaxController.php

    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
     
    <?php
     
    namespace AjaxAppliBundle\Controller;
     
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use Symfony\Component\HttpFoundation\Response;
     
    class AjaxController extends Controller
    {
        public function nombreObjetsAction()
        {    	
        	return $this->render('AjaxAppliBundle:Principale:affichage-coffre.html.twig');
        }
    }
    ça ne peut pas fonctionner étant donné qu'il faille une valeur initiale pour nombre_objets. J'ai du coup une erreur sur la page web.

    Pouvez vous m'orienter car je n'ai rien sous Firebug pour le POST.

    Merci par avance

  4. #24
    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
    pour avancer il faut absolument que l'ajax envois une requete

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $(document).ready(function()
    { 
    	$.ajax({
            type:"POST",
            data: "valeur = {{nombre_objets}}",
            url:"{{ url('ajax_appli_coffre') }}",
            cache: false,
            success: function( msg ){
               alert("retour ok");  // un teste de retour
            }
        });
    avec url et non path. parcque chez moi j'utilise url et ça fonctionne bien comme ça.

    et forcement soit tu as une erreur javascript dan la console
    soit une requete est envoyé (mais avec une erreur ou pas) dans reseau de firebug

    parceque même si la requete n'arrive pas au bon endroit ajax envois la requete quand meme donc tu dois le voir.

    mais quelque chose doit se passer, c'est pas normal .

  5. #25
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 162
    Par défaut
    Salut Dukoid,

    Oui, du coup, j'ai testé ce que tu m'as conseillé mais toujours rien.

    Pour les codes suivants, en lançant Firebug:

    affichage-coffre.html.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
    {% extends "::base.html.twig" %}
     
    {% block title %}Un test AJAX avec Symfony
    {% endblock %}
     
    {% block javascripts %}
    {{ parent() }}
    <h2>Test de la méthode AJAX</h2>
     
    Le coffre contient <div id="nbobjets"></div> objets actuellement.
     
    <script type="text/javascript">
    $(document).ready(function()
    { 
    	$.ajax({
            type:"POST",
            data: "valeur = {{nombre_objets}}",
            url:"{{ url('ajax_appli_coffre') }}",
            cache: false,
            success: function( msg ){
               alert("retour ok");  // un teste de retour
            }	
    });
    </script>
    {% endblock %}
    et

    AjaxController.php

    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
     
    <?php
     
    namespace Ajax\AppliBundle\Controller;
     
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use Symfony\Component\HttpFoundation\Response;
     
    class AjaxController extends Controller
    {
        public function nombreObjetsAction()
        {
        	//On récupère l'entityManager
    	$em = $this->getDoctrine()->getManager();
     
    	//On récupère le repository de Coffre
    	$repositoryCoffre = $em->getRepository('AjaxAppliBundle:Coffre');
     
    	//On récupère le coffre que l'on souhaite (1er enregistrement de la table)
    	$coffre = $repositoryCoffre->find(1);
     
    	//On récupère le nombre d'objets contenus dans le coffre
    	$nombreObjets = $coffre->getNombreObjets();
     
    	//On encode en JSON
    	$response = new Response(json_encode($nombreObjets));
    	$response->headers->set('Content-Type', 'application/json');
     
    	return $response;
        }
    }
    j'obtiens sous Firebug pour chacun des sous-onglets de l'onglet Réseau:

    Persistant: 0 requête

    Tout: GET coffre / 0 requête

    Pour les sous-rubriques: HTML, CSS, JavaScript, XHR, Images, Plugins, Médias, Polices: 0 requête

    Tu peux tester de ton côté pour voir ce que ça donne?

  6. #26
    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
    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
    {% extends "::base.html.twig" %}
     
    {% block title %}Un test AJAX avec Symfony
    {% endblock %}
     
    {% block javascripts %}
    {{ parent() }}
    <h2>Test de la méthode AJAX</h2>
     
    Le coffre contient <div id="nbobjets"></div> objets actuellement.
     
    <script type="text/javascript">
    $(document).ready(function()
    { 
    	$.ajax({
            type:"POST",
            data: "valeur = {{nombre_objets}}",
            url:"{{ url('ajax_appli_coffre') }}",
            cache: false,
            success: function( msg ){
               alert("retour ok");  // un teste de retour
            }	
         });
    });           /// il manquait ça !!
    </script>
    {% endblock %}

    }); /// il manquait ça !!

    désolé mais ici, je n'ai pas vu qu'il manquait "})" c'est difficile de voir ...
    j'ai copié le bout de code dans mon EDI et je l'ai vu de suite. Tu ne l'avais pas remarqué ?
    c'est con d'être bloqué sur un truc pareil depuis le début


    enfin bref, maintenant en rafraîchissant la page F5 une requête POST va être créé
    donc firebug réseau clique sur le + pour déployer le POST
    et lie d’éventuel message d'erreur (au format HTML) plus lisible



    * une fois que le nombre d'objets est bien mis à jour sur ta vue en rafraîchissant la page tu peux donc l'inclure dans la boucle

  7. #27
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 162
    Par défaut
    Salut,

    Je m'étais rendu compte après coup et j'avais refait le test.

    Toutefois, je n'ai toujours pas de POST, j'ai les même résultats que précédemment au niveau de l'onglet réseau de Firebug.

    Comme EDI, j'utilise Eclipse.

    Je te remet exactement les codes que j'ai testé. J'ai tout de même recopié ton code pour le twig afin d'être sûr:

    AjaxController.php

    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
     
    <?php
     
    namespace AjaxAppliBundle\Controller;
     
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use Symfony\Component\HttpFoundation\Response;
     
    class AjaxController extends Controller
    {
        public function nombreObjetsAction()
        {
        	//On récupère l'entityManager
        	$em = $this->getDoctrine()->getManager();
     
        	//On récupère le repository de Coffre
        	$repositoryCoffre = $em->getRepository('AjaxAppliBundle:Coffre');
     
        	//On récupère le coffre que l'on souhaite (1er enregistrement de la table)
        	$coffre = $repositoryCoffre->find(1);
     
        	//On récupère le nombre d'objets contenus dans le coffre
        	$nombreObjets = $coffre->getNombreObjets();
     
        	//On encode en JSON
        	$response = new Response(json_encode($nombreObjets));
        	$response->headers->set('Content-Type', 'application/json');
     
        	return $response;
        }
    }
    affichage-coffre.html.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
     
    {% extends "::base.html.twig" %}
     
    {% block title %}
    Un test AJAX avec Symfony
    {% endblock %}
     
    {% block javascripts %}
    {{ parent() }}
    <h2>Test de la méthode AJAX</h2>
     
    Le coffre contient <div id="nbobjets"></div> objets actuellement.
     
    <script type="text/javascript">
    $(document).ready(function()
    { 
    	$.ajax({
            type:"POST",
            data: "valeur = {{nombre_objets}}",
            url:"{{ url('ajax_appli_coffre') }}",
            cache: false,
            success: function( msg ){
               alert("retour ok");  // un teste de retour
            }	
         });
    });           /// il manquait ça !!
    </script>
    {% endblock %}
    Au final, le seul truc que j'ai c'est le GET coffre, comme d'habitude mais pas de POST après.

  8. #28
    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
    le POST est bien envoyé chez moi et je n vois aucun soucis dans le code ajax.
    je ne sais pas quoi te dire...




    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
    {% extends "::base.html.twig" %}
     
    {% block title %}
    Un test AJAX avec Symfony
    {% endblock %}
     
    
    ou est le {% block body %} {% endblock %}  ???????
    
    
    
    {% block javascripts %}                 ????????   N'est pas à la bonne place, non ?     
    {{ parent() }}
    <h2>Test de la méthode AJAX</h2>                                                                // cette ligne est du HTML, que fait il dans le block JAVASCRIPT ????
     
    Le coffre contient <div id="nbobjets"></div> objets actuellement.                      // cette ligne est du HTML, que fait il dans le block JAVASCRIPT ????
     
     
    <script type="text/javascript">
    $(document).ready(function()
    { 
    	$.ajax({
            type:"POST",
            data: "valeur = {{nombre_objets}}",
            url:"{{ url('ajax_appli_coffre') }}",
            cache: false,
            success: function( msg ){
               alert("retour ok");  // un teste de retour
            }	
         });
    });           /// il manquait ça !!
    </script>
    {% endblock %}

  9. #29
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 162
    Par défaut
    Salut,

    J'ai retesté mais avec un code légèrement différent où dans le controller, j'ai juste le render et où dans le twig j'ai supprimé la ligne data.

    AjaxController:

    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
     
    <?php
     
    namespace AjaxAppliBundle\Controller;
     
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use Symfony\Component\HttpFoundation\Response;
     
    class AjaxController extends Controller
    {
        public function nombreObjetsAction()
        {
        	return $this->render('AjaxAppliBundle:Principale:affichage-coffre.html.twig');
        }
    }
    affichage-coffre.html.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
     
    {% extends "::base.html.twig" %}
     
    {% block title %}
    Un test AJAX avec Symfony
    {% endblock %}
     
    {% block body %}
    {{ parent() }}
    <h2>Test de la méthode AJAX</h2>
    Le coffre contient <div id="nbobjets"></div> objets actuellement.
    {% endblock %}
     
    {% block javascripts %}
    {{ parent() }}
    <script type="text/javascript">
    $(document).ready(function()
    { 
    	$.ajax({
            type:"POST",
            //data: "valeur = {{nombre_objets}}",
            url:"{{ url('ajax_appli_coffre') }}",
            cache: false,
            success: function( msg ){
               alert("retour ok");  // un teste de retour
            }	
         });
    });           /// il manquait ça !!
    </script>
    {% endblock %}
    Là, ça fonctionne et j'ai bien le POST qui est envoyé sans erreur.

    Par contre, le même code avec la ligne data dans le JavaScript me met cette erreur au niveau du tout premier GET:
    Variable "nombre_objets" does not exist in AjaxAppliBundle:Principale:affichage-coffre.html.twig at line 20
    Ce qui est normal à priori puisqu'il n'y a initialement aucune valeur dans cette variable.

    Par contre avec ce code là:

    AjaxController.php

    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
     
    <?php
     
    namespace AjaxAppliBundle\Controller;
     
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use Symfony\Component\HttpFoundation\Response;
     
    class AjaxController extends Controller
    {
        public function nombreObjetsAction()
        {
        	//On récupére l'entityManager
        	$em = $this->getDoctrine()->getManager();
     
        	//On récupére le repository de Coffre
        	$repositoryCoffre = $em->getRepository('AjaxAppliBundle:Coffre');
     
        	//On récupére le coffre que l'on souhaite (1er enregistrement de la table)
        	$coffre = $repositoryCoffre->find(1);
     
        	//On récupére le nombre d'objets contenus dans le coffre
        	$nombreObjets = $coffre->getNombreObjets();
     
        	//On encode en JSON
        	$response = new Response(json_encode($nombreObjets));
        	$response->headers->set('Content-Type', 'application/json');
     
        	return $response;
        }
    }
    et la ligne data: "valeur = {{nombre_objets}}", au niveau du twig, je n'ai plus rien et j'ai uniquement sur la page la valeur de la variable nombre_objets récupérée de la BDD.

    Est ce que tu saurais pourquoi?

  10. #30
    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
    correction : (version encore plus simple)


    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
    var  valeurNbObjets = 0;
    
    function majNbObjets() {
    $.ajax({
            type:"POST",
            data: "valeur = " + valeurNbObjets ,
            url:"{{ url('ajax_appli_coffre') }}",
            cache: false,
            success: function( msg ){
              valeurNbObjets = msg;
               // met à jour la nouvelle valeur valeurNbObjets  en jQuery 
               alert("retour ok");  // un teste de retour
            }    
         });
    }
    
    setinterval("majNbObjets()", 5000);

  11. #31
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 162
    Par défaut
    Oui, c'est surtout cette information qu'il me fallait. Le fait qu'il me faille deux actions.

    Maintenant, j'ai ces codes là:

    routing.yml:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ajax_appli_coffre_vue: 
        path:     /coffre-vue
        defaults: { _controller: AjaxAppliBundle:Ajax:nombreObjetsVue }
     
    ajax_appli_coffre_requete: 
        path:     /coffre-requete
        defaults: { _controller: AjaxAppliBundle:Ajax:nombreObjetsRequete }
    AjaxController.php

    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
     
    <?php
     
    namespace AjaxAppliBundle\Controller;
     
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use Symfony\Component\HttpFoundation\Response;
     
    class AjaxController extends Controller
    {
        //Action pour la requête
        public function nombreObjetsRequeteAction()
        {
        	//On récupére l'entityManager
        	$em = $this->getDoctrine()->getManager();
     
        	//On récupére le repository de Coffre
        	$repositoryCoffre = $em->getRepository('AjaxAppliBundle:Coffre');
     
        	//On récupére le coffre que l'on souhaite (1er enregistrement de la table)
        	$coffre = $repositoryCoffre->find(1);
     
        	//On récupére le nombre d'objets contenus dans le coffre
        	$nombreObjets = $coffre->getNombreObjets();
     
        	//On encode en JSON
        	$response = new Response(json_encode($nombreObjets));
        	$response->headers->set('Content-Type', 'application/json');
     
        	return $response;
        }
     
        //Action pour la vue
        public function nombreObjetsVueAction()
        {
        	return $this->render('AjaxAppliBundle:Principale:affichage-coffre.html.twig');
        }
    }
    affichage-coffre.html.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
    34
    35
     
    {% extends "::base.html.twig" %}
     
    {% block title %}
    Un test AJAX avec Symfony
    {% endblock %}
     
    {% block body %}
    {{ parent() }}
    <h2>Test de la méthode AJAX</h2>
    Le coffre contient <div id="nbobjets"></div> objets actuellement.
    {% endblock %}
     
    {% block javascripts %}
    {{ parent() }}
    <script type="text/javascript">
    $(document).ready(function()
    { 
    	var valueOnline = function()
    	{
    		$.ajax(
    		{ 
    			type: 'GET',
    			url: '{{ url('ajax_appli_coffre_requete') }}', 
    			success: function (data) 
    			{ 
    				//Id du div contenant la variable nbobjets devant être mis à jour
    				$("#nbobjets").html(data);
    			} 
    		}); 
    	}
    	setInterval(function(){ valueOnline(); }, 10000);    // toutes les 10 secondes	
    });	// il manquait ça !!
    </script>
    {% endblock %}
    Par contre, on remarquera que je n'ai pas mis la ligne data: "valeur = {{nombre_objets}}", car j'ai une erreur.

    Sans cette ligne, ça marche parfaitement puisque la vue s'actualise en fonction de la valeur qu'il y a en base de donnée.

    Par contre, j'ai remarqué un petit problème. Bien que j'ai mis pour le setInterval, une durée de 10 secondes, ça s'actualise pratiquement instantanément.
    Je ne comprends pas réellement pourquoi. Aurais tu une idée?

    De même, comment puis-je me débrouiller pour savoir quelle est la valeur actuelle si j'ai une erreur à cause de la ligne data: "valeur = {{nombre_objets}}",:
    Variable "nombre_objets" does not exist in AjaxAppliBundle:Principale:affichage-coffre.html.twig at line 23
    afin de faire la version amélioré avec les comparaisons.

    Je te remercie par avance

  12. #32
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 162
    Par défaut
    J'ai vu que t'avais modifié ton dernier message.

    Je prends en compte ta correction du JavaScript et je l'adapte à mon code car il y avait à priori des choses manquantes.

  13. #33
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 162
    Par défaut
    Salut,

    Voilà la version définitive du code qui fonctionne avec également les comparaisons:

    AjaxController.php

    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
     
    <?php
     
    namespace AjaxAppliBundle\Controller;
     
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use Symfony\Component\HttpFoundation\Response;
     
    class AjaxController extends Controller
    {
        //Action pour la requête
        public function nombreObjetsRequeteAction()
        {
        	//On récupére l'entityManager
        	$em = $this->getDoctrine()->getManager();
     
        	//On récupére le repository de Coffre
        	$repositoryCoffre = $em->getRepository('AjaxAppliBundle:Coffre');
     
        	//On récupére le coffre que l'on souhaite (1er enregistrement de la table)
        	$coffre = $repositoryCoffre->find(1);
     
        	//On récupére le nombre d'objets contenus dans le coffre
        	$nombreObjetsEnBase = $coffre->getNombreObjets();
     
        	$request = $this->getRequest();
     
        	$nombreObjetsAfficher = $request->get('valeurNbObjets');
     
        	if ($nombreObjetsEnBase != $nombreObjetsAfficher )
        	{
        		//envois reponse AJAX avec nombreObjetsEnBase
        		$response = new Response(json_encode($nombreObjetsEnBase));
        		$response->headers->set('Content-Type', 'application/json');
     
        		return $response;
        	}
        }
     
        //Action pour la vue
        public function nombreObjetsVueAction()
        {
        	return $this->render('AjaxAppliBundle:Principale:affichage-coffre.html.twig');
        }
    }
    affichage-coffre.html.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
    34
    35
    36
    37
    38
    39
     
    {% extends "::base.html.twig" %}
     
    {% block title %}
    Un test AJAX avec Symfony
    {% endblock %}
     
    {% block body %}
    {{ parent() }}
    <h2>Test de la méthode AJAX</h2>
    Le coffre contient <div id="nbobjets"></div> objets actuellement.
    {% endblock %}
     
    {% block javascripts %}
    {{ parent() }}
    <script type="text/javascript">
    $(document).ready(function()
    { 
    	var valeurNbObjets = 0;
     
    	var valueOnline = function()
    	{
    		$.ajax(
    		{ 
    			type: 'GET',
    			data: valeurNbObjets,
    			url: '{{ url('ajax_appli_coffre_requete') }}', 
    			success: function (data) 
    			{ 
    				valeurNbObjets = data;
     
    				//Id du div contenant la variable nbobjets devant être mis à jour
    				$("#nbobjets").html(data);
    			} 
    		}); 
    	}	
    });
    </script>
    {% endblock %}
    routing.yml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ajax_appli_coffre_vue: 
        path:     /coffre-vue
        defaults: { _controller: AjaxAppliBundle:Ajax:nombreObjetsVue }
     
    ajax_appli_coffre_requete: 
        path:     /coffre-requete
        defaults: { _controller: AjaxAppliBundle:Ajax:nombreObjetsRequete }
    Coffre.php

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    <?php
     
    namespace AjaxAppliBundle\Entity;
     
    use Doctrine\ORM\Mapping as ORM;
     
    /**
     * Coffre
     *
     * @ORM\Table()
     * @ORM\Entity(repositoryClass="AjaxAppliBundle\Entity\CoffreRepository")
     */
    class Coffre
    {
        /**
         * @var integer
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
     
        /**
         * @var string
         *
         * @ORM\Column(name="nombre_objets", type="string", length=255)
         */
        private $nombreObjets;
     
     
        /**
         * Get id
         *
         * @return integer 
         */
        public function getId()
        {
            return $this->id;
        }
     
        /**
         * Set nombreObjets
         *
         * @param string $nombreObjets
         * @return Coffre
         */
        public function setNombreObjets($nombreObjets)
        {
            $this->nombreObjets = $nombreObjets;
     
            return $this;
        }
     
        /**
         * Get nombreObjets
         *
         * @return string 
         */
        public function getNombreObjets()
        {
            return $this->nombreObjets;
        }
    }
    Je te remercie encore Dukoid.

  14. #34
    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
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH


    après si tu veux être aussi parfait qu'un borg !

    tu remarques que quand tu affiches la page, la valeur est 0 (mais elle est mise à jour 5 sec après)
    pour être parfait, il faut faire en sorte d'affichr la bonne valeur au lieu du 0

    into the controller :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        //Action pour la vue
        public function nombreObjetsVueAction()
        {
             ....    // récupere en base la valeur
        	return $this->render('AjaxAppliBundle:Principale:affichage-coffre.html.twig'   ............la valeur................   );
        }
    into the view :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ...
    Le coffre contient <div id="nbobjets">{{  ...la....valeur...... }}</div> objets actuellement.
    ...


    et voilà, c'est parfait ainsi ! tu seras le roi de l'AJAX

  15. #35
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 162
    Par défaut
    Effectivement, j'avais remarqué ce soucis.

    Je te remercie pour le tuyau.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [2.x] Résultat QueryBuilder - Requête Ajax avec Symfony2
    Par ZeWiz dans le forum Symfony
    Réponses: 2
    Dernier message: 22/04/2015, 15h26
  2. [2.x] Tutoriels pour l'utilisation d'Ajax avec Symfony2
    Par mondher bensalem dans le forum Symfony
    Réponses: 1
    Dernier message: 19/04/2013, 08h06
  3. [2.x] Comment utiliser GD avec Symfony2
    Par moulis-marius dans le forum Symfony
    Réponses: 7
    Dernier message: 02/04/2012, 10h17
  4. [UI] Utiliser ajax avec Sortable
    Par beegees dans le forum jQuery
    Réponses: 0
    Dernier message: 07/08/2011, 11h27
  5. Utiliser ajax avec struts
    Par xoco dans le forum Struts 1
    Réponses: 0
    Dernier message: 24/02/2009, 19h19

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