[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Проблема открытия миничата
Гость_Руслан
Сделал миничат для связи с администратором. При получении нового сообщения выползает ДИВ-окно с миничатом. Реализовал так:

// Если есть новое сообщение открываем окошко
if($openalert=="ok"){
?>
<DIV id="AlertChat">
<
DIV id="closeAlertChat" onclick="document.getElementById('AlertChat').style.display='none'">Закрыть</DIV>
<
table border="0" width="500" cellspacing="0" cellpadding="0"><tr>
<
td width="100%" align="center"><b><font color="#008080">Окно мини-чата с Администрацией</font></b></td>
</
tr><tr><td width="100%">
<
IFRAME align='middle' src='./chat.php?rnd=<? echo $rnd; ?>' frameBorder='0' width='500' height='206' scrolling='no'></IFRAME>
</
td></tr></table>
</
DIV>
<?
}
// end Окно мини-чата


Соответственно все сообщения обрабатываются и показываются в chat.php

Очень прошу помочь в следующих вопросах:
1. Если пользователь закрыл ДИВ но поступило новое сообщение в чат (проверяет соосно chat.php) как посредством РНР скриптом chat.php передать чтоб окно открылось опять? Понимаю, что это должно быть на Java но ведь сам ДИВ находится на другой странице (в моем случае на скрипте авторизации пользователя). Если можно, сам код подскажите. Я в яве разбираюсь очень плохо.

2. Как реализовать чтоб при клике мышкой на имя пользователя в поле ввода сообщения вводилось его имя и в скрытое поле ввода его ID? Т.е. в чате нажал на имя того кто написал сообщение и у меня в строке для ответа ввелось типа "Иванов А.В." (то имя которое показывается в чате) а в скрытом поле <<input type="hidden"> его ID (все работы с пользователем индентифицируются по его ID). При этом учитывайте что опять же сообщения с именами пользователей показываются во фрейме, а поле ввода находится на другой странице.

Буду очень признателен за помощь.



Спустя 27 минут, 46 секунд (10.02.2010 - 09:29) qpayct написал(а):
короче я так понимаю пришло время занятся в плотную javascript-ом и CSS

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

2. замути функцию, которая всё сделает и направь в неё 2 значения :
<script>
function
(id, user_name) {
document.getElementById('hidden_id').value=id;
document.getElementById('mess_text').value=document.getElementById('mess_text').value + user_name;
}
</script>

<input
type="hidden" id="hidden_id" />
<textarea
cols="50" rows="10" id="mess_text"></textarea>
<span
onclick="setParam(<?=$id?>, <?=$user_name?>)"><?=$username?></span>
вот как то так

Спустя 45 минут, 3 секунды (10.02.2010 - 10:14) Guest написал(а):
1. Так и сделано. При авторизации и показывает. Я же дал код. Но ведь получается что при закрытии окна оно фактически не закрывается, а чисто скрывается слой. Т.е. вариант проверить прочитал пользователь (увидел) не пройдет. Как скрипт поймет что пользователь свернул окно и не видет сообщения? Значит вариант один как я и описал - открыть окно ему вынужденно. Т.е. рнр скрипт выявил что поступило новое сообщение и как-то передал открыть ДИВ окно (если оно закрыто).

2. Я не понял кода... Как тогда выглядеть ссылка должна? И опять же на сколько я понял все элементы должны быть размещены на одной странице. А у меня получается сам текст сообщений и имя соосно пользователя идет во фрейме обновляемом постоянно, а форма отправки сообщения на другой странице. Вот так:

Файл chat.php

<form method="POST" action="./chat.php?step=send&rnd=<? echo $rnd; ?>">
<div
align="center"><center><table border="0" width="100%" cellspacing="0" cellpadding="0">
<tr><td
width="100%">
<IFRAME
align="middle" src="./chat_txt.php?rnd=<? echo $rnd; ?>" frameBorder="0" width="500" height="186" scrolling="auto"></IFRAME>
</td></tr><tr><td
width="100%"><b><font size="1" face="Verdana" color="#800080">Ответить </font></b>
<input
type="text" name="textmes" size="63"> <input type="submit" value="Ok"></td></tr>
</table></center></div></form>


Отсюда видно что сообщения идут в обновляемом файле сообщений chat_txt.php

Спустя 51 минута, 18 секунд (10.02.2010 - 11:06) qpayct написал(а):
Цитата (Guest @ 10.02.2010 - 09:14)
Как скрипт поймет что пользователь свернул окно и не видет сообщения?
прописать проверку надо, а как ты хотел? подумай над алгоритмом такой проверки.
Цитата (Guest @ 10.02.2010 - 09:14)
Я не понял кода... Как тогда выглядеть ссылка должна?
это действие происходит без перезагрузки страницы. разберись с основами javascript толком, сам поймёшь. сядь, сделай отдельный пробный проэктик и попробуй, как это работает. уловил суть?

Спустя 2 часа, 50 секунд (10.02.2010 - 13:06) Guest написал(а):
Вопрос так и открыт. Надеюсь кто нибудь поможет практическим советом)))

