Navigace

Hlavní menu

 

Jednoduché grafické počítadlo návštěv v PHP

Ačkoli doba největší slávy grafických počitadel návštěvnosti již dávno pominula a současný webdesign spoléhá spíše na počitadla textová (pokud je ze stránek nevynechává zcela), může se vám znalost funkce, vytvářející takového obrázkové počitadlo, občas docela hodit. A právě o tom je tento článek.

Základním předpokladem pro vznik grafického počitadla je existence grafických souborů (samotných číslic), které funkce sloučí do jednoho grafického souboru a ten pak odešle klientovi. Všechny soubory musí mít stejné rozměry (funkce si je sama zjistí), musí být formátu PNG (na jiný typ by se funkce musela trochu upravit) a jejich názvy musí být "0.png", "1.png" a tak dále až k "9.png". Jestliže navíc přidáme do adresáře s číslicemi soubory "LeftSide.png" a "RightSide.png", pak je naše funkce přidá na pravou a levou stranu výsledného obrázku, čímž vytvoří rámeček.

Funkci jsem pojmenoval Number2Img, což plně vystihuje její funkci. Na vstupu je adresář s obrázky číslic (bez koncového lomítka) a číslo. Jestliže se obrázky nachází ve stejném adresáři jako naše funkce, parametr $cesta zadávat nemusíme.

function Number2Img ($cislo,$cesta=""){

   // když se zadá cesta, přidáme koncové lomítko
   $cesta="" ? $cesta="" : $cesta.="/";

   // jména okrajů
   $lside=$cesta."LeftSide.png"; // levý okraj
   $rside=$cesta."RightSide.png"; // pravý okraj

   // podle obrázku na kterém je číslice 1 zjistíme šířku a výšku; tento obrázek musí existovat!
   list($pic_width, $pic_height, $pic_type, $pic_attr) = getimagesize($cesta."1.png"); // tato funkce vrací pole: index 0-šířka,1-výška,2-typ (např.: "image/png") a 3-atribut tagu img (např.:"height=200 width=200")
   $number_width=$pic_width; // šířka jedné číslice
   $Image_Height=$pic_height; // výška jedné číslice=výška celého obrázku

   // jestliže existuje levý okraj, zjistíme si jeho šířku
   if (is_file($lside)){
      list($pic_width, $pic_height, $pic_type, $pic_attr) = getimagesize($lside);
      $lside_width=$pic_width;
   } else {
      $lside_width=0;
   }

   // jestliže existuje pravý okraj, zjistíme si jeho šířku
   if (is_file($rside)){
      list($pic_width, $pic_height, $pic_type, $pic_attr) = getimagesize($rside);
      $rside_width=$pic_width;
   } else {
      $rside_width=0;
   }

   // zjistíme si počet číslic v čísle
   $Digits_Count = strlen($cislo);

   // celková šířka obrázku se vypočte jako součin šířky obrázku a počtu číslic + šířky případných okrajů
   $Image_Width = (($Digits_Count * $number_width) + $lside_width + $rside_width);

   // vytvoříme prázdný obrázek
   $Image = imagecreatetruecolor($Image_Width,$Image_Height);

   // Přidáme levý okraj do obrázku, když existuje
   if (is_file($lside)){
      $image_LeftSide = imagecreatefromPNG($lside);
      imagecopy($Image, $image_LeftSide, 0, 0, 0, 0, $lside_width, $Image_Height);
      imagedestroy($image_LeftSide);
   }

   // Přidáme pravý okraj do obrázku, když existuje
   if (is_file($rside)){
      $image_RightSide = imagecreatefromPNG($rside);
      imagecopy($Image, $image_RightSide, ($Image_Width - $rside_width), 0, 0, 0, $rside_width, $Image_Height);
      imagedestroy($image_RightSide);
   }

   // projdeme všechny číslice v řetězci a vložíme je do výsledného obrázku
   for($pozice=0; $pozice < $Digits_Count; $pozice++) {
      // zjištění právě zpracovávané číslice
      $digit = substr($cislo,$pozice,1);

      // cesta právě zpracovávané číslice
      $digit_name = $cesta. $digit . ".png";

      // zkontrolujeme, zda číslice existuje, když ne, v celkovém obrázku zůstane mezera
      if (is_file($digit_name)) {
         // výpočet pozice právě zpracovávané číslice
         $digit_pozition = (($pozice*$number_width)+$lside_width);

         // přečteme právě zpracovávanou číslici
         $digit_image = imagecreatefromPNG($digit_name);

         // vložíme číslici do celkového obrázku
         imagecopy($Image, $digit_image, $digit_pozition, 0, 0, 0, $number_width, $Image_Height);

         // odstraníme z paměti obrázek právě zpracované číslice
         imagedestroy($digit_image);
      }
   }

   // odešleme hlavičku, která klientovi řekne typ odesílaných dat
   header("Content-Type: image/png");

   // pošleme obrázek klientovy
   imagePNG($Image);

   // nakonec odstraníme obrázek z paměti, aby jsme ji nezahltili
   imagedestroy($Image);

   }

Můžete si vyzkoušet funkční ukázku (zdroj), máte-li zájem. Do textboxu zadejte číslo, vyberte styl a stiskněte "OK". Zobrazí se vám zadané číslo v grafické podobě.

V praxi bychom volali soubor, zpracovávající počitadlo například pomocí <img src="pocitadlo.php">, přičemž do volaného souboru bychom vložili kód, který by vrátil počet návštěv (například z databáze) a získanou hodnotu použil jako parametr "$cislo" funkce Number2Img:

<?
   // nejprve vložíme samotnou funkci
   include ("fce,php");

   // kod, který nastaví proměnnou $pristupy
   .
   .
   .

   // nakonec funkci zavoláme. Bude odeslán obrázek s číslem.
   Number2Img($pristupy)
?>

A úplně na závěr jeden tip. Popisovaná funkce se dá použít i pro převod textu, pokud jí poskytnete příslušné soubory, tedy "A.png", "B.png" a další...

Heller, Petr (20.1. 2004)