Smarty – to obiektowy framework pozwalający tworzyć szablony dla stron pisanych w języku PHP. Umożliwia oddzielenie warstwy logiki (skryptów PHP) od warstwy prezentacji (szablonów HTML). Wbudowany system cache Smarty znacznie przyspiesza działanie serwisu. Buforowanie zawartości odciąża serwer i umożliwia obsłużenie większego ruchu w przypadku dużych i złożonych projektów. Pakiet Smarty jest dostępny na licencji Open Source (GNU GPL). Można go pobrać z oficjalnej strony projektu: smarty.net.
Instalacja Smarty jest bardzo prosta. Po rozpakowaniu archiwum wystarczy skopiować całą zawartość na serwer FTP.
Hierarchia katalogów:
1 2 3 4 5 6 7 8 |
/public_html/ // katalog główny serwisu cache // katalog na cache configs // pliki konfiguracyjne libs // biblioteki plugins // katalog wtyczek templates // katalog na szablony (pliki zapisujemy z rozszerzeniem .tpl) templates_c // katalog na skompilowane szablony (ustaw prawa do zapisu na 777) |
A teraz troche praktyki. Zapisz swój pierwszy szablon w katalogu templates pod nazwą: szablon.tpl.
1 2 3 4 5 6 7 8 9 10 |
<!DOCTYPE html> <html> <head> <meta charset="{$kodowanie}" /> <title>{$tytul}</title> </head> <body> <div>{$tresc}</div> </body> </html> |
Zawartość szablonu to nic innego jak kod HTML. Wewnątrz klamr {…} pojawią się wartości zmiennych przekazane ze skryptu PHP. Zaraz zobaczysz jakie to proste 😉 Zapisz plik pod nazwą skrypt.php i skopiuj do niego poniższą treść:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php require_once "libs/Smarty.class.php"; // adres do biblioteki Smarty $tpl = new Smarty; // tworzymy nowy obiekt Smarty // wskazujemy ścieżki do istotnych katalogów $tpl->template_dir = "templates/"; $tpl->compile_dir = "templates_c/"; $tpl->cache_dir = "cache/"; // przekazujemy do szablonu wartości: $tpl->assign("kodowanie","utf-8"); // w miejsce makra {kodowanie} podstawiamy wartość "utf-8" $tpl->assign("tytul","Smarty jest spoko!"); // tytuł strony $tpl->assign("tresc","Hello World!"); // i treść $tpl->display("szablon.tpl"); // wskazujemy szablon do przetworzenia, czyli plik: szablon.tpl ?> |
Odpal w przeglądarce skrypt.php i podziwiaj efekt swojej pracy 😉
INCLUDOWANIE SZABLONÓW
Do wnętrza szablonu można wczytać zawartość innego szablonu. Odbywa się to za pomocą dyrektywy include, np. {include file=”szablon.tpl”}
Zmodyfikujmy powyższy przykład dzieląc szablon na dwie części (zapisane w osobnych plikach):
– head.tpl:
1 2 3 4 5 6 7 |
<!DOCTYPE html> <html lang="{$lang}"> <head> <meta charset="{$kodowanie}" /> <title>{$tytul}</title> </head> <body> |
– footer.tpl:
1 2 |
</body> </html> |
Wewnątrz pliku szablon.tpl dołączamy szablony head.tpl i footer.tpl, spinając wszystko w jedną całość:
1 2 3 4 5 |
{include file="head.tpl"} <div>{$tresc}</div> {include file="footer.tpl"} |
skrypt.php pozostawiamy bez zmiany. Myślę, że zabieg ten nie wymaga większych wyjaśnień. Po prostu oddzieliłem treść strony od nagłówka i stopki, tak aby nie powielać stałych elementów strony w kolejnych szablonach. Zaleta jest oczywista.
SEKCJE
Sekcja to rodzaj pętli. Zasada ich działania jest identyczna jak w PHP. Konstrukcja pętli ma postać: {section name=i loop=$list}…{/section}.
Dla przykładu wyświetlimy listę newsów czerpaną z bazy danych.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<?php /* news.php */ $mysqli = new mysqli("host","user","password","dbname"); $sql = $mysqli->query("SELECT id, nazwa, data FROM news ORDER BY data DESC"); $num = $sql->num_rows; for ($i=1;$i<=$num;$i++) { $row = $sql->fetch_assoc(); $newsy[] = $row; // zapisujemy do tablicy wyniki zapytania SQL } $tpl = new Smarty; $tpl -> assign("lang","pl"); $tpl -> assign("kodowanie","utf-8"); $tpl -> assign("tytul","Aktualności"); $tpl -> assign("newsy",$newsy); $tpl -> display("news.tpl"); // dołączamy szablon news.tpl (zawartość szablonu poniżej) $sql->free(); $mysqli->close(); ?> |
Do tablicy $newsy zapisujemy pobrane rekordy z bazy. Zawartość tablicy zostanie wstrzyknięta do szablonu news.tpl:
1 2 3 4 5 6 7 8 9 |
{include file="head.tpl"} <h1>{$tytul}</h1> {section name=i loop=$newsy} <article><a href="?id={$newsy[i].id}">{$newsy[i].nazwa}</a> - {$newsy[i].data}</article> {/section} {include file="footer.tpl"} |
Do parametru name przypisujemy iterator „i” sekcji. Drugi parametr loop przyjmuje wartość tablicy $newsy. Aby odwołać się do określonego pola np. data stosujemy składnię $newsy[i].data – po kropce podajemy nazwę zmiennej. W przykładzie pobieramy wartości trzech zmiennych: id, nazwa i data.
Wyniki zapytania SQL można również pobrać do tablicy asocjacyjnej.
Zmieniamy linię:
1 2 3 4 5 6 7 8 |
$wpisy[] = $row; na: $wpisy[] = array( 'id'=>$row["id"], 'nazwa'=>$row["nazwa"], 'data'=>strftime("%d.%m.%Y",$row["data"]) // formatujemy datę ); |
Szablon pozostaje bez zmian.
INSTRUKCJE WARUNKOWE
Zasada ich działania jest identyczna jak w PHP. Konstrukcja ma postać: {if warunek}…{/if}, {elseif}, {else}
Dla przykładu wyświetlimy atrybut lang, który definiowaliśmy w poprzednich skryptach.
1 2 3 |
{if $lang == "pl"} <p>Wersja językowa strony: <strong>{$lang}</strong></p> {/if} |
Przykład z użyciem: {else}
1 2 3 4 5 |
{if $lang == "pl"} <p>Wersja językowa strony: <strong>{$lang}</strong></p> {else} <p>Brak zdefiniowanego parametru lang.</p> {/if} |
KOD NIE INTERPRETOWANY
Wewnątrz bloku {literal}…{/literal} można osadzać kod, który nie będzie interpretowany. Natomiast w bloku {php}…{/php} można osadzać skrypty PHP. Ze względów bezpieczeństwa nie jest to zalecana praktyka.
1 2 3 4 5 6 7 |
{literal} <script> alert("Smarty jest ok!"); </script> {/literal} |
ZMIENNE ZAREZERWOWANE
W szablonach Smarty dostęp do zmiennych globalnych typu: $_POST, $_GET, $_COOKIE itd odbywa się za pomocą zarezerwowanej zmiennej {$smarty}.
Przykłady:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
{* $_GET *} {$smarty.get.nazwa_zmienna} {* $_POST *} {$smarty.post.nazwa_zmiennej} {* $_REQUEST *} {$smarty.request.nazwa_zmiennej} {* $_COOKIE *} {$smarty.cookies.nazwa_cookie} {* $_SERVER_NAME *} {$smarty.server.SERVER_NAME} {* PATH *} {$smarty.env.PATH} {* session_id *} {$smarty.session.id} {* REQUEST_URI *} $smarty.server.REQUEST_URI |
POBIERANIE SZABLONU DO ZMIENNEJ
W Smarty istnieje możliwość pobrania treści szablonu do zmiennej. Służy do tego metoda fetch.
1 |
$zmienna = $tpl->fetch("szablon.tpl"); |
Więcej o pakiecie Smarty znajdziesz na oficjalnej stronie projektu: smarty.net.