Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Мини чат 
:(
    Опции темы
underW
Дата 25.6.2009, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 22.9.2008

Репутация: 1
Всего: 3



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

Поэтому, вероятней всего, придется что то "мудровать" самому,  но заковыка в том, что нету даже малейшего представления о том, как вообще организован чат, например, как реализовать вывод пользователю нового сообщения в чате, не путем ожидания автообновления через заданный интервал, а сразу как сообщение было написано я даже теоретически не представляю, объясните, пожалуйста.
PM MAIL   Вверх
JDmitry
Дата 25.6.2009, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 5.3.2009

Репутация: нет
Всего: нет



Тебе надо хорошие знания Ajax и JSON для создания чата но всё на сасом деле просто:
1. Есть таблица в базе вида:
ID | Кто пишет | Кому пишет | Сообщение | Статуст сообщения (системное, админ послал, приватное, приватное системное)
Делаеш Аякс запрос потом скидуеш в ДЖсон и добовляеш сообщения в див 

Пример маего Ява скрипт обработчика без Джесон
Код

<script>
function addSmile(smile)
{
    $('textarar').value += smile;
}
function showSmiles(type)
{
    $('love').style.display='none';
    $('sings').style.display='none';
    $('more').style.display='none';
    $(type).style.display='block';
}
google.load("language", "1");
function stop_chat()
{
    var id = document.getElementById('hide_id').value;
    if (id == "") return false;
    new Ajax.Request('sources/stopchat.php?id='+id, {
      method: 'get',
      onSuccess: function(Server) {


      }
    });
}
function getMovie()
{
    var M$ =  navigator.appName.indexOf("Microsoft")!=-1
    return (M$ ? window : document)["BridgeMovie"];
}


function sendSetVariable()
{
    var movie = getMovie();
    movie.SetVariable("message", '');
}


// Hook for Internet Explorer.
if (navigator.appName && navigator.appName.indexOf("Microsoft") != -1 && navigator.userAgent.indexOf("Windows") != -1)
{
        document.write('<script language=\"VBScript\"\>\n');
        document.write('On Error Resume Next\n');
        document.write('Sub BridgeMovie_FSCommand(ByVal command, ByVal args)\n');
        document.write('        Call BridgeMovie_DoFSCommand(command, args)\n');
        document.write('End Sub\n');
        document.write('</script\>\n');
}

function translate_text()
{
    var text = $('textarar');
    var lang = $('lang1');
    var lang1 = $('lang2');
    google.language.translate(text.value, lang.value, lang1.value, function(result) {
        if (!result.error) {
           var text = $('textarar');
          text.value = result.translation;
        }
      });

}
function add_message()
{

    var text = document.getElementById('textarar');
    var message_window = document.getElementById('message_window');
    var to_id = document.getElementById('hide_id').value;
    if (to_id == '')
    {
     alert("Chose bitch");
     return;
    }
    var my_nick = '<?=$myname["Login"]?>';
   dateObjectName = new Date();
    var cur_date = dateObjectName.getHours()+':'+dateObjectName.getMinutes();
    //message_window.innerHTML += '<a href="javascript">'+my_nick+'</a> | '+cur_date+'<br>'+text.value+'<br>';
    var obj = {"message":text.value,"cur_date":cur_date,"to_id":to_id};
    new Ajax.Request('sources/sendmessage.php', {method: 'post',parameters: obj,onSuccess: function(Server) {}});
    text.value = '';
}
function refreshMessages()
{
    var to_id = $('hide_id').value;
    //if (to_id == "") return;
    new Ajax.Request('sources/getnewmessages.php?id='+to_id, {
      method: 'get',
      onSuccess: function(Server) {
        if (Server.responseText.length > 10)
        {
          $('message_window').innerHTML = Server.responseText;
          $('message_window').scrollTop = 10000;
          sendSetVariable();
         }
      }
    });

}
function checkNewMessages()
{
    new Ajax.Request('sources/checknewmessages.php', {
      method: 'get',
      onSuccess: function(Server) {
       var to_id = $('hide_id').value;
       var ids = Server.responseText.split("|||");
       for(i=0;i<ids.length;i++)
       {
            if (to_id != ids[i])
            {
                var gender = $('user_gender_'+ids[i]).value;
                if (gender == 1)
                    $('user_ico_'+ids[i]).src='images/blink_ico_man.gif';
                else
                    $('user_ico_'+ids[i]).src='images/blink_ico_woman.gif';
                $('user_login_'+ids[i]).style.color = '#aa1340';
            }
       }

      }
    });

}
function aceptUser(user,msg,arr)
{
    new Ajax.Request('sources/acept.php?user='+user+'&msg='+msg, {method: 'get',onSuccess: function(Server) {
         addToContactList(user);
         change_user(user,arr[0],arr[1]);
    }});
}
function sheckCals()
{
    new Ajax.Request('sources/calluser.php', {
          method: 'get',
          onSuccess: function(Server) {


              $('message_window').innerHTML = Server.responseText+$('message_window').innerHTML;

          }
        });
}
function ignoreuser(id,msg)
{
    new Ajax.Request('sources/ignore.php?id='+id+'&msg='+msg, {method: 'get',onSuccess: function(Server) {}});
}
function refreshUsers()
{
    var sort = $('sortby').value;
    new Ajax.Request('sources/getnewusers.php?sort='+sort, {
      method: 'get',
      onSuccess: function(Server) {


          $('users_online').innerHTML = Server.responseText;

      }
    });
}
function refreshContactList()
{
    var to_id = $('hide_id').value;
    new Ajax.Request('sources/contactlist.php?id='+to_id, {
      method: 'get',
      onSuccess: function(Server) {


          $('contactListUsers').innerHTML = Server.responseText;

      }
    });
}
function callUser(id)
{
     new Ajax.Request('sources/calluser2.php?id='+id, {method: 'get',onSuccess: function(Server) {}});
}
function setDefaults(img)
{
    var to_id = $('hide_id').value;
    if (to_id == "")
    {
        var wh = document.getElementById('whs');
        wh.innerHTML = "Choose you desteny";
        document.getElementById('user_pic').src = img;
    }
}
setInterval('setDefaults("<?=$img?>");',500);
setInterval('refreshMessages()',500);
setInterval('refreshUsers()',1000);
setInterval('checkNewMessages()',1500);
setInterval('refreshContactList()',3000);

function change_user(id,foto,login,color)
{
    document.getElementById('hide_id').value=id;
    if ($('anketa_'+id)) $('anketa_'+id).style.display='none';
    var wh = document.getElementById('whs');
    wh.innerHTML = login;
    document.getElementById('user_pic').src = foto;
    $('user_login_'+id).style.color = '#1712EB';
    $('user_row_'+id).style.backgroundColor=color;
    $('user_row_'+id).onmouseout = function()
    {
     this.style.backgroundColor=color;
    }
    new Ajax.Request('sources/sendmessage.php?update=1', {
      method: 'get',
      onSuccess: function(Server) {

      }
    });

}
function addToContactList(id)
{
    new Ajax.Request('sources/addtocontactlist.php?id='+id, {
      method: 'get',
      onSuccess: function(Server) {

        if (Server.responseText.length > 0)
        {
           var info = Server.responseText.split("|||");
           if (info[3] == 1)
            var ico = 'ico_man.png';
            else ico = 'ico_woman.png';
           document.getElementById('contactListUsers').innerHTML += '<TR id="user_row_'+id+'"><TD align="left" class="cont_list"><input name="user_gender_'+id+'" id="user_gender_'+id+'" type="hidden" value="'+info[3]+'"> <IMG id="user_ico_'+id+'" src="images/'+ico+'"><B> <a href="javascript:void(0);" oncontextmenu="return menu(1, event,'+info[0]+',\''+info[1]+'\',\''+info[2]+'\');" onclick="change_user('+info[0]+',\''+info[1]+'\',\''+info[2]+'\');">'+info[2]+'</a> <a href="javascript:callUser('+info[0]+');change_user('+info[0]+',\''+info[1]+'\',\''+info[2]+'\');"><img src="http://vkagy.com/templates/images/chat.gif" border="0"></a></B>    <a href="#"><img src="images/call.gif" border="0"></a><a href="#"><img src="images/stream.gif" border="0"></a>          </TD></TR>';
        }
      }
    });
}
function deleteUser(id)
{
    new Ajax.Request('sources/deleteuser.php?id='+id, {
      method: 'get',
      onSuccess: function(Server) {

        if (Server.responseText == "Succes")
        {
           $('user_row_'+id).style.display='none';
           $('hide_id').value = '';
      }
      }
    });
}
function deleteAllUsert()
{
      new Ajax.Request('sources/deleteuser.php?delete=', {
      method: 'get',
      onSuccess: function(Server) {

      }
    });
}
function defPosition(event) {
      var x = y = 0;
      if (document.attachEvent != null) { // Internet Explorer & Opera
            x = window.event.clientX + (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft);
            y = window.event.clientY + (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop);
      } else if (!document.attachEvent && document.addEventListener) { // Gecko
            x = event.clientX + window.scrollX;
            y = event.clientY + window.scrollY;
      } else {
            // Do nothing
      }
      return {x:x, y:y};
}

function menu(type, evt, id, foto, login) {
    // Блокируем всплывание события contextmenu
    evt = evt || window.event;
    evt.cancelBubble = true;
    // Показываем собственное контекстное меню
    var menu = $("contextMenuId");
    var html = "";
    switch (type) {
        case (1) :
            html = "Menu propertys";
            html += "<br><a href=javascript:change_user("+id+",'"+foto+"','"+login+"');>Send message</a>";
            html += "<br><a href='#'>Send gift</a>";
            html += "<br><a href=javascript:deleteUser("+id+");>Delete</a>";
        break;
        default :
            // Nothing
        break;
    }
    // Если есть что показать - показываем
    if (html) {
        menu.innerHTML = html;
        menu.style.top = defPosition(evt).y + "px";
        menu.style.left = defPosition(evt).x + "px";
        menu.style.display = "";
    }
    // Блокируем всплывание стандартного браузерного меню
    return false;
}

// Закрываем контекстное при клике левой или правой кнопкой по документу
// Функция для добавления обработчиков событий
function addHandler(object, event, handler, useCapture) {
    if (object.addEventListener) {
        object.addEventListener(event, handler, useCapture ? useCapture : false);
    } else if (object.attachEvent) {
        object.attachEvent('on' + event, handler);
    } else alert("Add handler is not supported");
}
addHandler(document, "contextmenu", function() {
    document.getElementById("contextMenuId").style.display = "none";
});
addHandler(document, "click", function() {
    document.getElementById("contextMenuId").style.display = "none";
});
</script>


пример как получать сообщения с сервера:
Код

<?php
include "../../config.php";
include "../../common.php";
$id =  (isset($_SESSION["ManID"])) ? $_SESSION["ManID"] : $_SESSION["LadyID"];

 $x = "";

$sql = "SELECT * FROM CHAT_MESSAGES
WHERE (CHAT_MESSAGES.to_id = $id OR CHAT_MESSAGES.from_id = $id ) AND CHAT_MESSAGES.is_read = 0 AND  CHAT_MESSAGES.`status` = 0
ORDER BY CHAT_MESSAGES.`times` DESC";
$bind = mysql_query($sql) or die(mysql_error());
if (mysql_num_rows($bind))
{

$sql = "SELECT USERS.Login, USERS.id as uid, USERS.gender, CHAT_MESSAGES.* FROM CHAT_MESSAGES
                 INNER JOIN USERS ON USERS.id = CHAT_MESSAGES.from_id
WHERE (CHAT_MESSAGES.to_id = $id OR CHAT_MESSAGES.from_id = $id) AND (CHAT_MESSAGES.to_id = ".intval($_GET["id"])." OR CHAT_MESSAGES.from_id = ".intval($_GET["id"]).") AND  CHAT_MESSAGES.`status` = 0
 AND (CHAT_MESSAGES.is_read = 0 OR CHAT_MESSAGES.is_read = 1) ORDER BY CHAT_MESSAGES.`times` ASC";
$bind = mysql_query($sql);
mysql_query("UPDATE CHAT_MESSAGES SET is_read = 1 WHERE to_id = $id");
$love = scandir("../smiles/love");
$sings = scandir("../smiles/sings");
$enather = scandir("../smiles/enather");
While($lfx_rows = mysql_fetch_assoc($bind))
{
    for($i=0;$i<sizeof($love);$i++)
        $lfx_rows["messages"] = str_replace(":$love[$i]:","<img src=\"smiles/love/$love[$i]\" border=\"0\">",$lfx_rows["messages"]);
    for($i=0;$i<sizeof($sings);$i++)
        $lfx_rows["messages"] = str_replace(":$sings[$i]:","<img src=\"smiles/sings/$sings[$i]\" border=\"0\">",$lfx_rows["messages"]);
    for($i=0;$i<sizeof($enather);$i++)
        $lfx_rows["messages"] = str_replace(":$enather[$i]:","<img src=\"smiles/enather/$enather[$i]\" border=\"0\">",$lfx_rows["messages"]);

    if ($lfx_rows["gender"] == 1)
        $x .= "<a target=\"_blank\" href=\"http://$_SERVER[HTTP_HOST]/anketa.php?id=$lfx_rows[uid]\"><font color=\"#201CCA\"><u>".$lfx_rows["Login"]."</a></u> | ".date("H:i",$lfx_rows["times"])."</font><br>".$lfx_rows["messages"]."<br><br>";
    else
        $x .= "<a target=\"_blank\"  href=\"http://$_SERVER[HTTP_HOST]/anketa.php?id=$lfx_rows[uid]\"><font color=\"#aa1340\"><u>".$lfx_rows["Login"]."</a></u> | ".date("H:i",$lfx_rows["times"])."</font><br>".$lfx_rows["messages"]."<br><br>";
}
}
 $sql = "SELECT USERS.Login, CHAT_MESSAGES.* FROM CHAT_MESSAGES
                 INNER JOIN USERS ON USERS.id = CHAT_MESSAGES.from_id
WHERE (CHAT_MESSAGES.to_id = $id OR CHAT_MESSAGES.from_id = $id) AND  CHAT_MESSAGES.`status` = 1
ORDER BY CHAT_MESSAGES.`times` ASC";
$bind = mysql_query($sql);


While($lfx_rows = mysql_fetch_assoc($bind))
{
    if ($lfx_rows["from_id"] == $id) $msg = "<br><b>You have sent an invitation to chat</b><br><br>";
    else
    {
         $sql = "SELECT USERS.Login, USERS.gender, (SELECT photo FROM USER_PHOTOS WHERE USER_PHOTOS.id_user = $lfx_rows[from_id] AND Avatar = 1) as photo  FROM USERS
                                                WHERE USERS.id = $lfx_rows[from_id]";

            $bind2 = mysql_query($sql);
            $lfx_rows2 = mysql_fetch_assoc($bind2);
                     if ($lfx_rows2["gender"] == 1)
                                {

                                 $type = "men";
                                }
                                else
                                {

                                 $type = "ladies";
                                }
         if ($lfx_rows2["photo"] == "")
               $lfx_rows2["photo"] = "/image/$type/thumb_default.png";
          else
               $lfx_rows2["photo"] = "/image/$type/thumb_".$lfx_rows["photo"];

         $msg = "<a href=\"javascript:aceptUser($lfx_rows[from_id],$lfx_rows[id],['$lfx_rows2[photo]','$lfx_rows2[Login]']);\">Acept</a> | <a href=\"javascript:ignoreuser($lfx_rows[from_id],$lfx_rows[id]);\">Ignore</a>  <br><b>You have been invited to chat</b><br><br>";
    }
    if ($lfx_rows["messages"] == 2)
        $msg = "<br><b>Your proposal rejected</b><br><br>";
    if ($lfx_rows["messages"] == 3)
        $msg = "<br><b>Remote user stopped the chat</b><br><br>";
    $x .= $lfx_rows["Login"]." | ".date("H:i",$lfx_rows["times"])." $msg";
}

print $x;
?>

Собственно из этого понятно что и как делаеться код читай внимательно ))

Это сообщение отредактировал(а) JDmitry - 25.6.2009, 18:29
PM MAIL   Вверх
underW
Дата 26.6.2009, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 22.9.2008

Репутация: 1
Всего: 3



о, хорошо, JDmitry,  спасибо, попробую разобраться.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0495 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.