Smarty – framework PHP

Logo Smarty Template Engine

Język skryptowy PHP umożliwia tworzenie stron dynamicznych. Można go używać zakorzeniając skrypty PHP w kodzie strony napisanej w HTML. Jednak nie jest to do końca wygodne rozwiązanie.

Po pierwsze niezbędna jest znajomość obydwóch języków programowania: HTML i PHP – a więc trzeba się znać na tworzeniu wyglądu strony jak i back-endu.

Druga kwestia związana jest z sytuacją, gdy nad projektem pracuje więcej osób. I część z nich odpowiedzialna jest za programowanie, a część za wygląd. Jeśli skrypty PHP są poprzeplatane z tagami HTML to te osoby muszą pracować nad tymi samymi plikami – a to już jest problem.

Zazwyczaj w większych projektach osoby odpowiedzialne za nie dzielą się obowiązkami – część z nich pracuje nad warstwą prezentacji danych (wyglądu), a część nad stroną programistyczną (zaplecze). W takich przypadkach programiści starają się pisać skrypty tak, żeby mogła je bez obaw wykorzystać osoba znająca jedynie język HTML. Niestety jest to dość trudne, a błąd w PHP może spowodować wyłożenie się całej strony – rozważmy pewien przykład:

<?php
   $zmienna = "Witaj świecie";
?>
<html>
<body>
<?php
   echo "<div>";
   echo $zmienna;
   echo "</div>";
?>
</body>
</html>

To jest akurat bardzo prosty i przejrzysty przykład. Ale zwróćmy uwagę na kolejny (wykorzystane są tutaj nie wspierane już w PHP7 funkcje mysql_*):

<?php
include "config.php"; // plik konfiguracji połączenia z bazą danych
if(!($db = @mysql_connect(SERWER, UZYTKOWNIK, HASLO))) 
  die("Nie można połączyć się z bazą.");
if(!@mysql_select_db(NAZWA_BAZY, $db)) 
  die("Baza nie istnieje!");
$sql = "SELECT * FROM uzytkownicy";

if(($result = @mysql_query($sql, $db)) == 0){
  echo "\n<hr />Błąd: ".mysql_error()."<br /><br />\n";
  die("Zapytanie ($sql) w pliku $_SERVER[’PHP_SELF’]");
}
$uzytkownik = array();

?>
<table>
  <tr>
    <td><strong>Imie</strong></td>
    <td><strong>Nazwisko</strong></td>
    <td><strong>Email</strong></td>
  </tr>
<?php
while($tmp = mysql_fetch_assoc($result)){
?>
  <tr>
    <td><?php echo $tmp["Imie"];?></td>
    <td><?php echo $tmp["Nazwisko"];?></td>
    <td><?php echo $tmp["Email"];?></td>
    </tr>
  <?php
}
?>

Nadal wygląda OK. Tagi HTML są oddzielone od poleceń PHP.  Na pewno to usprawnia pracę osób odpowiedzialnych za programowanie i za wygląd. Spróbujmy jeszcze bardziej usprawnić ich pracę separując kod PHP i HTML, rozdzielając kod na 2 pliki. Pierwszy z nich to plik1.php:

<?php
include "config.php";  // plik konfiguracji połączenia z bazą danych
if(!($db = @mysql_connect(SERWER, UZYTKOWNIK, HASLO)))
die("Nie można połączyć się z bazą.");
if(!@mysql_select_db(NAZWA_BAZY, $db))
die("Baza nie istnieje!");
$sql = "SELECT * FROM uzytkownicy";

if(($result = @mysql_query($sql, $db)) == 0){
echo "Błąd: ".mysql_error()."<br /><br />";
die("Zapytanie ($sql) w pliku $_SERVER[’PHP_SELF’]");
}
$uzytkownik = array();

while($tmp = mysql_fetch_assoc($result)){
$uzytkownik [] = $tmp;
}
include "views/plik2.tpl.php";
?>

Drugi plik będzie miał nazwę plik2.tpl.php i będzie w katalogu views:

<html>
<head>
<title>Przykład</title>
</head>
<body>
<table>
<tr style="font-weight:bold;">
<td>Imie</td>
<td>Nazwisko</td>
<td>Email</td>
</tr>
<?php
for($i=0; $i<count($uzytkownik); $i++){
?>
<tr>
<td><?php echo $uzytkownik[$i]["Imie"];?></td>
<td><?php echo $uzytkownik[$i]["Nazwisko"];?></td>
<td><?php echo $uzytkownik[$i]["Email"];?></td>
</tr>
<?php
}?>
</table>
</body>
</html>

Na pewno przyznacie, że teraz wygląda to znacznie lepiej. Osoba odpowiedzialna za wygląd strony nie musi nawet zaglądać do pliku z kodem PHP. A tym samym zmniejsza się ryzyko „uszkodzenia” skryptów PHP. Po za tym szablony stron możemy dołączać wiele razy do tego samego lub różnych plików PHP, dzięki czemu nie musimy przepisywać powtarzającego się kodu. Także w łatwy sposób możemy rozdzielić nagłówek i stopki od pozostałej treści, która będzie się zmieniać w zależności od tego na jakiej stronie będzie użytkownik. To rozdzielenie warstwy prezentacji od warstwy programistycznej będzie jeszcze efektywniejsze, gdy użyjemy specjalnego systemu szablonu (framework) o nazwie: SMARTY TEMPLATE ENGINE.