Спустя 4 часа, 29 минут, 41 секунда (10.02.2010 - 17:36) Гость_Руслан написал(а):
Нмного покопавшись решил проблему так. Написал функцию если окно закрыто - открыть его. Теперь этот кусок кода в login.php выглядет так:

<script language="JavaScript" type="text/javascript">
function show(AlertChat){
if(document.getElementById(AlertChat).style.display=="none"){
document.getElementById(AlertChat).style.display="inline";
}
}
</script>

<DIV id="AlertChat">
<DIV id="closeAlertChat" onclick="document.getElementById('AlertChat').style.display='none'">Закрыть</DIV>
<table border="0" width="500" cellspacing="0" cellpadding="0"><tr>
<td width="100%" align="center"><b><font color="#008080">Окно мини-чата с Администрацией</font></b></td>
</tr><tr><td width="100%">
<IFRAME align='middle' src='./chat.php?rnd=<? echo $rnd; ?>' frameBorder='0' width='500' height='206' scrolling='no'></IFRAME>
</td></tr></table>
</DIV>

Теперь получается надо сделать вызов функции show(AlertChat) при поступлении нового сообщения. Получается (может не прав) 2 варианта:

1. Скрипт chat_txt.php как-то должен передать в функцию на странице с ДИВ окном (login.php) через ява show(AlertChat). Как это можно реализовать?

2. Сделать что в самом коде функции вызова окна идет проверка поступили ли новые сообщения и соответственно вызвать функцию открытия show(AlertChat) Но в этом случае я так понимаю надо отдельный скрипт пхп к которому обратится ява и получит результат что есть новое сообщение. Это не удобно - еще скрипт пхп и в скрипте chat_txt.php установил что если пользователь он-лайн и открыто окно (которое фактически открыто при скрытии ДИВ) то считать все сообщения прочитанными.

Как решить вопрос? Помогите пожалуйста.

Спустя 20 минут, 12 секунд (10.02.2010 - 17:56) FatCat написал(а):
А здешний миничат не годится?
http://phpforum.ru/index.php?showminichat=show
Если интересен, могу копипастнуть коды; тут все довольно просто сделано.

Спустя 4 минуты, 52 секунды (10.02.2010 - 18:01) DedMorozzz написал(а):
ФетКет - баг нашёл smile.gif Прошёл по ссылке - открылся чат. Нажал после на "новые ообщения" чат открылся повторно. 2 окна открыто было.

Спустя 32 минуты, 11 секунд (10.02.2010 - 18:33) Guest написал(а):
Цитата (FatCat @ 10.02.2010 - 14:56)
А здешний миничат не годится?
http://phpforum.ru/index.php?showminichat=show
Если интересен, могу копипастнуть коды; тут все довольно просто сделано.

Веб-узел не может отобразить страницу Но на сколько понял идея похожа. То что окошечко чата... Подожду видимо настраиваете... Ошибку 500 дает

Спустя 6 часов, 13 минут, 24 секунды (11.02.2010 - 00:47) qpayct написал(а):
Цитата (Гость_Руслан @ 10.02.2010 - 16:36)
Теперь получается надо сделать вызов функции show(AlertChat) при поступлении нового сообщения. Получается (может не прав) 2 варианта:

1. Скрипт chat_txt.php как-то должен передать в функцию на странице с ДИВ окном (login.php) через ява show(AlertChat). Как это можно реализовать?

2. Сделать что в самом коде функции вызова окна идет проверка поступили ли новые сообщения и соответственно вызвать функцию открытия show(AlertChat) Но в этом случае я так понимаю надо отдельный скрипт пхп к которому обратится ява и получит результат что есть новое сообщение. Это не удобно - еще скрипт пхп и в скрипте chat_txt.php установил что если пользователь он-лайн и открыто окно (которое фактически открыто при скрытии ДИВ) то считать все сообщения прочитанными.

Как решить вопрос? Помогите пожалуйста.

Проверяй при загрузке страницы поступили новые сообщения или нет. Если поступили, включай окно и выводи сообщение. Если твой вопрос, как из проверки пхп дать команду открыть окно, то генерируй код подключаемого стиля в пхп при проверке.

Спустя 1 час, 37 минут, 10 секунд (11.02.2010 - 02:24) zawm написал(а):
Сейчас так и сделано. при обновлении страницы проверяется и если есть новые сообщения открывается окно. Но... если новое сообщение поступило когда окно было свернуто - то сообщение считается прочитанным так как оно было выведено пользователю (в скрытом слое). Соответственно при обновлении страницы не откроется слой, так как скрипт считает что новых сообщений нет. Может это можно реализовать по другому? Как бы правильно обьяснить.... В рнр файле где сам слой есть код:

