Naposledy sme si ošetrili vstupy, dnes si ukážeme, ako pracuje minule spomenutá funkcia OnLineForm, ktorá nám vráti mená online chatujúcich oddelených znakom „>“.

Funkcia OnLineForm očakáva štyri parametre: $meno, $sprava, $odhlasit, $dvojnik. Prvé tri sú myslím jasné, $dvojnik je negovaná hodnota premennej $chatar, čo znamená, že ak je $chatar prázdny reťazec, $dvojnik je pravdivá hodnota. Pozrime sa teraz na to, čo sa stane po tom, ako vyhovujú všetky vstupy:

// vstupy su ok
else {
  // vrati retazec s online chatujucimi
  $new_online = OnLineForm($meno,$sprava,$odhlasit,!$chatar);
  // ak $chatar==““ kontroluj dvojnika
  if(!$chatar){
    // obsahuje vrateny retazec dvojnika ?
    if( StrStr($new_online,“>“.$meno) ){
      JSAlert(„Meno „.$meno.“ už existuje !“);
      $meno=““;
      }
    // neobsahuje, preto ho pridaj do retazca online chatujucich
    else
      $new_online .= „>“.$meno;
    }
  // $meno sa odhlasil
  if($odhlasit)
    $meno=““;
  // ak nastala zmena v online chatujucich, obnov ramec online
  if($old_online != $new_online)
    JSFrameReload(„online“,“online.php“);
  // ak bola pridana sprava, obnov ramec show
  if($sprava || $old_online != $new_online)
    JSFrameReload(„show“,“show.php“);
  }

Stručne povedané, ak ide užívateľ prvý krát (to vieme podľa prázdnej premennej $chatar) napísať svoje meno a správu, urobíme kontrolu, či takéto meno už nechatuje. Ako som už povedal, funkcia vráti reťazec online chatujúcich oddelených znakom „>“, nič nám teda nebráni zistiť, či vrátený reťazec neobsahuje $meno. Ak áno (užívateľ s takýmto menom už existuje), vypíšeme o tom správu a nastavíme $meno na prázdny reťazec, ako keď sme na chat prišli prvý krát. Inak pridáme $meno do reťazca online chatujúcich, pretože na základe zmeny $new_online oproti $old_online budeme obnovovať rámec online.

V súbore function.php sú definované dve funkcie, ktoré generujú JavaScript kód:

// JavaScript – do ramca $frame nacitaj dokument s $url
function JSFrameReload($frame,$url){
  echo „<script language=’JavaScript’>\n“;
  echo „parent.frames.“.$frame.“.location = ‚“.$url.“‚\n“;
  echo „</script>\n“;
  }
// JavaScript – okno alert
function JSAlert($s){
  echo „<script language=’JavaScript’>\n“;
  echo „alert(‚“.$s.“‚)\n“;
  echo „</script>\n“;
  }

Okrem týchto funkcií je tu definovaná funkcia na premenovanie súborov, ktorá sa používa predtým, ako ideme so súborom pracovať:

function Premenuj($oldName,$newName){
  while(  !($r = @ReName($oldName,$newName))  );
  }

Pred funkciu Rename() vložíme znak @, ktorý zabráni výpisu chybových správ, pretože to, že sa súbor nedá premenovať, môže byť spôsobené tým, že so súborom práve pracuje iný užívateľ. V praxi sa tento cyklus vykoná pravdepodobne iba raz, pretože práca so súbormi nie je časovo náročná.

Funkcia OnLineForm pracuje nasledovne: do premennej $doteraz si uložíme počet sekúnd od 1.1.1970, premenujeme si oba súbory, čím dáme ostatým navedomie, že s nimi pracujeme práve my. Načítame obsah celého súboru online užívateľov do poľa, kde každý prvok poľa bude obsahovať jeden riadok zo súboru. Potom otvoríme oba súbory a postupne pomocou cyklu while prejdeme všetkými prvkami poľa.

