Jednoduchý online chat v PHP a JavaScripte – rámec head

1. listopadu 2001

V poslednom pokračovaní si rozoberieme rámec head a ukážeme si ako sa vypisujú odkazy v rámci show a online prihlásený v rámci online. Nájdete tu aj odkaz na zdrojové súbory.

V rámci head sa každých HEAD_RELOAD_TIMER sekúnd spustí nasledovný skript, pričom funkcia OnLineHead() vráti opäť reťazec online prihlásených oddelených znakom „>“.

// ak nastala zmena v online uzivateloch – obnov ramec online
if( $old_online != ($new_online = OnLineHead()) )
  JSFrameReload(„online“,“online.php“);
// ak $meno nie je prazdne a nenachadza sa v online uzivateloch,
// obnov ramec form (tym sa $meno nastavi na prazdny retazec)

if($meno && !StrStr($new_online,“>“.$meno))
  JSFrameReload(„form“,“form.php“);
// zisti velkost suboru s odkazmi
do {
  ClearStatCache();
  } while( ($new_size = @FileSize(SHOW_OLDNAME)) === false );
// ak pribudol novy odkaz – obnov ramec show
if($new_size != $old_size)
  JSFrameReload(„show“,“show.php“);

Funkcia OnLineHead() okrem vrátenia reťazca, odstráni zo súboru s online prihlásenými starých užívateľov, ktorý už viac ako AUTO_LOGOUT_TIMER sekúnd nepridali novú správu. Tak ako pri premenovávaní súborov, aj tu sa snažíme zistiť veľkosť súboru v cykle s ošetrením výpisu chybových správ funkcie FileSize(). Ak sa veľkosť nepodarilo zistiť (niekto so súborom pracuje) funkcia vráti false, čo pri automatickom pretypovaní PHP môže byť to isté, ako súbor s nulovou veľkosťou. Preto, vrátenú hodnotu FileSize() porovnáme pomocou operátora === (3 rovná sa), čo bude pravda iba ak sú hodnoty rovnaké a rovnakého typu.

Odpočítavanie zabezpečuje jednoduchý JavaScript, ktorý po uplynutí HEAD_RELOAD_TIMER sekúnd obnoví rámec head s nasledovnými parametrami, predanými v URL.

parent.frames.head.location =
„head.php?old_size=<?echo $new_size?>&old_online=<?echo $new_online?>&meno=“ +
parent.frames.form.document.form.chatar.value

Teda s veľkosťou súboru s odkazmi (aby sme vedeli, kedy obnoviť rámec show), reťazcom online prihlásených pred časom HEAD_RELOAD_TIMER (aby sme vedeli, kedy obnoviť rámec online) a našim menom, ktoré je prihlásené, čo vieme podľa naplneného inputu chatar v rámci form. Hodnotu inputu chatar získame pomocou JavaScriptu. Najskôr sa pomocou objektov dostaneme do rámca form (parent.frames.form) a potom získame hodnotu inputu chatar z formulára form (document.form.chatar.value). Po spustení skriptu head.php kontrolujeme, či sa takto získané meno nachádza vo vrátenej hodnote funkcie OnLineHead(). Ak sa tam nenachádza, znamená to, že toto meno bolo automaticky odhlásené z online chatujúcich. Musíme teda zabezpečiť obnovenie rámca form, pretože takéto meno už nie je medzi online.

Počas chatovania môže nastať prípad, že niekto odošle formulár a kým príde odpoveď zo serveru nemusí byť rámec form ešte kompletne načítaný, teda nemusí existovať formulár a ani hodnota chatar. Preto je v rámci head JavaScriptová funkcia Timer() ošetrená, aby čakala na to dokiaľ neexistuje objekt parent.frames.form.document.form. Ak tento prípad nastane, vo formulári rámca head sa na tento čas objaví znak „w“.

Výpis odkazov v rámci head je takmer rovnaký, ako v prvom jednoduchom chate. Pribudla tu jedine možnosť zobrazovať odkazy na stránke v opačnom poradí, teda nový odkaz sa objaví hore. V zdrojovom kóde je prednastavený výpis, že nové odkazy sa zobrazujú dole. Ak by to niekomu nevyhovovalo, stačí dať do poznámok funkciu FPassThru(), a odstrániť poznámky /* … */.

// vypis suboru od aktualnej pozicie & zatvor subor
FPassThru($fp);
/*
// opacny vypis SHOW
if($velkost_suboru >= POCETODKAZ_MAX_BYTE)
  $pocet_odkazov = POCETODKAZ_MAX;
else
  $pocet_odkazov = $velkost_suboru / JEDENODKAZ_MAX_BYTE;
for($i=0 ; $i<$pocet_odkazov ; $i++)
  $pole[$i] = FGetS($fp,JEDENODKAZ_MAX_BYTE+1);
FClose($fp);
for($i=POCETODKAZ_MAX-1 ; $i>=0 ; $i–)
  $s .= $pole[$i];
echo $s;
*/

Výpis online užívateľov do rámca online je podobný ako pri funkciách OnLine… Do rámca reklama.php si pridáme formulár na zobrazenie odkazov od … do. Formulár sa nikdy neodošle, iba po stlačení buttonu sa vykoná funkcia Zobraz(), ktorá prekontroluj či vstupy od … do vyhovujú a otvorí pomocou JavaScriptu nové okno, kde zobrazíme odkazy od … do. Toto zabezpečuje skript zobraz.php (nie sú ošetrené parametre predávané cez URL).

while( ($fp = @FOpen(SHOW_OLDNAME,“r“)) == false );
FSeek($fp,$od*JEDENODKAZ_MAX_BYTE);
echo FRead($fp,$do*JEDENODKAZ_MAX_BYTE – $od*JEDENODKAZ_MAX_BYTE);
FClose($fp);

Dúfam, že skript vám pobeží bez problémov, pretože i po absolvovaní mnohých skúšok ešte stále môže nastať nepredvídateľná udalosť. Skript napríklad nemá obmedzenie na počet naraz prihlásených užívateľov. Ďalšie vylepšenia sú už len na vás, úloha, ktorú som si dal ja, bola doplniť prvý chat o zoznam online prihlásených bez databázy a zabrániť prihláseniu sa dvoch rovnakých mien, a to bez zložitých identifikácií užívateľa. Odskúšaný bol v IE 5.5, NN6, Mozilla 0.9, Opera 5.12. Zdrojové súbory (zip) sú k stiahnutiu tu. A dnes už naposledy odkaz na ukážku chatu.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *