Umíme ve Flashi – 18. díl – flashové sušenky

Dnes se podíváme na možnost ukládání malého množství dat do souborů podobných klasickým cookies, které známe z běžných webových aplikací. Uložená data využijeme pro vytvoření jednoduchého počítadla návštěv.

Flashové Cookies

To že Flash neumí ukládat data do souborů je známo. Ovšem, není to tak úplně pravda, existuje možnost, jak alespoň některá data na uživatelův počítač uložit. Pomocníkem nám bude třída SharedObject, umožňující ukládat data na disk.

Ovšem, stejně jako v případě cookies, i použití SharedObject není vždy stoprocentní. Ukládání SharedObject souborů může být zakázáno, může dojít k jejich vymazání apod. Každopádně, tato třída stojí rozhodně za podrobnější prozkoumání i vzhledem k její jednoduchosti.

Ukládání dat

Jak již bylo řečeno, data se ukládají podobně jako cookies. Tyto soubory s koncovkou .sol se ukládají do adresáře: C:\Documents and Settings\Jméno_Uživatele\Data aplikací\Macromedia\Flash Player\#SharedObjects

Pokud se do tohoto adresáře podíváme, možná nás překvapí hojnost, s jakou se SharedObject třída využívá.

Samotné uložení dat je velice jednoduché. Používá se metoda getLocal(), která má tyto další parametry:

  • name – jméno objektu, pod kterým se ukládá
  • localPath – umístění swf souboru, který ukládá SharedObject, pokud máme více swf souborů na jedné doméně, které ukládají SharedObjects, je dobré u každého nastavit specifické umístění, abychom tak zabránili případné kolizi stejných názvů ukládaných objektů
  • secure – umožnění číst/zapisovat do objektů ze swf souborů načítaných přes HTTPS protokol (hodnota true)

Vytvoření SharedObject a vložení hodnoty pak může vypadat takto:

var my_so:SharedObject = SharedObject.getLocal("cas", "/");
my_so.data.cas = „Dnešní datum“;
my_so.flush();

Nejdříve vytvoříme objekt „my_so“ třídy SharedObject, kde jsme určili název (cas) pod kterým budeme k tomuto objektu přistupovat. Pomocí vlastnosti „data“ vložíme hodnotu „Dnešní datum“ a metodou flush() provedeme zápis objektu. Pokud bychom metodu flush() nepoužili, zápis by se uskutečnil až po uzavření swf souboru.

Opětovné zobrazení vložených objektů se provádí podobně jako jejich zápis:

var my_so:SharedObject = SharedObject.getLocal("cas", "/");
casRazitko = my_so.data.cas;

Jak je patrné, metoda getLocal() slouží jak pro načítání, tak i pro vytvoření nového objektu.

Vytvoření počítadla návštěv

V minulých dílech jsme se v návštěvní knize věnovali ukládání dat do txt souborů. Do jisté míry jsme už v posledním díle vytvořili jakési počítadlo uživatelů, kdy jsme zobrazili počet vložených zpráv.

Dnešní počítadlo se bude lišit jen nepatrně, využijeme stejného principu, jako u návštěvní knihy. Budeme ukládat data o návštěvníkovi a poté spočítáme všechny zápisy. Klasickým problémem, který stojí na začátku konstrukce každého počítadla návštěv je jeho věrohodnost.

Můžeme samozřejmě vytvořit opravdu jednoduché počítadlo, kdy se při každém načtení stránky zvýší hodnota počítadla. Zde by ale stačilo stránku neustále obnovovat a naklikat si tak další imaginární uživatele. SharedObject použijeme pro zajištění započtení stejného návštěvníka až po určitém časovém intervalu.

PHP soubor

Nejdříve si vytvoříme php soubor „pocitadlo.php“, který se bude starat o načítání a ukládání dat do txt souboru:

<?php
// proměnná Ulozit, zaslané Flashem, určující, zdali máme provést uložení
$Ulozit  = $HTTP_POST_VARS["Ulozit"];
$Cas   = $HTTP_POST_VARS["dat"];

// odstranení lomítek z textu
$Ulozit = stripslashes($Ulozit);
$Cas  = stripslashes($Cas);

// soubor vzkazu
$NazevSouboru  = "pocitadlo.txt";
//pokud jsme poslali hodnotu promenné Odeslano="ano" budeme zapisovat
if ($Ulozit == "ano") {

 // otevreme soubor pr ctení a uložíme jeho obsah do promenné PuvodniVzkazy
 $fp  = fopen( $NazevSouboru,"r");
 $Puvodni  = fread($fp, 80000);
 fclose( $fp );
 // naformátujeme nový vzkaz
 $ipName = $_SERVER["REMOTE_ADDR"];
 
 $Novy = "$ipName||$Cas||:::";
 // do promenné New spojíme púvodní vzkazy s novým
        $NovyZapis = "$Novy$Puvodni";
 // soubor prepíšeme novými vzkazy
 echo "&stat=$NovyZapis&";
 $fp = fopen( $NazevSouboru,"w");
 if(!$fp) die("&texts=nelze zapisovat do souboru: $NazevSouboru &");
 fwrite($fp, $NovyZapis, 800000);
 fclose( $fp );
}
// zde opet otevreme soubor se vzkazy
$fp  = fopen( $NazevSouboru,"r");
$Data  = fread($fp, 800000);
fclose( $fp );
// z promenné Data vložíme data do pole Pole podle oddelovace ":::"
$Pole = split (":::", $Data);
$pocet = count($Pole) - 1;

