sobota, 5 września 2015

PHP: systemy szablonów HTML

PHP i HTML w jednym pliku


Język programowania php jest głównie stosowany w aplikacjach web jako mechanizm wykonujący zaprogramowane działania po stronie serwera. Za wizualizację wyników takowych działań odpowiedzialny jest zaś przeważnie sam kod HTML, który jest odpowiednio interpretowany po stronie przeglądarki. Programiści php mają swobodę wyboru kilku odmiennych metod generowania tagów HTML i ewentualnej dodatkowej treści, która ma być wyświetlana użytkownikom.

Tagi HTML mogą być generowane za pomocą samego php wraz z ewentualną dodatkową treścią:

<?php
class Kontrahent {
    public $name;
    public $country;

    public function __construct($name, $country) {
        $this->name = $name;
        $this->country = $country;
  }
}
$adam = new Kontrahent('Adam','Polska');
print "<div><b>Imię:</b> {$adam->name}</div><div><b>Kraj:</b> {$adam->country}</div>";
?>

Można w skryptach php również stosować bezpośrednio tagi HTML, a pomiędzy nimi umieszczać kod php:

<html>
  <head></head>
  <body>
   <div><b>Imię:</b> <?php echo $adam->name?></div>
   <div><b>Kraj:</b> <?php echo $adam->country?></div>
  </body>
</html>

W obu przedstawionych powyżej podejściach, odpowiedzialny za funkcjonalność aplikacji kod php koegzystuje w jednym pliku z tagami HTML, które odpowiadają za wyświetlanie treści. W złożonych skryptach php jest to rozwiązanie na tyle niewygodne, iż sprawia ono, że długoterminowe utrzymywanie takich skryptów pod kątem wdrażania ewentualnych zmian, zarówno do kodu php jak i tagów HTML, staje się dosyć uciążliwe. Podobnie, w przypadku konieczności zlokalizowania ewentualnych błędów, praca staje się trudna.

Szablony HTML


W nowoczesnych projektach systemów aplikacji web, wyraźne oddzielenie warstwy aplikacji od warstwy prezentacji liczy coraz to większe grona zwolenników. Szablony HTML to rozwiązanie, które umożliwia zupełne oddzielenie kodu php od tagów HTML i dodatkowej statycznej treści, która ma być wyświetlana użytkownikom aplikacji web. Generalnie rzecz ujmując tagi HTML oraz ewentualna dodatkowa treść statyczna - warstwa prezentacji - , przechowywane są w samym pliku .html, natomiast skrypt php - warstwa aplikacji - znajduje się w pliku .php.

Pro i kontra systemów szablonów HTML dla php


Odnośnie stosowania szablonów HTML dla kodu php programiści aplikacji web dzielą się na zwolenników szablonów oraz tych, którzy szablonów za żadną cenę nigdy by nie użyli we własnych projektach. Debata na temat zalet i wad szablonów HTML w rozwiązaniach web bazujących na języku php jest praktycznie tak stara, jak sam język php. Zwolennicy stosowania szablonów HTML przytaczają wiele solidnych argumentów na korzyść takiego podejścia. Odizolowanie kodu php od tagów HTML rzeczywiście idzie naprzeciw dużej przejrzystości kodu i łatwości utrzymywania złożonych systemów. W aplikacjach web, w których kod php jest zupełnie odizolowany od tagów HTML generalnie jest nie tylko o wiele łatwiej wprowadzać jakiekolwiek zmiany do kodu php, lecz także wprowadzanie zmian do kodu HTML staje się o wiele prostsze. Jakimi zatem argumentami bronią się przeciwnicy szablonów? Otóż jedynym ich argumentem jest fakt, iż stosowanie szablonów HTML może znacznie spowolnić działanie aplikacji php. Ten argument można jednak łatwo podważyć, bo jak się okazuje, wiele odmiennych czynników może mieć wpływ na szybkość działania danej aplikacji php, a w wielu przypadkach rozwiązania php bazujące na szablonach HTML okazują się działać lepiej i szybciej niż podobne systemy, w których zupełnie zrezygnowano z szablonów.

Systemy szablonowe


Aby używać szablonów HTML z poziomu skryptów php można skorzystać z któregoś z wielu powszechnie dostępnych systemów szablonowych, bądź napisać od zera własny system szablonowy. Tą drugą opcję, w świetle bogatego wyboru darmowego oprogramowania tworzonego przez naprawdę zaangażowane społeczności programistów, zostawiłbym jednak prawdziwym pasjonatom tworzenia systemów szablonowych, a nie programistom poszukującym takowego systemu dla własnych projektów. Tak czy inaczej, wachlarz powszechnie dostępnych systemów szablonowych jest dziś bardzo szeroki.

Oto krótka lista najpopularniejszych na dzień dzisiejszy systemów szablonowych dla php:


Każdy z powyższych systemów szablonów ma swoje zalety i wady, które często zależą od charakterystyki projektu w jakim dany system jest stosowany.

System szablonów HTML PEAR


Aby zaprezentować funkcjonalność systemu szablonów HTML dla skryptów php posłużę się przykładem systemu szablonów z repozytorium PEAR - PHP Extension and Application Repository, który miałem okazję dokładnie przetestować stosując go w kilku dużych projektach systemów aplikacji web. Ten system szablonów dla PHP jest powszechnie używany przez programistów aplikacji web od ponad 10 lat i zyskał sławę sprawdzonego i stabilnego rozwiązania, choć nie  oferuje on ponadprzeciętnych możliwości. System może być stosowany zarówno z plikami HTML jak i XML.

PEAR System szablonów HTML
PEAR HTML_Temaplate_IT

