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;
}
}
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:
Laravel Blade
http://laravel.com/docs/5.0/templates
PEAR Html Template IT/ITX
https://pear.php.net/package/HTML_Template_IT
Mustache https://mustache.github.io/
Smarty http://www.smarty.net/
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 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
?>
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:
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");
$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ść.
Bardzo treściwy i przydatny blog. Zapraszam na www.informatykwarszawa.com :)
OdpowiedzUsuńsuper blog. zapraszam na www.informatykwarszawa.com :)
OdpowiedzUsuń