Fotoalbum v PHP – zobrazení fotografií

15. července 2002

Do fotoalba již můžeme vkládat kolekce fotografií a uživatel může listovat seznamem všech kolekcí. Dnes se tedy podíváme na jednu ze základních funkcí fotoalba, zobrazení konkrétních fotografií vybrané kolekce.

Zobrazení fotografií

Zobrazování skupiny fotografií nám bude zajišťovat skript show.php, kterému bude vždy na vstup předán parametr $kolekce udávající, jaká kolekce se má zobrazit. Než začneme zobrazovat vlastní fotky, musíme z databáze zjistit základní údaje o kolekci. Kromě názvu nás bude zajímat, jestli se mají fotografie zobrazovat po skupinách (určitého počtu) nebo všechny naráz, jejich celkový počet, rok i doba. Údaje získáme jednoduše pomocí následujícího příkazu select:

select NAZEV, ROK, DOBA, CAST, POCET from KOLEKCE where ID = $kolekce

Podle hodnoty atributu CAST se skript rozdělí na dvě části. První část obslouží případ, kdy se fotografie zobrazují všechny najednou, druhá se stará o zobrazování fotografií po částech, včetně správného vygenerování odkazů „Další“ a „Předchozí„, aby šlo mezi jednotlivými skupinami fotek snadno přecházet.

Struktura skriptu show.php

Podobně jako v předchozím díle opět uvedu hrubou kostru skriptu, jednotlivé části očísluji a pak se k nim budu postupně vracet a vysvětlovat je.

<HTML>
<HEAD>
<TITLE>Zobrazení kolekce</TITLE>
</HEAD>
<BODY>
<h1>Fotoalbum 1.0 – Zobrazení kolekce</H1>
<HR SIZE=1 NOSHADE>
<?
 /* (1) zjisteni zakladni udaju o kolekci z databaze */
 if ($cast == -1) { /* fotografie se maji zobrazit vsechny naraz */
    /* (2) Zobrazeni vsech fotografii */
 }
 if ($cast > 0) { /* fotografie se maji zobrazovat po castech */
    /* (3) Zobrazeni fotografii po castech */
 }
?>
</BODY>
</HTML>

Zjištění základních údajů o kolekci (1)

 $result = mysql(„album“, „select NAZEV, ROK, DOBA, CAST, POCET from KOLEKCE where ID = $kolekce“);
 $ch = mysql_errno();
 
 if (!$ch) { 
    $nazev = mysql_result($result, 0, „NAZEV“);
    $rok = mysql_result($result, 0, „ROK“);
    $doba = mysql_result($result, 0, „DOBA“);
    $cast = mysql_result($result, 0, „CAST“);
    $pocet = mysql_result($result, 0, „POCET“);
    print „<B>Kolekce: $nazev ($rok)</B><br>“;
    print „$doba<br><BR>“;
 }
 else {
    print „<font color=red>Při přístupu k databázi došlo k chybě!</font><br>“;
 }

Zde zjistíme základní informace o kolekci, uložíme si je postupně do proměnných. Vypíšeme název kolekce, rok a dobu trvání. Pokud při čtení došlo k chybě, bude o tom vypsána chybová hláška.

Zobrazení všech fotografií (2)

  $nar = 0;
  print „<CENTER>“;
  print „<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=3><TR>“;
  
  $result = mysql(„album“, „select POPIS, THUMB, PHOTO, DATUM from FOTKA where KOLEKCE_ID = $kolekce order by ID“);
  $p = mysql_num_rows($result);
  for ($i = 0; $i < $p; $i++) {
     $popis = mysql_result($result, $i, „POPIS“);
     $thumb = mysql_result($result, $i, „THUMB“);
     $photo = mysql_result($result, $i, „PHOTO“);
     $datum = mysql_result($result, $i, „DATUM“);
     print „<TD ALIGN=center><A HREF=\“photos/$photo\“ target=\“_blank\“><IMG SRC=\“photos/$thumb\“ BORDER=0 ALT=\“$popis ($datum)\“></A></TD>“;    ++$nar;
     if ($nar % 3 == 0) { print „</TR><TR>“; }
  }
  print „</TR></TABLE>“;
  print „<HR SIZE=1 NOSHADE><CENTER>Zpět na nabídku <A HREF=\“index.php\“>všech alb</A></center>“;

Pro danou kolekci zjistíme všechny fotografie, které do ní patří. Potom v cyklu for zajistíme zobrazení klikatelného odkazu na velkou fotografii. Odkazem je thumbnail. Thumbnaily se zobrazují do tabulky (s neviditelným rámečkem), vždy tři buňky na řádek. Po vytištění každé třetí buňky se vloží nový řádek tabulky. To nám zajišťuje proměnná $nar. Kdykoli je dělitelná třemi (tedy $nar modulo 3 je 0), vloží se kód </TR><TR>.

Zobrazení fotografií po částech (3)

  $nar = 0;
  print „<CENTER>“;
  print „<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=3><TR>“;
  
  $result = mysql(„album“, „select POPIS, THUMB, PHOTO, DATUM from FOTKA where KOLEKCE_ID = $kolekce order by ID“);
  $p = mysql_num_rows($result);
  if (!$start) { $start = 1-1; }
  for ($i = $start; $i < $start+$cast && $i < $pocet; $i++) {
     $popis = mysql_result($result, $i, „POPIS“);
     $thumb = mysql_result($result, $i, „THUMB“);
     $photo = mysql_result($result, $i, „PHOTO“);
     $datum = mysql_result($result, $i, „DATUM“);
     print „<TD ALIGN=center><A HREF=\“photos/$photo\“ target=\“_blank\“><IMG SRC=\“photos/$thumb\“ BORDER=0 ALT=\“$popis ($datum)\“></A></TD>“;    ++$nar;
     if ($nar % 3 == 0) { print „</TR><TR>“; }
  }
  print „</TR></TABLE>“;
  print „<HR SIZE=1 NOSHADE>“;
  $start += $cast;
  $predch = $start – 2*$cast;
  if ($predch >= 0) {
     print „<A HREF=\“show.php?kolekce=$kolekce&start=$predch\“>< Předchozí</A>“;
  }
  if ($start < $pocet) {
     print „&nbsp;&nbsp;<A HREF=\“show.php?kolekce=$kolekce&start=$start\“>Další ></A>“;
  }
  print „&nbsp;&nbsp;<A HREF=\“index.php\“>Hlavní nabídka</A>“;
  print „</center>“;

Uvedený kód je velmi podobný kódu v části (2) s tím rozdílem, že cyklus for, který nám zajišťuje zobrazení fotek, nemá řídící proměnnou $i iniciovanou na 0 (zobrazovalo by se od první fotky), ale má ji nastavenou na proměnnou $start, která se předává jako parametr. V parametru $cast (který zjistíme z databáze) máme uložen počet, po kolika se mají fotky na stránce zobrazovat. Jednoduchou sčítací nebo odčítací operací na proměnné $start zajistíme vygenerování korektního odkazu na zobrazení následující i předchozí části fotek. Kód samozřejmě hlídá, abychom se s proměnnou $start nedostali mimo základní rozsah 1 až celkový počet fotek v kolekci (všimněte si, že ukončovací podmínka cyklu for je složena ze dvou: $i < $start+$cast && $i < $pocet;).

Celý skript si můžete stáhnout. Nakopírujte si ho do hlavního adresáře \Album, v němž máte již skript index.php. To je pro dnešek vše, příště se podíváme na jednoduché vyhledávání nad fotografiemi.

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

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

Další článek NERA-Brno.cz
Štítky: Články

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 *