<script>
function show(AlertChat){открываем окно если оно свернуто}
</script>

Другой рнр файл (обновляемый фрейм с сообщениями) при поступлении нового сообщения сообщает что надо выполнить function show(AlertChat) . как можно одному рнр файлу передать другому рнр файлу что необходимо выполнить функцию?

Надеюсь внятно описал)))

Спустя 1 час, 39 минут, 29 секунд (11.02.2010 - 04:03) qpayct написал(а):
На сколько я могу судить о проблеме ты просто не правильно реализовал алгоритм. Соответственно и скрытие открытие слоя должно зависить от наличия непрочитаного сообщения при загрузке страницы.

Тоесть сообщения не должны выводится в скрытый слой и отмечатся, как прочитаные - это и получается ошибка! Либо слой должен открыватся при поступлении нового сообщения.

На мой взгляд все что осталось сделать - это вынести показ слоя в отдельную функцию если это еще не сделано и при поступлении нового сообщения в чате вызывать ее.
Элементарно, Ватсон wink.gif

Спустя 5 часов, 6 минут, 22 секунды (11.02.2010 - 09:10) zawm написал(а):
Вот нашел интересное решение вывода контента без обновления страницы:
<script>
function showContent(link) {
var cont = document.getElementById('contentBody');
var http = createRequestObject();
if( http ) {
http.open('get', link);
http.onreadystatechange = function () {
if(http.readyState == 4) {
cont.innerHTML = http.responseText;
}
}
http.send(null);
} else {
document.location = link;
}
start();
}
function createRequestObject() {
try { return new XMLHttpRequest() }
catch(e) {
try { return new ActiveXObject('Msxml2.XMLHTTP') }
catch(e) {
try { return new ActiveXObject('Microsoft.XMLHTTP') }
catch(e) { return null; }
}
}
}
</script>
</head>

<body>
<div id="contentBody"></div>

В данном случае без каких либо модулей все работает. Т.е. выполняется запрос и выводится в слой ДИВ контент. Как можно передалать (дайте код пожалуста готовый) этот скрипт чтоб при обращении к showContent(link) не контент выводило, а если "+" то {alert('Все верно');}else{alert('Неправильно!');}

Т.е. я вместо alert и сделаю если + то открыть окно. Думаю так наверное будет проще решить проблему. Вобщем плане алгоритм такой нужен:

Обращаемся к http://www.domen.ru/сhat.php?ID=xxxxx
если "+" то {открываю окно}

Подскажите код пожалуйста. Желательно без аякс. Как выше реализовано чтоб было. Та конструкция работает у меня нормально.

Заранее спасибо.

Спустя 8 минут, 4 секунды (11.02.2010 - 09:18) zawm написал(а):
Цитата (qpayct @ 11.02.2010 - 01:03)
На сколько я могу судить о проблеме ты просто не правильно реализовал алгоритм. Соответственно и скрытие открытие слоя должно зависить от наличия непрочитаного сообщения при загрузке страницы.

Тоесть сообщения не должны выводится в скрытый слой и отмечатся, как прочитаные - это и получается ошибка! Либо слой должен открыватся при поступлении нового сообщения.

На мой взгляд все что осталось сделать - это вынести показ слоя в отдельную функцию если это еще не сделано и при поступлении нового сообщения в чате вызывать ее.
Элементарно, Ватсон wink.gif

Именно так и сделано. Если новое сообщение открываем слой с чатом. Но проверка происходит только при загрузке новой страницы посредством обработки пхп скриптом и открытием слоя с чатом если есть новое сообщение. А мне надо чтоб без перезагрузки. Так как если человек уже прочитал сообщение и свернул слой с чатом, то физически чат то работает и соответственно скрипт чата считает что сообщение прочитано и при следущей перезагрузке страницы не выведет чат, так как будет считать что новых сообщений нет.

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

Спасибо за ответ.

Спустя 3 минуты, 13 секунд (11.02.2010 - 09:21) qpayct написал(а):
Цитата (zawm @ 11.02.2010 - 08:18)
Считаю, что выход если окно с чатом свернуто только один - переодически запрашивать есть ли новые сообщения без перезагрузки страницы и в случае если есть развернуть окно. Вобщем думаю реализовать нужно как описал выше.

на основании чего ты тогда решил, что новые сообщения добавляются в скрытый слой и отмечаются, как прочитаные?

вообще конечно да, тебе следует окно чата прописать на ajax - разумно

