Ajax для чата

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Закрыто
systemiv
Сообщения: 360
Зарегистрирован: 2011.06.26, 22:55
Откуда: Липецк
Контактная информация:

Ajax для чата

Сообщение systemiv »

В БД должно храниться всегда ровно 20 сообщений чата.
Мне нужно что бы при отправке сообщения, оно появлялось, а старое удалялось, без перезагрузки страницы.
Т.е. как я представляю, нужен скрипт, который должен дёргать страницу каждые 2 сек, и делать проверку на новые сообщения.

Может есть какой то класс, который сможет мне помочь в этом?
Аватара пользователя
Troy
Сообщения: 235
Зарегистрирован: 2011.02.03, 21:04

Re: Ajax для чата

Сообщение Troy »

А мне нужен клон яндекса, может у кого есть готовый класс? Задача элементарная. В одном экшене выводишь 20 актуальных сообщений, в другом сам чат, js функция, которая получает эти сообщения и вставляет в блок и все это в setInterval
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Ajax для чата

Сообщение slavcodev »

PS: где-то читал, что лучше setInterval заменять на setTimeout, где это возможно
Жду Yii 3!
Аватара пользователя
timlar
Сообщения: 1382
Зарегистрирован: 2009.09.19, 17:49
Откуда: Украина, Днепропетровск
Контактная информация:

Re: Ajax для чата

Сообщение timlar »

mc-bear писал(а):PS: где-то читал, что лучше setInterval заменять на setTimeout, где это возможно
Это зависит от ситуации. Разница между ними в том, что setTimeout() выполняет функцию один раз, а setInterval() многократно. И как раз таки лучше использовать setInterval(), дабы не вызывать setTimeout() внутри функции.
Twitter: @timlar_ua
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Ajax для чата

Сообщение slavcodev »

Я знаю разницу мду этими функциями. Надо учесть что setInterval четко через определенное время. Что может создать проблемы. Если выполнения функции займет больше времени чем задан интервал, что произойдет? Имхо намного удобнее ставить таймаут, при котором удалять старый и ставить новый. Но это субъективное мнение, и вообще не по теме :)
Жду Yii 3!
Аватара пользователя
BuCeFaL
Сообщения: 447
Зарегистрирован: 2010.03.17, 21:22
Откуда: Kiev
Контактная информация:

Re: Ajax для чата

Сообщение BuCeFaL »

long pulling
Клиент после заполнения 20 коментов открывает соединение c запросом на получение новых коментов и ждет ответ. Ожидает он не последний новый комментарий, а все 20 для синхронизации. Сервер же отвечает только при добавлении кем то нового комментария и закрывает соединение. Можно использовать веб сокеты и 2-й XMLHttpRequest и не закрывать соединение.

PS: NodeJs идеально подходит.

Без setInterval и timeout.
Аватара пользователя
BuCeFaL
Сообщения: 447
Зарегистрирован: 2010.03.17, 21:22
Откуда: Kiev
Контактная информация:

Re: Ajax для чата

Сообщение BuCeFaL »

Ну и, конечно же, после получения ответа новый request.
Аватара пользователя
Troy
Сообщения: 235
Зарегистрирован: 2011.02.03, 21:04

Re: Ajax для чата

Сообщение Troy »

BuCeFaL писал(а):long pulling
Клиент после заполнения 20 коментов открывает соединение c запросом на получение новых коментов и ждет ответ. Ожидает он не последний новый комментарий, а все 20 для синхронизации. Сервер же отвечает только при добавлении кем то нового комментария и закрывает соединение. Можно использовать веб сокеты и 2-й XMLHttpRequest и не закрывать соединение.

PS: NodeJs идеально подходит.

Без setInterval и timeout.
Ты его прошлые темы почитай, это явно не для него, то , что я описал оптимальный вариант. Так-то да, можно Comet например заюзать.
Аватара пользователя
timlar
Сообщения: 1382
Зарегистрирован: 2009.09.19, 17:49
Откуда: Украина, Днепропетровск
Контактная информация:

Re: Ajax для чата

Сообщение timlar »

mc-bear писал(а):Но это субъективное мнение, и вообще не по теме :)
Поэтому я и написал, что зависит от ситуации :)
Twitter: @timlar_ua
systemiv
Сообщения: 360
Зарегистрирован: 2011.06.26, 22:55
Откуда: Липецк
Контактная информация:

Re: Ajax для чата

Сообщение systemiv »

Скрипт:

Код: Выделить всё

<script type="text/javascript">
            $(document).ready(function(){
                $('#message-form').submit(Send);
                $('#text-message').focus();
                setInterval("chat/index", 2000);
                $('.left-content').scrollTop($('.left-content').get(0).scrollHeight);
            });
            
            function Send(){
                $.post('chat/index', {
                    text_message: $('#text-message').val(),
                    ajax: 'send'
                    }, Load);
                $('#text-message').val('');
                $('#text-message').focus();
                return false;
            }
            
            var load_in_process = false;
            
            function Load(){
                if(!load_in_process){
                    load_in_process = true;
                    $.post('chat/index',{
                        ajax: 'load'
                    },
                    function(result){
                        eval(result);
                        $('.left-content').scrollTop($('.left-content').get(0).scrollHeight);
                        load_in_process = false;
                    });
                }
            }
        </script>
Контроллер:

Код: Выделить всё

<?php
    class ChatController extends CController{
        public function actionIndex(){
            switch($_POST['ajax']){
                case 'send':
                    $this->actionMessage();
                    break;
                case 'load':
                    $this->actionView();
                    break;
                default:
                    $this->actionView();
            }
        }
        
        public function actionView(){
            $criteria = new CDbCriteria(array(
                'order' => 'id_message DESC',
                'limit' => '50',
            ));
            
            $model = Chat::model()->findAll($criteria);
            $model = array_reverse($model);
            
            $this->render('index', array(
                'models' => $model,
            ));
        }
        
        public function actionMessage(){
            $model = new Chat;
            $model->text_message = $_POST['message'];
        }
    }
 
Вьюха:

Код: Выделить всё

<form action="" method="post" id="message-form">
    <textarea name="message" class="input-text" cols="62" rows="4" id="text-message"></textarea>
    <input type="submit" name="submit" class="input-button" value="Отправить" />
</form>
 
Код работает, в плане всего, кроме вызова методов контролёра. Что я не правильно делаю?
Закрыто