Autor | Zpráva | ||
---|---|---|---|
LosFilipos Profil |
#1 · Zasláno: 14. 11. 2010, 13:55:21
perwin:
To je právě další level, přidat ajax tak, aby se chat obnovoval bez reloadu stránky. To můžeš použít příklad, který jsem psal úplně na začátku. |
||
perwin Profil |
#2 · Zasláno: 14. 11. 2010, 14:12:26 · Upravil/a: perwin
LosFilipos:
AJAX: Tohle?: <form method="POST" name="forml" action="javascript:request('jmeno'); javascript:erase()"> ... </form> Tak místo toho 'jmeno' dam '$_SESSION[login]', ne? Jak mám udělat, když já kliknu na toho, s kým si chci popovídat, aby se mu taky otevřelo to chatové okno? |
||
LosFilipos Profil |
#3 · Zasláno: 14. 11. 2010, 14:18:07
perwin:
Jj, ale nezapomeň na ten javascript, ten taky musí být někam vložen... |
||
LosFilipos Profil |
#4 · Zasláno: 14. 11. 2010, 14:22:36
perwin:
„Jak mám udělat, když já kliknu na toho, s kým si chci popovídat, aby se mu taky otevřelo to chatové okno?“ Přemýšlej, nebudu přece dělat všechno za tebe... Existuje spousta tutoriálů na ajax. Musíš prostě zkontrolovat, zda je v tabulce aktivni_chaty jeho id, a zobrazit mu ten samy div s formulářem a výpisem zpráv... Zatím to funguje tak, že když klikneš na kamaráda, okno se zobrazí jen tobě, ale jemu by se zobrazilo až po reloadu stránky (F5). Ajax musí zařídít, to, aby se stránka nemusela reloadvat... |
||
perwin Profil |
#5 · Zasláno: 14. 11. 2010, 14:28:49 · Upravil/a: perwin
LosFilipos:
Nedodělaný soubor k diskuzi: <!-- FORMULÁŘ --> <form action="javascript:request('jmeno'); javascript:erase()" method='post'> <input type='hidden' name='sent' value=''/> <!-- Jméno se vkládá automaticky, není ho tudíž potřeba psát --> <textarea name='zprava' wrap=physical cols=50 rows=7></textarea><br/> <input type='submit' name='send' value='Poslat zprávu'/> </form> <!-- ZPRACOVÁNÍ --> <?php ob_start(); session_start(); if(isset($_POST['sent'])){ $vlozil=trim($_POST['vlozil']); $datum=$_POST['datum']; $zprava=$_POST['zprava']; if($zprava=="" ){ $backlink="web.php?page=chat&Alert=1"; }else{ require "db.php"; $PocetStejnych=mysql_result(mysql_query("SELECT COUNT(*) FROM `uzivatele` WHERE `zprava`='$zprava' OR `vlozil`='$vlozil'"), 0); if($PocetStejnych!=0){ $backlink="web.php?page=chat&Alert=2"; }else $VlozData=mysql_query("INSERT INTO zpravy (id_zpravy,id_autora,cas_zpravy,text_zpravy) VALUES (null,'$_SESSION[login]', NOW(), '$zprava')") or die (mysql_error()); $backlink="web.php?page=chat"; } } else{ $backlink="web.php?page=chat"; } header ("Location: $backlink"); ob_end_flush(); ?> <!-- ZOBRAZENÍ --> Přes AJAX Prosím poraď jak to mám upravit. Děkuji |
||
Kcko Profil |
#6 · Zasláno: 14. 11. 2010, 14:31:23
perwin:
Nezdá se Ti, že jsi dostal už těch informací a pomoci až moc? Pokud to sestrojit ani tak neumíš, tak si to nech udělat, je tu vlákno Práce a zakázky. |
||
LosFilipos Profil |
#7 · Zasláno: 14. 11. 2010, 14:34:58
Souhlasím s uživatelem Kcko.
perwin Prostě zkoušej. Já jsem se taky všechno naučil metodou pokus / omyl a nikdy jsem nepotřeboval diskusi... To, co jsem ti napsal, je pro začátek více než dobré. Teď už je to na tobě... |
||
Časová prodleva: 27 dní
|
|||
perwin Profil |
#8 · Zasláno: 11. 12. 2010, 09:25:02 · Upravil/a: perwin
Ahoj,
pořád jsem nepřišel na to jak to upravit, aby to fungovalo. Zde je script... nevím už, jak dál. <script type="text/javascript" src="./engine.js"></script> <!-- tento soubor mám vlastně totožný s tvým --> <!-- run.php mám také hodně podobný --> <?php // script na posílání zpráv if(isset($_SESSION["chaty"])) { require('db.php'); // obsahuje připjení k databázi... echo '<form method="POST" name="forml" action="javascript:request(\''.$_SESSION["login"].'\'); javascript:erase()"> <table> Text příspěvku: <textarea name="text" cols="50" rows="3" /></textarea><br /><br /> <input type="submit" value="Odeslat příspěvek" onclick="if(document.forms.forml.text.value==\'\'){return false;}" /> </table> <div onload="request();"> </div> '; } ?> Děkuji |
||
LosFilipos Profil |
#9 · Zasláno: 11. 12. 2010, 12:24:44
perwin:
Za prvé, na tag div, se událost onload nevstahuje (viz www.jakpsatweb.cz/javascript/udalosti.html#prehled) a za druhé ti tam chybí div, do kterého se mají ty zprávy vypisovat: <body onload="request();"> <div id="m"> </div> </body> |
||
perwin Profil |
#10 · Zasláno: 11. 12. 2010, 19:30:24
LosFilipos:
„na tag div se událost onload nevstahuje“ A kam mám to onload dát, do body sice můžu - nevadí, když to onload nebude přímo u toho scriptu? Jinak v souboru run.php - jak je to SELECT * FROM 'chat' - tu tabulku chat mas jako mam ja tu zpravy? Díky |
||
perwin Profil |
#11 · Zasláno: 11. 12. 2010, 19:40:02 · Upravil/a: perwin
Zapsání id_chatu do tabulky zpravy z tabulky activechats jsem vyresil takto:
$data = mysql_query("SELECT id_chatu FROM `activechats` "); $Vysledek = mysql_fetch_array($data); mysql_query("INSERT INTO zpravy (id_autora,id_chatu,text_zpravy,cas_zpravy) VALUES ('$nick', '$Vysledek[id_chatu]', '$text', NOW())") or die (mysql_error()); |
||
perwin Profil |
#12 · Zasláno: 11. 12. 2010, 20:38:10
1) Nefunguje mi, aby byl chat realtime - když vložím zprávu, musím zaktualizovat stranku.
2) Když s někým někým navážu chat, nezobrazí se mu to, jenom mě. Prosím poraď. Dík |
||
LosFilipos Profil |
#13 · Zasláno: 11. 12. 2010, 20:47:12
perwin:
„1) Nefunguje mi, aby byl chat realtime - když vložím zprávu, musím zaktualizovat stranku.“ Proto se musí funkce reload volat ve skriptu js. Já to mám v té ukázce každou sekundu. Viz ř. 102 souboru engine.js „2) Když s někým někým navážu chat, nezobrazí se mu to, jenom mě.“ Proto musíš vymyslet nějakou funkci, která bude v určitém časovém intervalu ajaxem procházet tabulku activechats a když najde tvoje ID, tak ti zobrazí okno s chatem. Žádné konkrétní řešení nemám, zkus něco napsat... „A kam mám to onload dát, do body sice můžu - nevadí, když to onload nebude přímo u toho scriptu?“ Když bude skript v hlavičce stránky, tak může být bez problémů onload u body... (nebo spíš musí, protže onload může být jen u body, nebo img) „Jinak v souboru run.php - jak je to SELECT * FROM 'chat' - tu tabulku chat mas jako mam ja tu zpravy? Díky“ Přesně tak... |
||
perwin Profil |
#14 · Zasláno: 11. 12. 2010, 21:14:47 · Upravil/a: perwin
LosFilipos:
„..musíš vymyslet nějakou funkci, která bude v určitém časovém intervalu ajaxem procházet tabulku activechats a když najde tvoje ID, tak ti zobrazí okno s chatem...“ Např. <div> <?php $query = mysql_query("SELECT * FROM `activechats`"); while($result = mysql_fetch_array($query)) { if($result["id_uzivatele"] = $_SESSION["login"]) { /* otevřít okno s chatem */ } elseif($result["id_kamarada"] = $_SESSION["login"]) { /* otevřít okno s chatem */ } } ?> </div> - udělat, aby se <div> aktualizoval každou vteřinu -> tím se každou vteřinu provede selectování aktivních chatů a vyhledá to jméno uživatele - buď bude v id_kamarada nebo v id_uzivatele -> pokud tam bude jméno uživatele otevře se okno s chatem Souhlas? Nebo to takhle nemůže být? Nebo napsat: $query = mysql_query("SELECT * FROM `activechats` WHERE id_kamarada = '$_SESSION[login]' or id_uzivatele = '$_SESSION[login]'"); ? Dík |
||
LosFilipos Profil |
#15 · Zasláno: 11. 12. 2010, 21:21:35
perwin:
Mno, jako php klidně, ale musíš to nějak propojit s ajaxem, aby ti to fungovalo bez reloadu stránky... Nebo by to šlo teoreticky řešit skrytým iframem, který se bude sám po určitém čase obnovovat... > tím se každou vteřinu provede selectování aktivních chatů a vyhledá to jméno uživatele - buď bude v id_kamarada nebo v id_uzivatele > -> pokud tam bude jméno uživatele otevře se okno s chatem Souhlas... Ovšem to vyhledávání v tabulce aktivních chatů bych udělal v delším časovém intervalu, třeba po 5 sekundách. Tu 1 sekundu bych nechal jen když už bude oteřené chatové okno, aby se vypsaly příchozí zprávy co nejdřív... |
||
perwin Profil |
#16 · Zasláno: 11. 12. 2010, 21:33:12 · Upravil/a: perwin
LosFilipos:
Nojo ale nevím jak udělat, aby se ten <div> aktualizoval po treba 5ti sekundach... Asi jednodušší by to bylo přes ten iframe, protože když se aktualizuje stránka v iframu, neovlivní to celou stránku kde je <iframe>. <iframe src="stranka-v-iframu" style="display: none;"> Stránka v iframu: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <meta http-equiv="refresh" content="5; url=stranka-v-iframu"> <?php $query = mysql_query("SELECT * FROM `activechats`"); while($result = mysql_fetch_array($query)) { if($result["id_uzivatele"] = $_SESSION["login"]) { /* otevřít okno s chatem */ } elseif($result["id_kamarada"] = $_SESSION["login"]) { /* otevřít okno s chatem */ } } ?> </html> - takhle je to najisto. |
||
LosFilipos Profil |
#17 · Zasláno: 11. 12. 2010, 21:47:54
perwin:
„Nojo ale nevím jak udělat, aby se ten <div> aktualizoval po treba 5ti sekundach“ Prostě a jednoduše se bude volat funkce, která vypisuje zprávy do divu každých 5 sekund. window.setInterval(function() {reload();},5000); Ale přes ten iframe je to asi jednodušší... |
||
perwin Profil |
#18 · Zasláno: 11. 12. 2010, 21:54:15 · Upravil/a: perwin
LosFilipos:
Vlastně s tím iframe je problém, protože jak otevřít okno s chatem do nadřazené stránky a né do stránky v iframu? Nebo dát přesměrování do toho iframu do té podmínky, aby když je uživatel v tabulce activechats ho to přesměrovalo na nějakou stránku s tím chatovým oknem - nejspíš do té nadřazené s nějakým ...stranka.php?chatoveokno=otevreno - ne? A refresh by šlo udělat i přes PHP: <?php $page = $_SERVER['PHP_SELF']; $sec = "5"; header("Refresh: $sec; url=$page"); |
||
LosFilipos Profil |
#19 · Zasláno: 11. 12. 2010, 22:00:07
perwin:
Může být... |
||
LosFilipos Profil |
#20 · Zasláno: 11. 12. 2010, 22:05:29
perwin:
Ovšem měnit javascriptem původní stránku lze taky, viz příklad: Kód ve sránce v iframu window.parent.document.getElementById('cokoliv').innerHTML = 'BAF'; |
||
perwin Profil |
#21 · Zasláno: 11. 12. 2010, 22:18:33
LosFilipos:
Takže by stránka v iframu vypadala takto: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <meta http-equiv="refresh" content="5; url=stranka-v-iframu"> <?php $query = mysql_query("SELECT * FROM `activechats`"); while($result = mysql_fetch_array($query)) { if($result["id_uzivatele"] = $_SESSION["login"]) { echo "<script language='JavaScript'>window.parent.document.getElementById('cokoliv').innerHTML = 'BAF';</script>"; } elseif($result["id_kamarada"] = $_SESSION["login"]) { echo "<script language='JavaScript'>window.parent.document.getElementById('cokoliv').innerHTML = 'BAF';</script>"; } } ?> </html> - co to je to BAF a co to je to cokoliv? Díky |
||
LosFilipos Profil |
#22 · Zasláno: 11. 12. 2010, 22:23:13 · Upravil/a: LosFilipos
Cokoliv je id divu, který se ti zobrazí jako okno chatu. Baf je potom text uvnitř toho divu. Bylo to myšleno jako schématický příklad. není tam důležité to cokoliv ani BAF, ale window.parent - chtěl jsem ukázat, jak se volají funkce ze stránky, která je v iframu... Samozřejmě to budeš muset upravit do nějaké složitější formy, aby se okno chatu zobrazilo správně. Bude tam pravděpodobně něco s document.createElement a podobně. To si někde najdi a nastuduj...
|
||
perwin Profil |
#23 · Zasláno: 11. 12. 2010, 22:36:34
LosFilipos:
window.parent.document.getElementById('id_divu').createElement('element_k_vytvoreni') |
||
LosFilipos Profil |
#24 · Zasláno: 11. 12. 2010, 22:39:23
perwin:
Nope... www.zaachi.com/cs/items/dynamicke-pridavani-elementu-formulare.html# Ten příklad je sice o formulářích, ale dá se to použít na všechno... |
||
perwin Profil |
#25 · Zasláno: 11. 12. 2010, 22:45:08 · Upravil/a: perwin
LosFilipos:
Na začátku měl ten script v iframe sloužit k tomu, aby to uživatelům, kteří jsou v tabulce activechats otevřelo okno s chatem. A to okno s chatem obsahuje <form>...</form> a vypsání zpráv z tabulky. Tudíž to okno s chatem může být jistý skritý div na stránce a ve stránce v iframu může být jenom přesměrování na nadřazenou stránku s něčim jako ?chatoveokno=otevreno, což odkryje to chatove okno - ten skrytý div, ne? A potom napsat: <?php if($_SERVER['REQUEST_URI'] = /stranka.php?chatoveokno=otevreno) { echo '<div>...</div>'; } else { echo '<div style="display: none;">..</div>'; } // nebo ještě lépe - ať to nevypíše nic, pokud ta adresa nesouhlasí ?> |
||
LosFilipos Profil |
#26 · Zasláno: 11. 12. 2010, 22:50:00 · Upravil/a: LosFilipos
perwin:
„Tudíž to okno s chatem může být jistý skritý div na stránce a ve stránce“ Teoreticky ano, ale potom nastane problém, když budeš chtít chatovat s více uživateli. Nebudeš mit dost oken... „v iframu může být jenom přesměrování na nadřazenou stránku s něčim jako ?chatoveokno=otevreno, což odkryje to chatove okno - ten skrytý div“ Není nutné přesměrování. stačí tohle: window.parent.document.getElementById('okno_chatu').style.display = 'block'; |
||
perwin Profil |
#27 · Zasláno: 11. 12. 2010, 22:53:04
LosFilipos:
„..stačí tohle:“ Ano, to je asi lepší.. protože by se to s tou adresou dalo lehce obejít |
||
perwin Profil |
#28 · Zasláno: 11. 12. 2010, 22:56:28
perwin:
„potom nastane problém, když budeš chtít chatovat s více uživateli“ Ano,... leda že by se s vypsáním každého online uživatele k němu i vypsal ten skrytý div a byl by připravený pro použití. |
||
LosFilipos Profil |
#29 · Zasláno: 11. 12. 2010, 22:58:09
perwin:
„leda že by se s vypsáním každého online uživatele k němu i vypsal ten skrytý div a byl by připravený pro použití.“ Což je ovšem naprosto zbytečné, když můžeš pomocí createElement pro každého vytvořit vlastní okno, jen když bude potřeba... |
||
perwin Profil |
#30 · Zasláno: 11. 12. 2010, 23:05:00
LosFilipos:
Ano, to jest pravdou býti.... ale jak bude teda vypadat ten script s tím createElement? <script language="javascript"> var form1 = document.createElement('FORM'); form1.setAttribute('action', 'javascript:request(\''.$_SESSION["login"].'\'); javascript:erase()'); form1.setAttribute('method', 'post'); atd. </script> ? |
||
Téma pokračuje na další straně.
|
0