« powrót

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.


#  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


Komentarze: