Чат на IFRAME

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

Чат на IFRAME

Сообщение azzzi »

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

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

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

Файл index.php:

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

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

  1. <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">
  2.  


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

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

  1. <input  type=text id="textchat" name="textchat" title="напишите сообщение в чат" size=30 maxlength=50>  
  2. <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="написать">
  3.  


как видим при нажатии кнопки срабатывает функция JS addchats...

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

  1. <script type="text/javascript">
  2. function addchats(text) {
  3.  var text = text;
  4.  if (text == "") var text = "всем привет";
  5.  var stroka2 = "<? echo "$zid $zname $zfam пишет:"; ?>";
  6.  $.post("addchat.php", { check: text, stroka: stroka2 }, function(data) { document.getElementById('textchat').value='';  } );
  7.  
  8. }
  9. </script>


как видим если пользователь отправляет пустое сообщение, подставляется "всем привет", в другом случае методом ПОСТ отправляется текст в
addchat.php. В переменных $zid $zname $zfam у меня: ид имя и фамилия. (надеюсь как засунуть их в переменную вы сами знаете).

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

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

  1. <script type="text/javascript">
  2.  
  3. function chatad() {
  4.  
  5.  $.post("getchat.php", {  }, function(data) {
  6.    document.getElementById('chats').innerHTML =  '';
  7.    for(var i = 1; i <= 20; i++) {
  8.    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>';  
  9.    document.getElementById('chats').innerHTML += ' ' + $(data).find("text" + i).text()  + ' <br>';
  10.    }
  11.  
  12.  
  13.   }, "xml" );
  14.  setTimeout('chatad()', 1000);
  15.  
  16. }
  17. </script>
  18.  


как видим эта функция обращается к файлу getchat.php, берет оттуда данные в формате xml и выводит из в div с id=chats.
i <= 20 - означает что выполняет цикл 20 раз, т.е выведется 20 строк, о чем я и писал в самом начале, если надо больше ставим больше!
эту функцию нам надо выполнять раз в секунду, чтобы обновлялся чат:

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

  1.  
  2. <script type="text/javascript">
  3. setTimeout('chatad()', 1000);
  4. </script>
  5.  


вот и всё!

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

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

  1. <?
  2. header('Content-Type: text/xml; charset=UTF-8');
  3. $file5 = file("chat.txt");
  4. if ($file5) {
  5. $ss2 = 0;
  6. for ($ss=1;$ss<21;$ss++) {
  7. ${pieces.$ss} = explode(" ", iconv('windows-1251', 'UTF-8', $file5[$ss2]));
  8. $ss2++;
  9. }
  10. }
  11.  
  12. echo"
  13. <xml>
  14. <body>
  15. ";
  16.  
  17. for ($t=1;$t<21;$t++) {
  18.  
  19.  echo "<time$t>" . ${pieces.$t}[0]. "</time$t>";
  20.  echo "<uid$t>" . ${pieces.$t}[2]. "</uid$t>";
  21.  echo "<first_name$t>" . ${pieces.$t}[3]. "</first_name$t>";
  22.  echo "<last_name$t>" . ${pieces.$t}[4]. "</last_name$t>";
  23.  echo "<text$t>";
  24.  for ($mm=5;$mm<count(${pieces.$t});$mm++) { echo  ${pieces.$t}[$mm]." "; }
  25.  echo "</text$t>";
  26. }
  27.  
  28.  
  29. echo "
  30. </body>
  31. </xml>
  32. ";
  33.  
  34. ?>
  35.  
  36.  


addchat.php:

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

  1. <?
  2. if (isset($_POST['stroka'])) {
  3.  
  4. $dates = date( 'H:i:s d/m/y', time() );
  5. $chatstr = $dates;
  6. $storki = $_POST['stroka'];
  7. $chatstr = "$chatstr $storki";
  8. $testfrom = $_POST['check'];
  9. $chatstr = "$chatstr $testfrom";
  10. $chatstr = iconv('UTF-8', 'windows-1251', $chatstr);
  11. }
  12.  
  13. $file_chat="chat.txt"; // файл гостевой книги
  14. $file_temp="tempchat.txt"; // временный файл
  15.  
  16.  
  17. $fe = file_exists($file_temp);
  18.  
  19. if($fe != TRUE) {
  20. if(copy($file_chat, $file_temp))  {
  21.  
  22.  if($w=fopen($file_chat,"w")) {
  23.   flock($w,2); // локируем файл
  24.   fwrite($w,$chatstr."\n"); // записываем первую строку
  25.  
  26.   if ($r=fopen($file_temp,"r")) {
  27.    flock($r,1);
  28.    $x = 0;
  29.    while( ($str=fgets($r,10240)) && ($x < 20) ) // читаем построчно
  30.     {
  31.      $x++;
  32.      fputs($w,$str); // пишем построчно
  33.     }
  34.    flock($r,3);
  35.    fclose($r);
  36.    flock($w,3);
  37.    fclose($w);
  38.    unlink($file_temp);
  39.   }
  40.  }
  41.  
  42. }
  43. }
  44.  
  45. ?>
azzzi
Сообщения: 164
Зарегистрирован: 13 сен 2010, 19:24

Re: Чат на IFRAME

Сообщение azzzi »

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

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

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



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

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

  1.  $rand = rand();
  2.   $timestamp = time()+300;
  3.   $sig = md5("api_id=".$api_id."fields=photo_medium"."method=getProfiles"."uids=".$zid.$api_secret);
  4.   $postvars = "api_id=".$api_id."&uids=".$zid."&method=getProfiles&fields=photo_medium"."&sig=".$sig;
  5.   $chp = curl_init('http://api.vkontakte.ru/api.php');
  6.   curl_setopt($chp, CURLOPT_HEADER,0);
  7.   curl_setopt($chp, CURLOPT_RETURNTRANSFER ,1);
  8.   curl_setopt($chp, CURLOPT_POST, 1);
  9.   curl_setopt($chp, CURLOPT_POSTFIELDS,  $postvars);
  10.   $res = curl_exec($chp);
  11.   curl_close($chp);
  12.  
  13. if ($res) {
  14. $store = simplexml_load_string($res);
  15.  
  16. foreach($store->user as $user)
  17. {
  18.  $zfoto = $user->photo_medium;
  19.  $zname = $user->first_name;
  20.  $zfam = $user->last_name;
  21.  
  22. }
  23.  
  24. $zname = iconv('UTF-8', 'windows-1251', $zname);
  25. $zfam = iconv('UTF-8', 'windows-1251', $zfam);
  26.  


это на 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...

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

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



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

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

  1.  $rand = rand();
  2.   $timestamp = time()+300;
  3.   $sig = md5("api_id=".$api_id."fields=photo_medium"."method=getProfiles"."uids=".$zid.$api_secret);
  4.   $postvars = "api_id=".$api_id."&uids=".$zid."&method=getProfiles&fields=photo_medium"."&sig=".$sig;
  5.   $chp = curl_init('http://api.vkontakte.ru/api.php');
  6.   curl_setopt($chp, CURLOPT_HEADER,0);
  7.   curl_setopt($chp, CURLOPT_RETURNTRANSFER ,1);
  8.   curl_setopt($chp, CURLOPT_POST, 1);
  9.   curl_setopt($chp, CURLOPT_POSTFIELDS,  $postvars);
  10.   $res = curl_exec($chp);
  11.   curl_close($chp);
  12.  
  13. if ($res) {
  14. $store = simplexml_load_string($res);
  15.  
  16. foreach($store->user as $user)
  17. {
  18.  $zfoto = $user->photo_medium;
  19.  $zname = $user->first_name;
  20.  $zfam = $user->last_name;
  21.  
  22. }
  23.  
  24. $zname = iconv('UTF-8', 'windows-1251', $zname);
  25. $zfam = iconv('UTF-8', 'windows-1251', $zfam);
  26.  


это на 1 экране, а потом передаю все переменные из экрана в экран гетом...
раньше передавал сессиями, но так как у половины пользователей сессии в ифрейме загадочно изчезают, стал передавать гетом))

не работает. может их-ха этого кода? просто я его не понял. если защитный ключ - yJBears1ag6RjSNiUE2a то как в оде это написать?
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45
Откуда: Санкт-Петербург

Re: Чат на IFRAME

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

ukhov писал(а):не работает.

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