for ($n = 0; $n < $pocet; $n++) {
echo "&text$n=";
 echo $Pole[$n];
 echo "&";
  if (!$Pole[$n]) {
echo "&";
   exit;
  }
 }

?>

Kód je velmi podobný jako jsme použili v návštěvní knize. Pouze jsme přejmenovali proměnné, aby lépe odpovídali situaci a jako výstup, který ukládáme do txt souboru bude sloužit pouze IP adresa a čas, kdy uživatel na stránky vstoupil.

SWF soubor

Nyní si otevřeme nový flashový dokument a v prvním snímku napíšeme tento skript:

var my_so:SharedObject = SharedObject.getLocal("cas", "/");
casRazitko = my_so.data.cas;
hodina = new Date();
hr = hodina.getHours();
dn = hodina.getDay();
ms = hodina.getMonth();
rk = hodina.getFullYear();
sc = hodina.getMinutes();
cas = rk+""+ms+""+dn+""+hr+""+sc;
if (casRazitko == undefined) {
 ulozit = "ano";
} else if (casRazitko == cas) {
 ulozit = "ne";
} else {
 ulozit = "ano";
}
my_so.data.cas = cas;
my_so.flush();
getDatum = function () {
 datum = "";
 date = new Date();
 den = date.getDay();
 if (den == 0) {
  datum += "Neděle";
 } else if (den == 1) {
  datum += "Pondělí";
 } else if (den == 2) {
  datum += "Úterý";
 } else if (den == 3) {
  datum += "Středa";
 } else if (den == 4) {
  datum += "Čtvrtek";
 } else if (den == 5) {
  datum += "Pátek";
 } else if (den == 6) {
  datum += "Sobota";
 }
 datum += "; "+date.getHours()+":"+date.getMinutes()+":"+date.getSeconds();
 return datum;
};
txts = new Object();
var stat:LoadVars = new LoadVars();
stat.onLoad = function(success:Boolean) {
 if (success) {
  txts = stat;
  parseZapis();
 }
};
var stats:LoadVars = new LoadVars();
stats.Ulozit = ulozit;
stats.dat = getDatum();
stats.sendAndLoad("pocitadlo.php", stat, "POST");
parseZapis = function () {
 i = 0;
 poleStrany = new Array();
 poleStrany.push("");
 refStrany = "";
 shoda = false;
 while (eval("txts.text"+i) != undefined) {
  zapis = eval("txts.text"+i).split("||");
  for (cnt=0; cnt<poleStrany.length; cnt++) {
   if (poleStrany[cnt] == zapis[0]) {
    shoda = true;
   } else {
    shoda = false;
   }
  }
  if (shoda == false) {
   poleStrany.push(zapis[0]);
   refStrany += zapis[0]+newline;
  }
  i++;
 }
 textAr.text = "Data uložená v SharedObject:"+casRazitko+newline+"Návštěv:"+i+newline+"IP adresy návštěvníků:"+newline+refStrany;
};

Jak bylo naznačeno, umožníme zápis nového uživatele až po určitém časovém úseku. Ihned, po načtení swf souboru si vyvoláme příslušný SharedObject a porovnáme jej s časovým údajem, který si vytvoříme. Tento časový údaj (cas) obsahuje rok, měsíc, den a hodinu, kdy se vstoupilo na stránku. Zde je prostor pro určení intervalu, ve kterém se bude započítávat další návštěva. Můžeme určit, jestli bude možné započítat stejného návštěvníka v intervalu hodiny, minuty, sekundy.

My budeme stejného návštěvníka počítat v intervalu jedné minuty. Další část kódu je téměř totožná s kódem návštěvní knihy. Pouze se změnilo naformátování dat získaných z php skriptu, tak že pokud se vyskytne více uživatelů jedné IP adresy, vypíšeme uvedenou IP adresu pouze jednou.

K swf a php souboru připojíme ještě prázdný txt soubor „pocitadlo.txt“ a můžeme je všechny nahrát na web.

Výsledek počítání si můžete prohlédnout zde. Zdrojové soubory dnešní ukázky jsou k dispozici zde.

Témata článku: Software, Programování, Echo, Stat, Cookies, Split, Success, Undefined

3 komentáře

Nejnovější komentáře