[ 25. February 2000]
- Svato_Straka
Jednoduché textové počítadlo - 10. časť CGI
Určite ste si už na mnohých stránkach všimli počítadlá prístupov. Môžu byť rôzne - od vyčačkaných nevkusných obrovských pestrofarebných oháv až po strohé obyčajné textové.
A práve na tie druhé - podstatne vkusnejšie - sa pozrieme a ukážeme si, ako v Perli takéto jednoduché počítadlo vytvoriť.
Takže ozrejmime si, ako bude naše počítadlo fungovať. Potrebujeme, aby sa hodnota počítadla zvýšila vždy pri prístupe k stránke. Takže najjednoduchšie sa tu javí použitie SSI direktívy, ktorá vždy spustí skript, ktorý zistí aktuálny stav počítadla a zvýši ho o 1. druhou možnosťou je volať priamo CGI skript, ktorý načíta stránku a vloží do nej hodnotu počítadla. Ukážeme si obe možnosti, pri čom počet prístupov budeme zaznamenávať v textovom súbore.
Počítadlo - SSI verzia
Pre našu ukážku si vytvoríme jednoduchú stránku, do ktorej pomocou SSI direktívy vložíme volanie na skript count1.cgi . Táto stránka môže vyzerať nasledovne:
<HTML>
<HEAD>
<TITLE>Jednoduche pocitadlo</TITLE>
</HEAD>
<BODY>
Počet prístupov k stránke: <!--</BODY>
</HTML>
Budeme už potrebovať len dva súbory. Jeden s aktuálnym stavom počítadla. Nazveme si ho stav1.txt . Druhým bude samotný skript, ktorý pri svojom zavolaní otvorí súbor stav1.txt, prečíta z neho stav počítadla, zvýši ho o 1 a zapíše naspäť. Takýto skript môže vyzerať nasledovne:
$subor = $ENV{DOCUMENT_ROOT} . "/stav1.txt";
open(STAV, $subor);
$stav = <STAV>;
close(STAV);
$stav++;
open(ZAPIS, ">".$subor);
print ZAPIS $stav;
close(ZAPIS);
print "Content-type: text/htmlnn";
print $stav;
Tu je vysvetlenie ku skriptu. Uložíme si cestu k súboru i s jeho názvom do premennej $subor . Tento súbor pomocou príkazu open otvoríme, pri čom dostane symbolické meno STAV . Toto symbolické meno sa v Perli nazýva ovládač súboru (z anglického file handle). S jeho pomocou môžete pracovať so súborom bez toho, aby ste vedeli kde je na disku v skutočnosti umiestnený atď. Pokým nezadáte pri otváraní súboru spôsob, akým sa má k súboru pristupovať, bude daný súbor otvorený len pre čítanie.
V ďalšom kroku načítame obsah súboru so premennej $stav . K tomu, aby bola táto operácia úspešná, musí sa daná hodnota nachádzať na prvom riadku v nami tvorenom súbore. Perl totiž rozoznáva kontext, v akom sa k dátam pristupuje. Pokým k ovládaču súboru pristupujete v skalárnom kontexte, prečíta vám z otvoreného súboru aktuálny riadok. Pokým explicitne neurčíte číslo riadku, prečíta sa prvý riadok (viď náš príklad). Pokým však budete s ovládačom súboru pracovať v zoznamovom kontexte (@subor = <SUBOR> ), načíta sa do poľa obsah celého súboru.
V ďalšom kroku súbor pomocou príkazu close uzavrieme. Toto je krok, na ktorý by sa nemalo zabúdať, všetci vieme čo robí množstvo naotváraných súborov so systémom.
Nasleduje zvýšenie stavu počítadla: $stav++; . Operátor ++ je operátorom inkrementu - spôsobí zvýšenie hodnoty premennej o 1.
V ďalšom úseku opäť otvoríme súbor so stavom počítadla - tentokrát pre zápis, čo je určené pri názve súboru: ">".$subor . Operátor > presmeruje výstup všetkých príkazov, ktoré svoj výstup posielajú na daný ovládač súboru, do nami otvoreného súboru. Ďalší riadok, print ZAPIS $stav; , posiela výstup príkazu print - hodnotu premennej $stav - na ovládač ZAPIS, ktorý je presmerovaný do súboru, ktorého názov s kompletnou cestou je uložený v premennej $subor .
Po uzavretí súboru už nasleduje len výpis čiastočnej http hlavičky a aktuálneho stavu počítadla.
Príklad v praxi
Počítadlo ako priamo volaný CGI skript
Pokým nemôžete na svojich stránkach použiť SSI, budete musieť zvoliť trochu iný prístup - a to zavolať CGI skript ktorý zobrazí požadovanú stránku a na potrebné miesto vloží aktuálny stav počítadla. Riešenie je možno jednoduchšie ako by sa mohlo zdať. Tvorí ho mierne upravený horeuvedený skript a modifikovaná stránka, v ktorej bude vaše počítadlo.
Stránku s počítadlom je potrebné upraviť takým spôsobom, že na miesto, kde má vaša okrasa figurovať, uvediete nejaký reťazec, ktorý bude skriptom nahradený za aktuálnu hodnotu počítadla. Z toho vyplýva, že by to mal byť reťazec, ktorý sa inak v stránke nevyskytuje - jedine že by ste chceli použiť počítadlo viackrát.
Povedzme teda, že naša stránka bude obsahovať na mieste počítadla reťazec CNTR (pozor na veľkosť písmen!):
<HTML>
... stránka...
<P>
Počet prístupov k stránke: CNTR
<P>
... dokončenie stránky...
</HTML>
Uložíme si túto stránku povedzme pod menom counter.html . Stav počítadla budeme ukladať v súbore s názvom stav2.txt . Tu je teda upravený skript:
$stranka = $ENV{DOCUMENT_ROOT} . "/counter.html";
$pocitadlo = $ENV{DOCUMENT_ROOT} . "/stav2.txt";
open(STAV, $pocitadlo);
$stav = <STAV>;
close(STAV);
$stav++;
open(ZAPIS, ">".$pocitadlo);
print ZAPIS $stav;
close(ZAPIS);
print "Content-type: text/htmlnn";
open(STRANKA, $stranka);
while(<STRANKA>) {
if(/CNTR/) {
s/CNTR/$stav/;
}
print;
}
close(STRANKA);
Ako tento skript funguje by ste už mali vedieť. V každom prípade si ho môžete pozieť v praxi.
Všetky vaše komentáre, pripomienky a návrhy očakávam na mojom maili: straka@developer.sk.
|
|
|