function OnLineForm($meno,$sprava,$odhlasit,$dvojnik){
  $doteraz = Date(„U“);
  Premenuj(ONLINE_OLDNAME,ONLINE_NEWNAME);
  Premenuj(SHOW_OLDNAME,SHOW_NEWNAME);
  $pole = File(ONLINE_NEWNAME);
  $fp_online = FOpen(ONLINE_NEWNAME,“w“);
  $fp_show = FOpen(SHOW_NEWNAME,“a“);
// while cyklus zaciatok
  while(list($riadok,$retazec) = each($pole)){
    $nick = StrTok($retazec,“>“);
    $idle = StrTok(„\n“);

Do $nick si uložíme meno chatujúceho a do $idle počet sekúnd od 1.1.1970 do času pridania poslednej správy. Potom na základe niekoľkých podmienok zapisujeme do oboch súborov potrebné údaje. Myslím, že po zhliadnutí zdrojového kódu bude princíp spracovania jasný.

    if($nick==$meno){
      if($dvojnik){
        FPutS($fp_online,$retazec);
        $online_users .= „>“.$nick;
        }
      else if($odhlasit){
        if($sprava)
          FPutS($fp_show,sprintf(FORMAT,$meno,$sprava));
        FPutS($fp_show,sprintf(FORMAT,“Chat II“,“<b style=’color: Red’>$meno sa odhlásil(a) z chatu</b>“));
        }
      else if($sprava){
        FPutS($fp_show,sprintf(FORMAT,$meno,$sprava));
        FPutS($fp_online,$nick.“>“.$doteraz.“\n“);
        $online_users .= „>“.$nick;
        }
      }
    // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    else if($doteraz – $idle > AUTO_LOGOUT_TIMER)
      FPutS($fp_show,sprintf(FORMAT,“Chat II“,“<b style=’color: Orange’>$nick bol(a) automaticky odhlásený(á) z chatu</b>“));
    else{
      FPutS($fp_online,$retazec);
      $online_users .= „>“.$nick;
      }
    // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    }
// while cyklus koniec

Po ukončení cyklu, teda prekontrolovaní všetkých riadkov súboru online, nasledujúcou podmienkou prekontrolujeme, či nie je potrebné prihlásiť nového užívateľa na chat:

if(StrStr($online_users,“>“.$meno) == false && (!$odhlasit || $dvojnik))

Pridaný bude vtedy, ak sa $meno nenachádza medzi online chatujúcimi a ešte musí byť splnená jedna z týchto dvoch podmienok: $meno sa nechce odhlásiť, alebo sa robí kontrola, či existuje dvojník. Nakoniec súbory zatvoríme, premenujeme na pôvodné a vrátime zoznam práve online chatujúcich. Funkcia nám teda:

  • zabezpečuje kontrolu, či nepridáva novú správu dvojník
  • odhlásenie užívateľa
  • pridanie novej správy
  • automatické odhlásenie užívateľa
  • pridanie nového užívateľa (& správy)

Táto funkcia sa však spustí iba vtedy, ak vyhovujú vstupné hodnoty a odošle sa formulár. To by bol viac menej statický chat, preto, ako v prvom článku o jednoduchom chate sa každých HEAD_RELOAD_TIMER sekúnd obnoví rámec head, v ktorom pracuje skript head.php, ktorý sa stará o automatické odstránenie starých užívateľov. O tom si však povieme až v ďalšom pokračovaní. Pozorný čitateľ možno postrehol, že pri porovnávaní premenných $meno a $nick rozlišujeme veľkosti písmen, preto sa na chate môžu objaviť napr. mená „Barborka“ aj „BARBORKA“. Kto má niečo proti, nech nahradí toto porovnávanie funkciou StrCaseCmp(), ktorá nie je citlivá na veľkosť písmen. Taktiež bude potrebná zmena funkcie StrStr() na StrIStr().

Pre tých, ktorý nevedia, o čom som tu dnes písal, je tu odkaz na ukážku.

Žádný příspěvek v diskuzi

Odpovědět