Чат на IFRAME

Готовые уроки IFrame + ВКонтакте API
azzzi
Сообщения: 164
Зарегистрирован: 13 сен 2010, 19:24

Чат на IFRAME

Сообщение azzzi »

Сразу предупреждаю, могут быть ошибки, потому что кидаю не прямой код из моей игры, а чуть видоизмененный, поэтому включайте мозги!
(прямой код не кидаю, так как кроме чата у меня выводится тех.информация в чат, а вам оно не надо).

В чате выводится 20 строк методом ajax jquery, т.е без перезагрузки страницы...количество строк можно регулировать по желанию. Сообщения записываются в текстовой файл и оттуда же считываются.

В моей игре работает без проблем - http://vkontakte.ru/app1991084

Файл index.php:

вставляем прокручивающийся див туда где нужно выводить текст чата, высоту регулируем в height:

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

<div id="chats" style="height:100; overflow: scroll; overflow: auto; background-color: white; text-align:left; padding:2px 2px 2px 2px;  margin:0px 0px 2px 0px; color:#b6b19d; border:1px solid #bdc7d8"> 
эти две строчки вставляем там где пользователь будет вводить текст и отправлять его в чат по кнопке:

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

<input  type=text id="textchat" name="textchat" title="напишите сообщение в чат" size=30 maxlength=50>  <INPUT TYPE=IMAGE SRC="chatadd.gif" onmouseover="this.src='chatadd2.gif';" onmouseout="this.src='chatadd.gif';" id="okey3" name="okey3"   onclick="addchats(document.getElementById('textchat').value); return false;" title="написать в чат" VALUE="написать"> 
как видим при нажатии кнопки срабатывает функция JS addchats...

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

<script type="text/javascript">function addchats(text) { var text = text; if (text == "") var text = "всем привет";  var stroka2 = "<? echo "$zid $zname $zfam пишет:"; ?>"; $.post("addchat.php", { check: text, stroka: stroka2 }, function(data) { document.getElementById('textchat').value='';  } ); } </script>
как видим если пользователь отправляет пустое сообщение, подставляется "всем привет", в другом случае методом ПОСТ отправляется текст в
addchat.php. В переменных $zid $zname $zfam у меня: ид имя и фамилия. (надеюсь как засунуть их в переменную вы сами знаете).

Ну и на последок в index.php будет функция которая выводит текст в чат:

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

<script type="text/javascript"> function chatad() {  $.post("getchat.php", {  }, function(data) {    document.getElementById('chats').innerHTML =  '';   for(var i = 1; i <= 20; i++) {   document.getElementById('chats').innerHTML +=  ' ' + $(data).find("time" + i).text() + ' ' + '<a href=http://vkontakte.ru/id' + $(data).find("uid" + i).text() + ' ' + 'target="_blank">' + $(data).find("first_name" + i).text() + ' ' + $(data).find("last_name" + i).text() + '</a>';     document.getElementById('chats').innerHTML += ' ' + $(data).find("text" + i).text()  + ' <br>';   }    }, "xml" ); setTimeout('chatad()', 1000); }</script> 
как видим эта функция обращается к файлу getchat.php, берет оттуда данные в формате xml и выводит из в div с id=chats.
i <= 20 - означает что выполняет цикл 20 раз, т.е выведется 20 строк, о чем я и писал в самом начале, если надо больше ставим больше!
эту функцию нам надо выполнять раз в секунду, чтобы обновлялся чат:

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

 <script type="text/javascript">setTimeout('chatad()', 1000);</script> 
вот и всё!

ну и содержимое addchat.php и getchat.php:
getchat.php:

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

<?header('Content-Type: text/xml; charset=UTF-8');$file5 = file("chat.txt");if ($file5) {$ss2 = 0;for ($ss=1;$ss<21;$ss++) {${pieces.$ss} = explode(" ", iconv('windows-1251', 'UTF-8', $file5[$ss2]));$ss2++;}} echo"<xml><body>"; for ($t=1;$t<21;$t++) {  echo "<time$t>" . ${pieces.$t}[0]. "</time$t>"; echo "<uid$t>" . ${pieces.$t}[2]. "</uid$t>"; echo "<first_name$t>" . ${pieces.$t}[3]. "</first_name$t>"; echo "<last_name$t>" . ${pieces.$t}[4]. "</last_name$t>"; echo "<text$t>"; for ($mm=5;$mm<count(${pieces.$t});$mm++) { echo  ${pieces.$t}[$mm]." "; } echo "</text$t>";}  echo "</body></xml>"; ?>  
addchat.php:

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

<?if (isset($_POST['stroka'])) { $dates = date( 'H:i:s d/m/y', time() );$chatstr = $dates;$storki = $_POST['stroka'];$chatstr = "$chatstr $storki";$testfrom = $_POST['check'];$chatstr = "$chatstr $testfrom";$chatstr = iconv('UTF-8', 'windows-1251', $chatstr);} $file_chat="chat.txt"; // файл гостевой книги$file_temp="tempchat.txt"; // временный файл  $fe = file_exists($file_temp); if($fe != TRUE) {if(copy($file_chat, $file_temp))  {  if($w=fopen($file_chat,"w")) {  flock($w,2); // локируем файл  fwrite($w,$chatstr."\n"); // записываем первую строку    if ($r=fopen($file_temp,"r")) {   flock($r,1);   $x = 0;   while( ($str=fgets($r,10240)) && ($x < 20) ) // читаем построчно    {     $x++;     fputs($w,$str); // пишем построчно    }   flock($r,3);   fclose($r);   flock($w,3);   fclose($w);   unlink($file_temp);  } } }} ?>
azzzi
Сообщения: 164
Зарегистрирован: 13 сен 2010, 19:24

Re: Чат на IFRAME

Сообщение azzzi »

+ не забудьте подключать jquery...

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

<script src="jquery-1.4.2.min.js" charset="windows-1251"></script>

+для тех у кого проблемы с получением имени и фамилии:
$zid - id пользователя
$api_secret - ключ приложения
я делаю так:

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

  $rand = rand();  $timestamp = time()+300;  $sig = md5("api_id=".$api_id."fields=photo_medium"."method=getProfiles"."uids=".$zid.$api_secret);  $postvars = "api_id=".$api_id."&uids=".$zid."&method=getProfiles&fields=photo_medium"."&sig=".$sig;  $chp = curl_init('http://api.vkontakte.ru/api.php');  curl_setopt($chp, CURLOPT_HEADER,0);  curl_setopt($chp, CURLOPT_RETURNTRANSFER ,1);  curl_setopt($chp, CURLOPT_POST, 1);  curl_setopt($chp, CURLOPT_POSTFIELDS,  $postvars);  $res = curl_exec($chp);  curl_close($chp); if ($res) {$store = simplexml_load_string($res); foreach($store->user as $user){ $zfoto = $user->photo_medium; $zname = $user->first_name; $zfam = $user->last_name; } $zname = iconv('UTF-8', 'windows-1251', $zname);$zfam = iconv('UTF-8', 'windows-1251', $zfam); 
это на 1 экране, а потом передаю все переменные из экрана в экран гетом...
раньше передавал сессиями, но так как у половины пользователей сессии в ифрейме загадочно изчезают, стал передавать гетом))
Аватара пользователя
Влад
Модератор
Модератор
Сообщения: 654
Зарегистрирован: 29 апр 2010, 22:24

Re: Чат на IFRAME

Сообщение Влад »

:( в файлы писать не хочет, права 777
azzzi
Сообщения: 164
Зарегистрирован: 13 сен 2010, 19:24

Re: Чат на IFRAME

Сообщение azzzi »

в какие файлы? тут всего 1 файл - chat.txt
создай его предварительно и права вроде 666
Аватара пользователя
Влад
Модератор
Модератор
Сообщения: 654
Зарегистрирован: 29 апр 2010, 22:24

Re: Чат на IFRAME

Сообщение Влад »

всё равно чат не работает
azzzi
Сообщения: 164
Зарегистрирован: 13 сен 2010, 19:24

Re: Чат на IFRAME

Сообщение azzzi »

из-за чата хостер повысил мне стоимость хостинга в несколько раз...так что аккуратнее юзайте))
Rembrant
Сообщения: 29
Зарегистрирован: 18 янв 2010, 23:45

Re: Чат на IFRAME

Сообщение Rembrant »

а почему тогда не использовать привычные sendMessage-getMessages? Неужели будут больше грузить хостинг?
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45

Re: Чат на IFRAME

Сообщение Александр »

Rembrant
sendMessage-getMessages - используют сервер вконтакте. А значит твой хостинг грузить не будут вообще. Но это не значит что использовать эти 2 метода гораздо лучше, чем задействовать свой сервер. В разных ситуациях нужны разные способы.
Аватара пользователя
ukhov
Модератор
Модератор
Сообщения: 1343
Зарегистрирован: 04 янв 2011, 21:19

Re: Чат на IFRAME

Сообщение ukhov »

azzzi писал(а):+ не забудьте подключать jquery...

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

<script src="jquery-1.4.2.min.js" charset="windows-1251"></script>

+для тех у кого проблемы с получением имени и фамилии:
$zid - id пользователя
$api_secret - ключ приложения
я делаю так:

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

  $rand = rand();  $timestamp = time()+300;  $sig = md5("api_id=".$api_id."fields=photo_medium"."method=getProfiles"."uids=".$zid.$api_secret);  $postvars = "api_id=".$api_id."&uids=".$zid."&method=getProfiles&fields=photo_medium"."&sig=".$sig;  $chp = curl_init('http://api.vkontakte.ru/api.php');  curl_setopt($chp, CURLOPT_HEADER,0);  curl_setopt($chp, CURLOPT_RETURNTRANSFER ,1);  curl_setopt($chp, CURLOPT_POST, 1);  curl_setopt($chp, CURLOPT_POSTFIELDS,  $postvars);  $res = curl_exec($chp);  curl_close($chp); if ($res) {$store = simplexml_load_string($res); foreach($store->user as $user){ $zfoto = $user->photo_medium; $zname = $user->first_name; $zfam = $user->last_name; } $zname = iconv('UTF-8', 'windows-1251', $zname);$zfam = iconv('UTF-8', 'windows-1251', $zfam); 
это на 1 экране, а потом передаю все переменные из экрана в экран гетом...
раньше передавал сессиями, но так как у половины пользователей сессии в ифрейме загадочно изчезают, стал передавать гетом))
не работает. может их-ха этого кода? просто я его не понял. если защитный ключ - yJBears1ag6RjSNiUE2a то как в оде это написать?
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45

Re: Чат на IFRAME

Сообщение Александр »

ukhov писал(а):не работает.
Что значит не работает? Как ты определил? Попробуй выявить ошибку. Постепенно упрощай код. Если у тебя недостаточно опыта и не хочешь делать самостоятельно, то наверно только сюда http://flapps.ru/forum/forum11.html
Ответить