Спустя 3 часа, 59 минут, 49 секунд (11.02.2010 - 13:21) zawm написал(а):
Ну так как код написать то? Проверяем если "+" то открываю окно (как открыть я знаю). Как именно код выглядет?....

Спустя 8 часов, 36 минут, 3 секунды (11.02.2010 - 21:57) zawm написал(а):
Всем спасибо. Решение первого вопроса нашел. Может кому пригодится. Сделал так:

<script language="JavaScript" type="text/javascript">
setTimeout ("showContent('http://www.domen.ru/chat_txt.php?login=Vasya')", 1000);
function showContent(link){
var http = createRequestObject();
if(http){
http.open('get', link);
http.onreadystatechange=function(){
if(http.readyState==4){
if (http.responseText=='+'){
// Если есть новые сообщения - Открываем окно ДИВ, ну или что Вам надо
show(AlertChat);
}
}
}
}
http.send(null);
}else {document.location = link;}
}
function createRequestObject(){
try{return new XMLHttpRequest()}
catch(e){
try{return new ActiveXObject('Msxml2.XMLHTTP')}
catch(e){
try{return new ActiveXObject('Microsoft.XMLHTTP')}
catch(e){return null;}
}
}
}
function show(AlertChat){
if(document.getElementById(AlertChat).style.display=="none"){
document.getElementById(AlertChat).style.display="inline";
}
}
</script>


Кстати, профессионалы посмотрите может что еще подскажете что здесь не так. Хотя все работает на Chorome b IE8. На других браузерах не проверял.

Остался открытым второй вопрос:
Цитата
Как реализовать чтоб при клике мышкой на имя пользователя в поле ввода сообщения вводилось его имя и в скрытое поле ввода его ID? Т.е. в чате нажал на имя того кто написал сообщение и у меня в строке для ответа ввелось типа "Иванов А.В." (то имя которое показывается в чате) а в скрытом поле <<input type="hidden"> его ID (все работы с пользователем индентифицируются по его ID). При этом учитывайте что опять же сообщения с именами пользователей показываются во фрейме (файл chat_txt.php), а поле ввода находится на другой странице (chat.php).

Спустя 51 минута, 52 секунды (11.02.2010 - 22:49) FatCat написал(а):
Цитата (zawm @ 11.02.2010 - 22:57)
и в скрытое поле ввода его ID?

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

Впрочем, подобное я делал для снижения нагрузки на сервер: при обновлении страницы чата считывается массив имен пользователей в онлайне вместе с айдишниками и прочей информацией: кто модератор чата и т.п.

Спустя 2 часа, 35 минут, 24 секунды (12.02.2010 - 01:24) zawm написал(а):
Цитата (FatCat @ 11.02.2010 - 19:49)
Цитата (zawm @ 11.02.2010 - 22:57)
и в скрытое поле ввода его ID?

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

Впрочем, подобное я делал для снижения нагрузки на сервер: при обновлении страницы чата считывается массив имен пользователей в онлайне вместе с айдишниками и прочей информацией: кто модератор чата и т.п.

Да дело в том, что все данные индетифицируются как ID пользователя. В чате показываются ФИО человека, т.е. Иванов И.И. к примеру. Но у нас возможны же несколько Ивановых И.И. - Иван Иванович, Иван Игнатьевич и т.д. Переписывать базы в которых более 21 тысячи человек нет смысла. Поэтому только идентификация по ID. Но в поле ввода же надо что-то писать? Чтоб человек понял что он пишет тому кому хочет, а не в пустоту....вот поэтому и надо чтоб в поле ввода сообщения пользователь видел что-то типа "Петров >", а в скрыток поле писался его ID по которому скрипт поймет кому адресовано сообщение.

Спустя 1 день, 10 часов, 18 минут, 11 секунд (13.02.2010 - 11:42) netruxa написал(а):
zawm, а у тя твой код заработал, который ты опубликовал тут? кинь линк на твой чат

Спустя 3 часа, 11 минут, 5 секунд (13.02.2010 - 14:54) zawm написал(а):
Цитата (netruxa @ 13.02.2010 - 08:42)
zawm, а у тя твой код заработал, который ты опубликовал тут? кинь линк на твой чат

Да все работает. Только пока это не чат как таковой (потом сделаю для всех) а чисто связь с администратором. И пока работает по принципу - поступило сообщение - открылось окно диалога у пользователя. Хотя можно открыть любому желающему гет запросом, но я пока не анонсировал новость и не включил ссылку для всех. А глянуть конечно без проблем. Я не знаю можно ли на форуме ссылки давать чтоб не считалось рекламой. Сейчас в личку попробую скинуть ссылку.

Спустя 13 минут, 39 секунд (13.02.2010 - 15:07) zawm написал(а):
Забыл добавить. Тема закрыта. Все уже сделал.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.