Bonjour a tous ,
j'essaie de developper une discussion instantanée ( le plus proche possible de Facebook )
des utilisateurs qui s'authentifient avec FOSUser .
des utilisateurs en relations OneToMany avec des Messages .
Aucun submit n'est autorisé dans mon cas .
Je suppose que je suis un utilisateur 1 et que l'utilisateur 2 m'a envoyé un message ( je le reçois sans rien faire) .
Mon problème c'est le cache qui touche 300 Mo en dev !!
L 'affichage des messages peut etre beaucoup plus rapide .
Nom : 800394Capture.jpg
Affichages : 233
Taille : 52,0 Ko

Code Controlleur:
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
 
 public function indexAction(Request $request) {
 
        $user = $this->container->get('security.context')->getToken()->getUser();
        $em = $this->getDoctrine()->getManager();
 
        $message = new Message();
        $form = $this->createForm(new MessageType, $message);
        $request = $this->get('request_stack')->getCurrentRequest();
 
        if ($request->isXmlHttpRequest()) {
            $form->handleRequest($request);
            if ($form->isValid()) {
                $message = $form->getData();
                if ($user != NULL) {
                    $message->setUser($user);
                }
                $message->setLu(FALSE);
                $em->persist($message);
                $em->flush();
                // exit;
                $messages = $em->getRepository('MyAppTchatBundle:message')->findAll();
 
                return $this->container->get('templating')->renderResponse('MyAppTchatBundle:Default:index.html.twig', array(
                            'messages' => $messages
                ));
            }
        } /*elseif ($request->isMethod('Post')) {
            $form->bind($request);
            if ($form->isValid()) {
                $message = $form->getData();
                if ($user != NULL) {
                    $message->setUser($user);
                }
                $message->setLu(FALSE);
                $em->persist($message);
                $em->flush();
                $messages = $em->getRepository('MyAppTchatBundle:message')->findAll();
                return $this->redirect($this->generateUrl('my_app_tchat_homepage'));
            }
        } */else {
            $messages = $em->getRepository('MyAppTchatBundle:message')->findAll();
            return $this->render('MyAppTchatBundle:Default:index.html.twig', array('form' => $form->createView(),
                        'user' => $user, 'messages' => $messages));
        }
    }
 
    public function makevuAction(Request $request) {
 
        $em = $this->getDoctrine()->getManager();
        $user = $this->container->get('security.context')->getToken()->getUser();
 
        $messages = $em->getRepository('MyAppTchatBundle:message')->findBy(array(), array('datecreation' => 'DESC'));
 
        if ($request->isXmlHttpRequest()) {
            if (!empty($messages)) {
                $message = $messages[0];  // $message est un objet
                if ($message->getUser() != $user) {
                    $message->setLu(TRUE);
                    $message->setDatelu(new \DateTime());
                    $em->persist($message);
                    $em->flush();
                    //exit;  
                }
            }
            return $this->container->get('templating')->renderResponse('MyAppTchatBundle:Default:index.html.twig', array(
                        'messages' => $messages, 'user' => $user
            ));
        }
    }
 
    public function showAction(Request $request) {
        $user = $this->container->get('security.context')->getToken()->getUser();
        $em = $this->getDoctrine()->getManager();
        if ($request->isXmlHttpRequest()) {
            $messages = $em->getRepository('MyAppTchatBundle:message')->findAll();
            return $this->container->get('templating')->renderResponse('MyAppTchatBundle:Default:ajaxresponse.html.twig', array(
                        'messages' => $messages, 'user' => $user
            ));
        } else {
            $messages = $em->getRepository('MyAppTchatBundle:message')->findAll();
            return $this->render('MyAppTchatBundle:Default:index.html.twig', array(
                        'messages' => $messages, 'user' => $user
            ));
        }
Le code Javascript ( ajax et JQuery )
Envoi de message:
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
 
   function CKupdate() { 
       for (instance in CKEDITOR.instances) CKEDITOR.instances[instance].updateElement();CKEDITOR.instances[instance].setData('');
   }     
    $(function () {
        $("#form_submit").submit(function (e) {
           CKupdate();
            e.preventDefault(); // Le navigateur ne peut pas envoyer le formulaire
            $.ajax({
                type: 'post',
                url: "{{path('my_app_tchat_homepage') }}",
                data: $(this).serialize(),
                datatype: "json",
                cache: false,
                success: function (data) {
                    $('#form_submit')[0].reset();
                }
            });
               $('#form_submit')[0].reset();
            // return false;
        });
    });
Mettre un 'vu' pour les messages que j'ai lu :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
  $("div#inputid").click(function () {   /// lorsque je clique sur l input il voit " vu" j 'ai lu son message meme sans repondre
        $.ajax({
            type: 'post',
            url: "{{path('my_app_tchat_makevu') }}",
            data: $(this).serialize(),
            datatype: "json",
            cache: false,
            success: function (data) {
                // $('div.panel-body').html(data);
            }
        });
    });
Affichage automatique des messages régulierement:
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
 
   $(document).ready(function () {
    var refreshId = setInterval(function () {
            $.ajax({
                type: 'post',
                url: "{{path('my_app_tchat_show') }}",
                data: $(this).serialize(),
                datatype: "json",
                cache: false,
                    success: function (data) {
                        $('div.panel-body').html(data);
                    }
                });
        },1000);       // div qui contient les messages se rafraichie chaque 1 s
    });
Merci d'avance