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 :
Mon code :
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:...
le fichier js :
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 // 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'); } } };
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.
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 } }
Toute suggestion est la bienvenue car je patine complètement (au point d'envisager d'abandonner cette solution)
Merci
Partager