Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > JavaScript, Ajax
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.05.2013, 19:32   #1
Newpitbull
Пользователь
 
Регистрация: 17.09.2011
Сообщений: 44
Вопрос Живое общение (личные сообщения)

Здравствуйте. Подскажите пожалуйста как правильно сделать раздел сообщений. Мне нужно сделать что-то похожее на панель сообщений как в одноклассниках например. Как бы живое общение, Ни как у меня не получается написать правильный код. Именно не получается получать последние входящие сообщения. В добавок нужно чтоб не прочитанные сообщения уведомлялись пользователю. Может кто-то для себя писал что то подобное, или где то можно найти подходящее? Два дня не могу с этим заданием справиться.
Newpitbull вне форума Ответить с цитированием
Старый 02.05.2013, 22:34   #2
Mortimoro
Форумчанин
 
Регистрация: 03.12.2010
Сообщений: 334
По умолчанию

выложи код, который уже есть, чтоб понимать как ты вообще реализуешь передачу сообщений.

в общем случае, сценарий приблизительно такой:
-пользователь А пишет сообщение, жмет отправить, сообщение записывается в БД с пометкой 0 в графе "прочитано".
-на стороне пользователя Б скрипт каждые 20 секунд стучится на сервер, а PHP-скрипт на сервере проверяет наличие сообщений в БД с пометкой 0 и возвращает их количество - именно это число ты выводишь на панель пользователя Б.
-когда пользователь Б открывает сообщение, ты извлекаешь из БД сообщение и сразу ставишь в графе "прочитано" пометку 1.
Mortimoro вне форума Ответить с цитированием
Старый 02.05.2013, 23:02   #3
Newpitbull
Пользователь
 
Регистрация: 17.09.2011
Сообщений: 44
По умолчанию

Я по несколько раз стирал код и писал новый, данный момент код такой
Аякс запрос на сет интервале не проходит, почему не пойму пока.
Код:
$(".messPanel li").click(function(){
        $('.messPanelPrintSmsByIdContent').html('');
        $(".messPanelPrintSms").css({display:"block"});
         var myId = $("#offPanel").attr('name'); // id отправителя
         var idSob = $(this).attr('name'); // id собеседника
         $.ajax({
			async: true,
			type: 'POST',
			url: '/messages/',
			data: "user_1=" + myId
                            + "&user_2=" + idSob,
                        dataType: 'json',
			timeout: 30000,
			success: function(data){
                                if(data['success']){
                                    var sm = data['messages'];
                                    var smL = sm.length;
                                  
                                  function sms(sm){
                                            for(var i=0; i<smL;i++){
                                                $('.messPanelPrintSmsByIdContent').append(
                                               "<p class='messId' 'id=mess_"+sm[i]['user_1']+"' name="+sm[i]['id']+">"+sm[i]['messages']+"</p>"
                                                 );                             
                                           }
                                    } 
                                    $('.messPanelPrintSmsByIdContent').html(sms(sm));
                                    lastmess = $("p.messId:last").attr('name');
                                }
                            				
			}	
	});
        setInterval(function(){
            //alert(lastmess);
            $.ajax({
			async: true,
			type: 'POST',
			url: '/messages/',
			data: "user_1=" + myId
                            + "&user_2=" + idSob
                            + "lastmess" + lastmess,
                        dataType: 'json',
			timeout: 30000,
			success: function(data){
                                if(data['success']){
                                    var nextmess = data['nextmess'];
                                    for(var i=0; i<nextmess.length; i++){
                                        $('.messPanelPrintSmsByIdContent').append(
                                               "<p id='messId' class=mess_"+nextmess[i]['user_1']+" name="+nextmess[i]['id']+">"+nextmess[i]['messages']+"</p>"
                                                 );
                                    }
                                   // alert('Хорошо');
                                }else {
                                  //  alert('Плохо');
                                }
                            				
			}	
	});
        }, 1000);
        
        
        
        
        return false;
    });
Newpitbull вне форума Ответить с цитированием
Старый 02.05.2013, 23:02   #4
Newpitbull
Пользователь
 
Регистрация: 17.09.2011
Сообщений: 44
По умолчанию

первый аякс выводит все сообщения, второй новые принятые (по задумка) [но не выводит]

Последний раз редактировалось Newpitbull; 02.05.2013 в 23:12.
Newpitbull вне форума Ответить с цитированием
Старый 03.05.2013, 00:19   #5
_SanR
Пользователь
 
Регистрация: 09.02.2013
Сообщений: 48
По умолчанию

Наверно я не в тему ну может стоит использовать WebSocket для чата? Аякс запросы страшно выглядят здесь.
http://habrahabr.ru/post/145077/ - тут пример реализации с аспом, ну я думаю и на php что нибудь должно быть в этом направлении.
А по поводу "прочитано" Mortimoro алгоритм предложил.

а и еще
Код:
                        data: "user_1=" + myId
                            + "&user_2=" + idSob
                            + "lastmess" + lastmess,
может стоит так
Код:
                     data: "user_1=" + myId
                            + "&user_2=" + idSob
                            + "&lastmess=" + lastmess,
"&" и "=" у последнего параметра нет

Последний раз редактировалось _SanR; 03.05.2013 в 16:01.
_SanR вне форума Ответить с цитированием
Старый 03.05.2013, 00:28   #6
Newpitbull
Пользователь
 
Регистрация: 17.09.2011
Сообщений: 44
По умолчанию

&" и "=" оказалось главной проблемой не работы запроса) два символа и столько потраченных нервов.
Newpitbull вне форума Ответить с цитированием
Старый 03.05.2013, 16:58   #7
Newpitbull
Пользователь
 
Регистрация: 17.09.2011
Сообщений: 44
По умолчанию

Код:
     $(".messPanel li").click(function(){
        $('.messPanelPrintSmsByIdContent').html('');
        $(".messPanelPrintSms").css({display:"block"});
           myId = $("#offPanel").attr('name'); // id мой      Глобальная переменная
           idSob = $(this).attr('name'); // id собеседника   Тоже глобальная
         $.ajax({
			async: true,
			type: 'POST',
			url: '/messages/',
			data: "user_1=" + myId
                            + "&user_2=" + idSob,
                        dataType: 'json',
			timeout: 30000,
			success: function(data){
                                if(data['success']){
                                    var sm = data['messages'];
                                    var smL = sm.length;
                                  
                                  function sms(sm){
                                            for(var i=0; i<smL;i++){
                                                $('.messPanelPrintSmsByIdContent').append(
                                               "<p class='messId' id='mess_"+sm[i]['user_1']+"' name='"+sm[i]['id']+"'>"+sm[i]['messages']+"</p>"
                                                 );                             
                                           }
                                    }
                                    
         var lastMess = sm.length;
         lastMess--;
        // alert(lastMess);
        // alert(data['messages'][lastMess]['id']);
         $.ajax({
			async: true,
			type: 'POST',
			url: '/messages/',
			data: "user_1=" + myId
                            + "&user_2=" + idSob
                            + "&lastmess=" + data['messages'][lastMess]['id'],
                        dataType: 'json',
			timeout: 30000,
			success: function(data){
                                if(data['success']){
                                    var nextmess = data['nextmess'];
                                        for(var i=0; i<nextmess.length; i++){
                                        $('.messPanelPrintSmsByIdContent').append(
                                               "<p class='messId' id=mess_"+nextmess[i]['user_1']+" name="+nextmess[i]['id']+">"+nextmess[i]['messages']+"</p>"
                                                 );
                                    }
                                    
                                }
                            				
			}	
	});
                                    $('.messPanelPrintSmsByIdContent').html(sms(sm));
                                     
                                     //alert(idSob);
                                     //alert(lastmess = $("#mess_"+idSob+":last").attr('name'));
                                }
        		
			}	
	});
        
       
        
        return false;
    });
Newpitbull вне форума Ответить с цитированием
Старый 03.05.2013, 16:59   #8
Newpitbull
Пользователь
 
Регистрация: 17.09.2011
Сообщений: 44
По умолчанию

Код:
  
      setInterval(function(){
        $.ajax({
			async: true,
			type: 'POST',
			url: '/messages/',
			data: "prnewmess=" + $("#offPanel").attr('name'), //проверка входящих сообщений
                        dataType: 'json',
			timeout: 30000,
			success: function(data){
if(data['count'] != 0){
   $("#newMes_"+idSob).html("1");  // Почему вот здесь не видно глобальной переменной?
           $.ajax({
			async: true,
			type: 'POST',
			url: '/messages/',
			data: "user_1=" + myId
                            + "&user_2=" + idSob
                            + "&lastmess=1",
                        dataType: 'json',
			timeout: 30000,
			success: function(data){
                                if(data['success']){
                                    var nextmess = data['nextmess'];
                                        for(var i=0; i<nextmess.length; i++){
                                        $('.messPanelPrintSmsByIdContent').append(
                                               "<p class='messId' id=mess_"+nextmess[i]['user_1']+" name="+nextmess[i]['id']+">"+nextmess[i]['messages']+"</p>"
                                                 );
          $.ajax({
			async: true,
			type: 'POST',
			url: '/messages/',
			data: "user_1=" + myId
                            + "&user_2=" + idSob
                            + "&upd_read=1",
                        dataType: 'json',
			timeout: 30000,
			success: function(data){
                                if(data['success']){
                                    
                                    
                                   // alert('Хорошо');
                                }
                            				
			}	
	});         
                                    }
                                    setTimeout(function(){
                                        $("#newMes").html('');
                                    },2000);
                                    
                                   // alert('Хорошо');
                                }else {
                                  //  alert('Плохо');
                                }
                            				
			}	
	});
}else {
                                        $("#newMes").html('');
                                    }
                            				
			}	
	});
    },2000);
Newpitbull вне форума Ответить с цитированием
Старый 03.05.2013, 17:01   #9
Newpitbull
Пользователь
 
Регистрация: 17.09.2011
Сообщений: 44
По умолчанию

Мозги кипят из за этих "живых" сообщений.
Newpitbull вне форума Ответить с цитированием
Старый 03.05.2013, 18:52   #10
_SanR
Пользователь
 
Регистрация: 09.02.2013
Сообщений: 48
По умолчанию

2 Варианта:

1. $(this).attr('name'); где $(this) = $(".messPanel li") - что то тут не то. У li атрибут name. Нужно глянуть фрагмент html. Скорее всего ты глобальным переменным не те значения присваиваешь.

2. Событие $(".messPanel li").click срабатывает позже setInterval поэтому они у тебя без значений.

В таких ситуациях лучше использовать FireBug и смотреть через его отладчик что где и какие значения принимает + там же ты мог посмотреть параметры своих запросов + много полезных вещей для разработчиков.
_SanR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вконтакте Личные сообщения KWN, lnc Работа с сетью в Delphi 8 28.07.2014 20:17
Как работают личные сообщения? dvuwka Общие вопросы по программированию, компьютерный форум 7 03.03.2011 18:31
Как отвечать на личные сообщения на форуме? Парсифаль О форуме и сайтах клуба 2 03.05.2009 23:58
Личные права пользователей!!! Nemesisking О форуме и сайтах клуба 12 23.04.2008 22:51