Wykorzystanie Smarty

Poniżej zamieszczam opis jak się do tego zabrać:

Najpierw zainstaluj najnowszą wersję Smarty: http://www.smarty.net/download

Rozpakuj zawartość pobranego katalogu. Do działania strony niezbędne są następujące katalogi, które musisz utworzyć:

  • views – w nim będą przechowywane szablony stron
  • cache – sama nazwa wskazuje do czego służy:) (musi być zapisywalny przez serwer)
  • tmp – katalog z tymczasowymi, automatycznie zapisanymi szablonami (musi być zapisywalny przez serwer)
  • configs – pliki konfiguracyjne

Oczywiście katalogi możesz dowolnie nazwać, ważne żebyś odpowiednio skonfigurował ich nazwy w Smarty.

W katalogu libs powinna się znajdować pobrana biblioteka Smarty.

W katalogu configs umieść plik config.php z zawartością:

<?php
//konfiguracja bazy danych
define ("SERWER","localhost");
define ("UZYTKOWNIK","root");
define ("HASLO","");
define ("NAZWA_BAZY","test");
//SMARTY
require_once("smarty/libs/Smarty.class.php");
$smarty = new Smarty;
$smarty->template_dir = "views"; // katalog z szablonami
$smarty->compile_dir = "tmp"; // katalog z tymczasowymi szablonami
$smarty->cache_dir = 'cache'; // katalog do cache
?>

To teraz zmodyfikujmy ostatni przykład, aby był kompatybilny ze Smarty:

<?php
include "configs/config.php";
if(!($db = @mysql_connect(SERWER, UZYTKOWNIK, HASLO))) //połączenie z bazą
die("Nie można połączyć się bazą.");
if(!@mysql_select_db(NAZWA_BAZY, $db)) //wybierz bazę
die("Baza nie istnieje!");
$sql = "SELECT * FROM uzytkownicy";

if(($result = @mysql_query($sql, $db)) == 0){
echo "Błąd: ".mysql_error()."<br /><br />\n";
die("Zapytanie $sql było w pliku $_SERVER[’PHP_SELF’]");
}
$uzytkownik = array();

while($tmp = mysql_fetch_assoc($result)){
$uzytkownik [] = $tmp;
}
$smarty->assign("title", "Przykład zastosowania Smarty");
$smarty->assign("uzytkownik", $uzytkownik);
$smarty->display("plik2.tpl.htm");
?>

Zasadniczą różnicą są 3 ostatnie linijki kodu. Przypisują one do zmiennych, które będą rozpoznawalne w szablonach, zmienne lub tablice PHP albo po prostu ciągi znaków.

Plik plik2.tpl.htm powinien być umieszczony w katalogu views i wyglądać tak:

{include file="header.tpl.htm"}
<table>
<tr style="font-weight:bold;">
<td>Nr</td>
<td>Imię</td>
<td>Nazwisko</td>
<td>Email</td>
</tr>
{section name=c loop=$uzytkownik}
<tr>
<td>{$smarty.section.c.iteration}</td>
<td>{$uzytkownik[c].Imie}</td>
<td>{$uzytkownik[c].Nazwisko}</td>
<td>{$uzytkownik[c].Email}</td>
</tr>
{/section}
</table>
{include file="footer.tpl.htm"}

W pierwszej linii dołączany jest nagłówek z pliku header.tpl.htm, a w ostatniej stopka z pliku footer.tpl.htm

Plik header.tpl.htm powinień wyglądać tak:

<html>
<head>
<title>{$title}</title>
</head>
<body>

A plik footer.tpl.htm tak:

</body>
</html>

W pliku plik2.tpl.htm na pewno zauważyliście taką pętlę:

{section name=c loop=$uzytkownik}
<tr>
<td>{$smarty.section.c.iteration}</td>
<td>{$uzytkownik[c].Imie}</td>
<td>{$uzytkownik[c].Nazwisko}</td>
<td>{$uzytkownik[c].Email}</td>
</tr>
{/section}

Tag {section} zajmuje się wykonaniem pętli po tablicy z danymi pobranymi z bazy danych i przekazanych do szablonu. Musi być zamknięty tagiem {/section}. Element {section} potrzebuje dwa atrybuty: name i loop. Atrybut name jest nazwą sekcji, a atrybut loop jest wartością wskazującą ile razy ma wykonać się pętla – tutaj tyle razy ile jest elementów tablicy $uzytkownik. {section} posiada jeszcze inne dodatkowe atrybuty takie jak: start (jaki ma być element początkowy), step (jaki krok, domyślnie 1), max (ile razy maksymalnie ma być wywoływana pętla).

Artykuł ten pokazał jedynie podstawowy opis możliwości i zastosowania technologii Smarty. Zachęcam do zapoznania się z jego dokumentacją i wykorzystywania go w swoich projektach!

System Smarty został wykorzystany w kilku moich skryptach np w Festa, Holmes, Notice.

Nowsze skrypty oparte są o system szablonów Twig2.

Ta strona używa ciasteczek (cookies), dzięki którym nasz serwis może działać lepiej. Więcej informacji

The cookie settings on this website are set to "allow cookies" to give you the best browsing experience possible. If you continue to use this website without changing your cookie settings or you click "Accept" below then you are consenting to this.

Close