HTML_Template_IT to w sumie bardzo przyjazne programistom rozwiązanie swojej klasy, które pozwala na wyraźne oddzielenie warstwy prezentacyjnej danej aplikacji od warstwy zawierającej kod php. Działanie systemu opiera się na obecności bloków i wypełniaczy w kodzie HTML. Wypełniacze umożliwiają ich zastępowanie wartościami ze skryptu php. System stosuje hierarchię bloków, która określa sposób prezentacji treści w przeglądarce. HTML_Template_IT świetnie się sprawuje, choć jego funkcjonalność można określić jako podstawową. Bardziej wymagający programiści mogą skorzystać z pokrewnego systemu HTML_Template_ITX, który umożliwia dynamiczne generowanie bloków, a także stosowanie swego rodzaju wywołań zwrotnych.

Aby rozpocząć należy zainstalować managera pakietów PEAR. Sposób w jaki należy to zrobić zależy od stosowanego systemu operacyjnego. W niniejszym artykule opiszę procedurę instalacji managera pakietów oraz samych pakietów PEAR w środowisku Scientific Linux 7.

Instalacja managera pakietów PEAR rozpoczyna się po wydaniu polecenia:

[root@sphera2 ~]# yum install pear-php

Po udanej instalacji managera pakietów PEAR należy zainstalować pakiet HTML_Template_IT w następujący sposób:

[root@sphera2 ~]# pear install HTML_Template_IT
downloading HTML_Template_IT-1.3.0.tgz ...
Starting to download HTML_Template_IT-1.3.0.tgz (23,309 bytes)
........done: 23,309 bytes
install ok: channel://pear.php.net/HTML_Template_IT-1.3.0

Po udanej instalacji można rozpocząć stosowanie szablonów w skryptach php.

Utworzymy więc prosty szablon HTML dla zaprezentowania szablonowej wersji naszego uproszczonego przykładowego skryptu php. Należy zauważyć, że ciało bloków zawierających znaczniki zmiennych, które skrypt php ma za zadanie wypełnić wartościami zmiennych, zamknięte jest w znacznikach <!-- BEGIN NAZWA_BLOKU --> i <!-- END NAZWA_BLOKU -->. W pojedynczym pliku HTML takich bloków można oczywiście zdefiniować ilość większą niż jeden.

A oto nasz przykładowy szablon:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">

<html>
  <head>
   <title>Przykładowy szablon HTML</title>
   <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
  </head>
  <body>
   <!-- BEGIN KONTRAHENT -->
   <div>Imię: {IMIE}</div>
   <div>Kraj: {KRAJ}</div>
   <!-- END KONTRAHENT -->
  </body>
</html>

Zakładając, że szablon – względem ścieżki naszego skryptu - zapisujemy jako templates/kontrahenci.html, nasz przykładowy skrypt php powinien teraz wyglądać następująco:

<?php
class Kontrahent {
    public $name;
    public $country;

    public function __construct($name, $country) {
        $this->name = $name;
        $this->country = $country;
  }
}

// PEAR HTML_template_IT
require_once("/usr/share/pear/HTML/Template/IT.php");
$kontrahenci = new HTML_template_IT("templates");
$kontrahenci->loadTemplatefile("kontrahenci.html",true,true);

$adam = new Kontrahent('Adam','Polska');

$kontrahenci->setCurrentBlock('KONTRAHENT'); // Ustawiamy bieżący blok
$kontrahenci->setVariable('IMIE',$adam->name); // Ustawiamy wartość zmiennej IMIE
$kontrahenci->setVariable('KRAJ',$adam->country); // Ustawiamy wartość zmiennej KRAJ
$kontrahenci->parseCurrentBlock(); // Parsowanie bieżącego bloku
$kontrahenci->show(); // Wyświetlanie treści
?>

W efekcie działania skryptu otrzymujemy:

Imię: Adam
Kraj: Polska
Załóżmy teraz, że dane kontrahentów mają być pobierane z tabeli bazy danych. Pobrane w ten sposób dane kilku kontrahentów mają być wyświetlone użytkownikowi aplikacji web. W takiej sytuacji nasz szablon HTML może jak najbardziej pozostać bez zmian, a jedyne co należałoby zmienić to skrypt php, w którym należałoby dodać odpowiednie mechanizmy połączenia z bazą danych, odczytu danych z tabeli, utworzenia obiektów oraz ustawienia wartości w wypełniaczach w szablonie. Po każdorazowej podmianie wypełniaczy danymi dotyczącymi danego wiersza tabeli bazy danych należałoby parsować blok za pomocą metody HTML_Template_IT::parseCurrentBlock().

W przypadku konieczności dostępu do szerszej gamy metod, warto korzystać z klasy HTML_Template_ITX, a można do zrobić zmieniając 2 linijki powyższego przykładowego skryptu:

require_once("/usr/share/pear/HTML/Template/ITX.php");
$kontrahenci = new HTML_template_ITX("templates");

Czy warto stosować szablony w aplikacjach php? Generalnie jest tak, iż warto je stosować w każdej rozbudowanej aplikacji web, bądź w systemach, które mają być utrzymywane i rozwijane długoterminowo. W krótkich i prostych skryptach web, których dalszego rozwoju nie przewidujemy, nie ma sensu stosować szablonów, bowiem w takich przypadkach dodatkowy nakład pracy, z jakim wiąże się praca z systemami szablonów, nigdy się nie przełoży na naszą korzyść.

2 komentarze:

  1. Bardzo treściwy i przydatny blog. Zapraszam na www.informatykwarszawa.com :)

    OdpowiedzUsuń
  2. super blog. zapraszam na www.informatykwarszawa.com :)

    OdpowiedzUsuń