Pamiątka z wakacji

Niektóre programy graficzne oferują opcję generowania galerii zdjęć w postaci stron WWW. Takie aplikacje mają jednak pewne wady. Podstawową jest to, że dodanie nowego obrazka lub jakakolwiek inna modyfikacja oznacza konieczność robienia galerii od nowa. Poza tym najczęściej nie mamy możliwości skatalogowania grafik, dodania opisów oraz dostosowania wyglądu strony do własnych upodobań.

My utworzymy galerię w sposób dynamiczny. Skrypt PHP, który napiszemy, sam odnajdzie wszystkie zdjęcia znajdujące się na serwerze i przedstawi je na stronach WWW. Będziemy mieli też możliwość dodawania i usuwania fotografii, wprowadzania podpisów itp.

Pierwsze kroki

Pracę powinniśmy rozpocząć od przygotowania odpowiednich materiałów. Nasze zdjęcia musimy przeskalować, aby były dostępne w dwóch wersjach – małej i dużej. Do przeskalowania użyjemy programów takich jak IrfanView czy ACDSee. Proponuję zmianę maksymalnych rozmiarów fotografii do 150 pikseli (dla miniaturek) i 800 pikseli (dla dużych obrazków). Daje to dobry efekt przy rozdzielczości ekranu 1024×768.

Wszystkie zdjęcia umieścimy na serwerze w odpowiednich podkatalogach folderu ./fotki. Pozwoli nam to podzielić je tematycznie. Przykładowo: zdjęcia z Turcji znajdą się w katalogach ./fotki/Turcja/duze/ i

./fotki/Turcja/male/

. Dodatkowo pojawi się tam jeszcze katalog o nazwie ./fotki/Turcja/podpisy/, w którym zamieścimy opisy zdjęć. Pierwsza linijka tekstu w każdym podpisie będzie zawierała tytuł zdjęcia, a pozostałe – jego dokładny opis.

Tworząc program, również wprowadzimy pewną hierarchię. W głównym katalogu znajdą się jedynie skrypty zawierające znaną nam już dobrze funkcję require(). Kod w postaci klas zapiszemy w skryptach znajdujących się w podkatalogu o nazwie ./skrypty. Główną część programu umieścimy wewnątrz klasy o nazwie Main, znajdującej się w pliku Main.php. Jej konstruktor zainicjuje zmienne, a następnie wywoła odpowiednią funkcję zgodnie z poleceniem otrzymanym z formularza lub paska adresu. Obecnie będzie reagował jedynie na polecenie

view

– pokaże wtedy stronę:

function Main() {
$this->sciezka=”./fotki/”;
$this->cols=4;
$this->rows=3;
$this->alert=”;
if ($_GET[‘co’]==’view’) {
$this->pokazStrone($_GET[‘dir’],
$_GET[‘str’]);
}
else {
$this->pokazStrone(”,”);
}
}

W pierwszej wersji funkcja pokazStrone() będzie bardzo krótka. Wyświetli ona jedynie stronę zawierającą menu boczne:

function pokazStrone($dir, $str) {
$this->goraStrony();
$this->pokazMenu();
?>
<div id=”content”>
</div>
<?php
$this->dolStrony();
}

Teraz uzupełnimy funkcję treścią, czyli odpowiednią tabelką, w której pojawią się miniaturki zdjęć. Parametry $dir oraz $str oznaczają odpowiednio: nazwę wybranego katalogu z obrazkami oraz numer podstrony z miniaturkami. Funkcje goraStrony() i

dolStrony()

zawierają cały kod HTML z wyjątkiem sekcji

BODY

:

function goraStrony() {
?>
<!DOCTYPE HTML PUBLIC “-//W3C//DTD
HTML 4.01 Transitional//EN”>
<html>
<head>
<meta http-equiv=”content-type”
content=”text/html;
charset=iso-8859-2″ >
<title>Galeria zdjęć</title>
<link href=”styl.css” type=text/css rel=stylesheet>
</head>
<body>
<?php
}
function dolStrony() {
?>
</body>
</html>
<?php
}

Czytaj, załóż, usuń

Zanim stworzymy funkcję pokazMenu(), będziemy musieli poradzić sobie z odczytem zawartości katalogu ./fotki/. Nazwy jego poszczególnych podfolderów znajdą się następnie w menu bocznym.

Do sprawdzania zawartości katalogu służy w języku PHP klasa dir. Jej metoda read() zwraca nazwy kolejnych plików i podkatalogów zawartych w odczytywanym folderze. Funkcję zastosujemy wewnątrz klasy DirList, która po odczycie odpowiednio przetworzy nazwy plików i katalogów:

class DirList {
var $pliki;
var $katalogi;
var $sciezka;
function DirList($sciezka) {
$this->sciezka=$sciezka;
$d = dir($sciezka);
while($entry=$d->read()) {
if (!ereg(“^\.*$”, $entry)) {
if (is_dir($sciezka.”/”.$entry)) {
this->katalogi[]=$entry;}
else {
$this->pliki[]=$entry;
}
}
}
$d->close();
if (count($this->katalogi)>1) sort($this->katalogi);
if (count($this->pliki)>1) sort($this->pliki);
}
function pliki() {
return $this->pliki;
}
function katalogi() {
return $this->katalogi;
}
}

Aby pominąć nazwy składające się z samych kropek, posłużyliśmy się wewnątrz konstruktora wyrażeniem regularnym

^\.*$

Jego znaczenie wyjaśnione jest w ramce obok.

Odczytane nazwy rozdzielamy następnie do dwóch tablic:

$katalogi

i $pliki. Pomoże nam w tym funkcja is_dir(). Na koniec dzięki funkcji sort() obie tablice zostają alfabetycznie posortowane.

W porządnie napisanym programie obiektowym do pól znajdujących się wewnątrz klasy powinny odwoływać się jedynie jej własne metody. Dlatego klasa DirList zawiera metody pliki() i

katalogi()

, służące do odczytu obydwu tablic.

Mając przygotowaną klasę DirList, możemy ją zastosować do wyświetlenia menu na ekranie:

function pokazMenu() {
$dirList=new DirList($this->
sciezka);
?>
<div id=”menu”>
<?php
$katalogi=$dirList->katalogi();
for ($i=0; $i<count($katalogi); $i++) {
echo ‘<a href=”main.php?
co=view&dir=’.$katalogi[$i].
‘”>’.$katalogi[$i].
“</a><br > “;}
?>
</div>
<?php
}

Oczywiście chcemy mieć możliwość zakładania i modyfikowania zawartości katalogów. W klasie Main musimy zatem umieścić odpowiednie metody związane z obsługą folderów. Przy ich tworzeniu lub zmianie nazwy obowiązkowo powinniśmy zweryfikować wprowadzoną nazwę katalogu. Zrobi to za nas funkcja dirNameOk(), która za pomocą wyrażenia regularnego sprawdzi, czy nazwa nie zawiera jednego z niedozwolonych znaków:

function dirNameOk($s) {
$wynik=true;
if (ereg(‘[ąćęłńóśżźĄĆĘŁŃÓŚŻŹ
\\/:\*\?\”<>\|]’,$s))
$wynik=false;
return $wynik;
}

Więcej:bezcatnews