Oddzielenie warstwy prezentacyjnej html od kodu skryptu
Opublikowano: 2009-07-28 , wyświetlono: 4188
Perl jest językiem, który stworzony został do operacji na tekstach czego pochodną jest łatwe generowanie stron w html. Elementy składni języka i bogactwo dodatkowych bibliotek sprzyja osadzaniu kodu html wewnątrz kodu skryptu. Rozwiązanie takie jednak posiada pewne wady. Pierwszą jest konieczność ingerencji osoby odpowiedzialnej za projektowanie stron serwisu w kod skryptu w wypadku najmniejszych nawet zmian jego wyglądzie. Wymaga to przynajmniej minimalnej znajomości Perl'a, a przy większych aplikacjach staje się to już bardziej kłopotliwe. Również dostosowanie tego samego skryptu dla różnych serwisów wymaga tworzenia wielu jego wersji.
Istnieją profesjonalne biblioteki Perl'owe dostarczające rozwiązania tego problemu. Zaczynając pisać pierwsze aplikacje web'owe w Perl'u szybko zetknąłem się z opisanymi wyżej kłopotami. Efektem rozwiązywania tego problemu była prosta procedura pozwalająca na wczytanie zewnętrznego pliku html i zastąpienie zdefiniowanyc zmiennych wartościami ze skryptu. Metoda okazała się na tyle skuteczna, że z powodzeniem stosuję ją do dzisiaj.
Istnieją profesjonalne biblioteki Perl'owe dostarczające rozwiązania tego problemu. Zaczynając pisać pierwsze aplikacje web'owe w Perl'u szybko zetknąłem się z opisanymi wyżej kłopotami. Efektem rozwiązywania tego problemu była prosta procedura pozwalająca na wczytanie zewnętrznego pliku html i zastąpienie zdefiniowanyc zmiennych wartościami ze skryptu. Metoda okazała się na tyle skuteczna, że z powodzeniem stosuję ją do dzisiaj.
my %zmienne;
$zmienne{"imie"} = "Jan";
$zmienne{"nazwisko"} = "Kowalski";
HtmlParse("osoba.htm", %zmienne);
Plik osoba.htm powinien zawierać zmienne, które zastąpione zostaną przypisanymi wartościami. Jako format nazywania zmiennych ja przyjąłem $zmienne$. W związku z tym w pliku osoba.htm można odwołać się do wartości zmiennych przez wstawienie linii poniżej.
Szukana osoba to: $imie$ $nazwisko$
Jest już określony cel i sposób w jaki działać ma procedura. Pozostaje tylko napisanie kodu realizującego to zadanie. Poniżej tekst procedury wraz ze szczegółowymi komentarzami.
# tu rozpoczyna sie definicja procedury
sub HtmlParse
{
my $fname = shift; # pobranie nazwy pliku
my %param = @_; # pobranie hasza ze zmiennymi i wartosciami
my $var; # deklaracja zmiennej pomocniczej
# otwarcie pliku z szablonem html
open(IN, $fname)
|| return -1;
# petla czytajaca plik linia, po linii
while ($line = <IN>)
{
# dla danej linii tekstu wyszukiwanie zmiennych
while (($tag, $value) = each %param)
{
# jezeli znaleziono zmienna, to zastopienie jej odpowiadajacym ja tekstem
# to gdy ktos lubi nazwe zmiennych w formacie $nazwa$
$var = '\$' . $tag . '\$';
# zawsze mozna zmienic np. na %nazwa%
# $var = '\%' . $tag . '\%';
$line =~ s/$var/$value/g; # realizacja zamian
}
print $line; # wyswietlanie linii na standardowym wyjsciu
}
# zamkniecie pliku
close(IN);
return 0;
}
Jak widać realizacja zadania okazała się bardzo prosta. Dla pokazania bardziej złożonego zastosowania tego sposobu realizacji aplikacji web'owych przedstawię przykład wyświetlania zawartości tabeli z danymi z bazy MySql.
Wymagać on będzie przygotowania 3 plików html. Pierwszsy będzie zawierał nagłówek tabeli, drugi definicję pojedynczego wierszy i trzeci kod zakończenia tabeli. To już pokazuje, żę stronę docelową można wygenerować niekoniecznie opierając się na jednym pliku szablonu. A teraz przykład.
Na początek trzeba odczytać dane z bazy MySql.
Wymagać on będzie przygotowania 3 plików html. Pierwszsy będzie zawierał nagłówek tabeli, drugi definicję pojedynczego wierszy i trzeci kod zakończenia tabeli. To już pokazuje, żę stronę docelową można wygenerować niekoniecznie opierając się na jednym pliku szablonu. A teraz przykład.
Na początek trzeba odczytać dane z bazy MySql.
# zdefiniowanie fizycznej lokalizacji plikow z szablonami html
# jako zmiennej publicznej
$::TplPath = "/home/test/templates/";
# polaczenie z baza test jako uzytkownik 'user' z haslem 'pass'
my $conn = DBI->connect("DBI:mysql:test", "user", "pass")
|| die "Blad: cos nie tak z baza danych";
# wykonanie zapytań
my $rs = $conn->prepare("SELECT * FROM contact")
|| die "Blad: przygotowanie zapytania";
my $stat = $rs->execute
|| die "Blad: wykonanie zapytania";
Teraz powinno nastąpić wyświetlenie nagłowka tabelki html'a, który opisuje wyświetlane kolumny. Znajduje się on w pliku /home/test/templates/list_head.htm.
# zdefiniowanie zmiennej do przekazywania dancyh
my %parse;
# wyswietlenie naglowka z p
HtmlParse($::TplPath . "list_head.htm", %parse);
Następnym krokiem jest wyświetlanie danych z wierszy tabeli bazodanowej jako wierszy tabeli html. Do tego zostaje użyta pętla oraz szablon wiersza tabeli, który zawiera odpowiednie zmienne
# petla po wierszach tabeli mysql
while ($row = $rs->fetchrow_hashref)
{
# przypisywanie elementow do zmiennych zawartych w szablonach
$parse{"name"} = $row->{name};
$parse{"address"} = $row->{address};
$parse{"zip"} = $row->{zip};
$parse{"city"} = $row->{city};
$parse{"phone"} = $row->{phone1};
$parse{"email"} = $row->{email};
# wyswietlenie wiersza html
HtmlParse($::TplPath . "list_line.htm", %parse);
}
Ostatni element to zakończenie tabeli
# stopka
HtmlFromFile($::TplPath . "list_foot.htm");
$rs->finish;
Poniżej szablon list_line.htm, by pokazać jak korzystać ze zmiennych w kodzie html.
<tr><td> $name$ </td><td> $address$ </td><td> $zip$ </td>
<td> $city$ </td><td> $email$ </td></tr>
Przedstawiony tu sposób podejścia do pisania skryptów realizuje jeden z elementów architektury 3-warstwowej. Przy okazji stworzona została niezależnośc projektującego wygląd stron html od programisty i odwrotnie.
Data: 10-03-2001
Data: 10-03-2001