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 - session et plantage


Sujet :

Symfony PHP

  1. #1
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    418
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 418
    Points : 828
    Points
    828
    Par défaut Ajax - session et plantage
    Bonjour,
    Voici la dynamique que j'essaie de mettre en place :
    j'ai un écran dans lequel je saisis un code.
    Avec une requête ajax, je vais regarder si ce code n'existe pas déjà.

    Si le code existe, plutôt que de renvoyer l'ensemble de l'enregistrement, je voulais renvoyer vrai ou faux en fonction son existence avant de recharger l'ensemble du formulaire initialisé avec l'entité correcte (ceci afin d'utiliser au maximum la mécanique symfony et ne pas faire manuellement un update alors que symfony s'attend à un insert).

    Pour ne pas avoir besoin d'aller rechercher en base l'enregistrement que je viens d'aller regarder pour vérifier son existence, je comptais l'enregistrer en session lors de la requête ajax mais là, j'ai un plantage avec une erreur loguée dans le error.log d'apache :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    [Tue Apr 16 09:43:36 2013] [error] [client 55.80.5.51] PHP Fatal error:  Exception thrown without a stack frame in Unknown on line 0, referer: ...
    [Tue Apr 16 09:46:02 2013] [error] [client 55.80.5.51] PHP Fatal error:  Uncaught exception 'Symfony\\Component\\Routing\\Exception\\ResourceNotFoundException' in /app/.../app/cache/prod/appprodUrlMatcher.php:62\nStack trace:...
    Mon code :
    le fichier js :
    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
     
    // positionnement des événements
    $("#prestation_code").change(function() { prestation_on_code_change(); });
     
    function prestation_on_code_change()
    {
        var code = $("#prestation_code").val();
        var DATA = 'code=' + code;
        alert(DATA);
        $.ajax({
            type: "POST",
            url: window.ModTablesT99GestionBundle_rechercheAjaxPrestation_path,
            data: DATA,
            dataType:'json',   
            cache: false,
            success: function(data){
                alert(data.value);
                prestation_set_datas(data);
                $(".loading").hide();
            }
        });
        return false;
    };
     
    function prestation_set_datas(datas)
    {
        if (datas)
        {
            // Je me contente de tester le fonctionnement
            if (datas.value == true)
            {
                alert('OK');
            } else {
                alert('KO');
            }
        }
    };
    Le controlleur (le plantage se passe sur le return lorsque je fais le $session->set(...) ) :
    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
     
        public function rechercheAjaxAction()
        {
            $request = $this->container->get('request');
     
            if($request->isXmlHttpRequest())
            {
                $code_prestation = '';
                $code_prestation = $request->request->get('code');
     
     
                if($code_prestation != '')
                {
                    $em = $this->container->get('doctrine')->getEntityManager();
                    $repo = $em->getRepository('ModTablesT99GestionBundle:Prestation');
                    $row = $repo->findBy(array('code' => $code_prestation));
                    if (count($row) > 0)
                    {
                        $session = $this->container->get('session');
                        if ($session->has('prestation'))
                        {
                            $session->remove('prestation');
                        }
                        // Si cette ligne est commentée, tout va bien
                        // Si elle est décommentée, la fonction plante mais pas sur cette ligne.
                        // Le plantage se fait sur le return New Response(...)
                        //$session->set('prestation', $row[0]);
                        $ret = array('value'=>true);
                    } else {
                        $ret = array('value'=>false);
                    }
                }
                else {
                    $row = null;
                    $ret = array('value'=>"false");
                }
     
                $code = 200;
     
                // On encode les résultats au format json
                $return=json_encode($ret);
                // Quand je fais un $session->set(...) cette ligne plante (aucun affichage à l'écran, uniquement dans les logs apache).
                return new Response($return,$code,array('Content-Type'=>'application/json'));//make sure it has the correct content type
            }
        }
    Est-ce parce qu'il n'est pas possible de modifier $session dans ce genre de circonstances ? Pourtant, suite au $session->set(...), le contenu de $session est bien modifié en conséquence et le code se déroule normalement jusqu'au return.

    Toute suggestion est la bienvenue car je patine complètement (au point d'envisager d'abandonner cette solution)
    Merci

  2. #2
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2011
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2011
    Messages : 477
    Points : 677
    Points
    677
    Par défaut
    Bonjour,

    Il y a effectivement une limitation sur la session en ajax. Recherche dans le forum, j'y ai posté le lien vers l'explication.
    Le voila

  3. #3
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    418
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 418
    Points : 828
    Points
    828
    Par défaut
    Merci.
    J'ai essayé de modifier les paramètres comme indiqué mais cela ne change rien.

    En fait, à ce stade, ce n'est pas encore un problème de persistance de la session mais un plantage : dans le contrôleur appelé par ajax, si je ne modifie pas $session tout va bien. Par contre, si je la modifie, le Return new Response(...) plante systématiquement et sans explication, en dehors des deux lignes mentionnées que l'on retrouve dans le error.log d'apache.

    Un peu comme si le return ne savait plus où il devait renvoyer ses infos.

  4. #4
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2011
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2011
    Messages : 477
    Points : 677
    Points
    677
    Par défaut
    Y a quoi dans row[0] ?

  5. #5
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2011
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2011
    Messages : 477
    Points : 677
    Points
    677
    Par défaut
    En faisant un petit tour dans la documentation à la recherche d'une ResponseJson,

    Peux réencoder ton controller comme ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $response = new Response(json_encode(array('name' => $name)));
    $response->headers->set('Content-Type', 'application/json');
    $code = 200, n'est pas utile, c'est la valeur par défaut. Je ne pense pas que cela change quelque chose.

  6. #6
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    418
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 418
    Points : 828
    Points
    828
    Par défaut
    Dans row, il y a le résultat d'un ->findBy(array('code'=>val));
    Je sais qu'il y aura au plus un enregistrement (index unique sur le code) donc quand il y a un retour, je prends le premier enregistrement (row[0])

    Sinon, j'ai essayer d'utiliser ta syntaxe mais cela ne marche pas plus.

    Je pense de plus en plus qu'en modifiant le contenu de la variable $session, je fais perdre à symfony le lien entre le serveur et le navigateur car c'est vraiment la commande $session->set(...) qui fait tout merdoyer.

    Pour ma part, je ne vois vraiment pas trop comment continuer dans cette direction. La solution de contournement n'étant pas hyper compliquée (je cherche l'enregistrement à nouveau au lieu de le stocker - dommage pour les performances), ce n'est pas comme si j'étais complètement bloqué.

    Merci en tout cas de ton aide. Si tu as d'autres idées, n'hésite pas, je les testerai. Mais ne va pas perdre trop de temps là dessus. A mon avis, cela ressemble plus à un problème symfony qu'à une question de syntaxe.

Discussions similaires

  1. [2.x] [Symfony 2] Sauvegarde de données + Ajax + Session
    Par REF26 dans le forum Symfony
    Réponses: 6
    Dernier message: 06/03/2014, 16h11
  2. CORS + Ajax + Session (avec PHP)
    Par Sergejack dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 28/08/2011, 18h23
  3. [AJAX] Ajax et session
    Par Cpas2latarte dans le forum AJAX
    Réponses: 8
    Dernier message: 14/08/2010, 19h05
  4. [AJAX] AJAX & Session php problème.
    Par prosciuto dans le forum AJAX
    Réponses: 9
    Dernier message: 09/04/2009, 12h17
  5. AJAX + session expirée = redirection foireuse
    Par Tchupacabra dans le forum Langage
    Réponses: 4
    Dernier message: 03/06/2008, 10h02

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