Niedawno ukazała się beta trzeciej odsłony popularnego systemu szablonów Smarty. Przynosi ona dużo usprawnień w stosunku do poprzedniej wersji, tak w samej architekturze systemu, jak i w składni samych szablonów.
Smarty 3 korzysta z dobrodziejstw PHP5, a w szczególności jego obiektowości, także miłośnicy starszych wersji PHP mogą mieć problemy.
Nowe Smarty korzysta teraz z analizy leksykalnej z prawdziwego zdarzenia. Dzięki czemu możliwe są rzeczy, których w Smarty 2 nie mogliśmy zrobić np. prawie wszędzie można korzystać z wyrażeń (nie potrzeba pluginu {math}, żeby mnożyć, dzielić i dodawać nawet kilka zmiennych na raz!), można wreszcie tworzyć tablice ({assign var=foo value=[1,2,3]}), można korzystać z “krótkiej” składni przypisań ({$spam=$eggs+42} zamiast {assign var=spam value=$eggs+42)), i tak dalej, i tak dalej… dużo poprawek w składni.
Trzeba jednak uczciwie dodać, że szablony i wtyczki napisane dla Smarty 2 i dalej pisane w sposób znany ze Smarty 2, powinny działać i w nowej wersji. Stara składnia jak na razie jest w pełni wspierana.
Sami autorzy, za jedną z najważniejszych cechy Smarty 3, uważają szybkość. Dzięki przepisaniu od nowa całego systemu podobno udało się uzyskać od 2 do 5 razy lepsze wyniki, w porównaniu z poprzednikiem. Dla mnie, jako osoby piszącej szablony, bardzo dużym udogodnieniem jest także nowe podejście do obsługi wstawek javascript/css (wreszcie koniec przebrzydłych tagów {literal}!).
Dokładne omówienie zmian zawiera plik README, dołączany do dystrybucji. Jak na razie nie ma dokładnej dokumentacji na oficjalnej stronie projektu, ale na pewno z nadejściem wersji stabilnej się to zmieni.
A na deser garść przykładów zaczerpniętych z README:
Standardowe użycie — tak jak poprzednio:
require('Smarty.class.php'); $smarty = new Smarty; $smarty->assign('foo','bar'); $smarty->display('index.tpl');
{$x+$y} // wypisze sumę x i y. {$foo = strlen($bar)} // funkcja w przypisaniu {assign var=foo value=$x+$y} // wyrażenie w przypisaniu {$foo = myfunct( ($x+$y)*3 )} // wyrażenie jako parametr funkcji {$foo[$x+3]} // indeks w tablicy obliczany z wyrażenia
Można definiować tablice!
{assign var=foo value=[1,2,3]} {assign var=foo value=['y'=>'yellow','b'=>'blue']}
Tablice moga być zagnieżdżane:
{assign var=foo value=[1,[9,8],3]}
Nowy sposób dostawania się do elementów tablicy:
{$foo['bar']}
Zmienne w nazwach zmiennych:
{$foo_{$x}} // wypisze zawartość $foo_1 jeśli $x ma wartość 1
Można robić też takie rzeczy:
{$object->method1($x)->method2($y)}
Nowe pętle! For zamiast {section}:
{for $x=0, $y=count($foo); $x > $y; $i++} .... {/for}
Nowa, bardziej PHPowa składnia {foreach}:
{foreach $myarray as $var} .... {/foreach}
While:
{while $foo == true} ..... {/while}
Funkcje w template’ach:
{function name=eggs spam=0} {if $spam > 3} {$spam} {eggs spam=$spam+1} {/if} {/function} {eggs}
wypisze ’012′! Świetnie, prawda?

Comment by Marcin Kłeczek — 30 November 2009 @ 4:20 PM
Zapowiada się ciekawie, kiedy osiągnie stabilność?
Comment by Zyx — 6 December 2009 @ 11:56 AM
Z tą szybkością to guzik prawda. Co z tego, że przepisali kod od nowa, kiedy dalej w nim jest potworny śmietnik i takie kwiatki, jak leniwe ładowanie metod, które są np. bezwarunkowo wykorzystywane w konstruktorze i nie ma siły, żeby ich NIE załadować? Zmierzyłem wydajność paru podstawowych elementów składni i tam jest tragedia. Każde odwołanie do zmiennej jest wolniejsze, optymalizacja sekcji leży na całej linii (czasy gorsze o 50%, a nawet więcej, jeśli damy więcej zagnieżdżeń), zaś foreach jedynie zbliża się do wyniku sekcji ze Smarty’ego 2. Nawet coś takiego, jak prekompilowane dziedziczenie szablonów udało im się zawalić wydajnościowo i chyba będzie jeszcze długo dla mnie tajemnicą, jak oni tego dokonali. Jedynie funkcje pozwalają coś poprawić tam, gdzie dotąd trzeba było robić {include}, ale to bynajmniej nie wynika z umiejętności programistów, lecz z właściwości funkcji oraz include’a.
Jestem szczerze zawiedziony “trójką”. Autorzy nie nauczyli się niczego przez te lata, a praktycznie wszystkie ulepszenia to rzeczy, które już od dawna są standardem w wielu systemach szablonów, w dodatku bezmyślnie replikują składnię i zachowanie PHP, co stawia sam sens istnienia ich własnego języka szablonów pod wielkim znakiem zapytania…
Comment by Melon — 27 April 2010 @ 7:49 AM
Z wydajnością nie jest tak źle jak pisze Zyx. Wykorzystuję już smarty 3 w nowych projektach i jestem zadowolony. Na jednej, dosyć rozbudowanej stronie, po przejściu ze smarty 2 na 3 zaobserwowałem ok. 50% szybsze renderowanie podstron. Z tymi wynikami 2-5 razy lepszymi od poprzednika to wielka przesada, ale smarty 3 jest faktycznie szybszy. Leniwe ładowanie metod zostało sporo ograniczone w kolejnych wersjach więc nie jest tak źle. Jedynie czas kompilacji szablonów trwa dłużej, no ale przecież nikt na żywo nie puszcza strony z force_compile=true. Smarty 3 nie stanowi jakiejś rewelacji pod względem nowości, bardziej jest to dodanie funkcjonalności, które są standardem w dzisiejszych czasach, bo dwójka była już bardzo przestarzała i miała sporo ograniczeń.
Replikowanie składni PHP nie jest bezmyślne, tylko bardzo użyteczne. Dlaczego więc nie używać samego PHP? Jak ktoś lubi, to jak najbardziej, dla mnie jednak nic nie przewyższy czytelnością prostych klamerkowatych konstrukcji jak {$var}, a wstawianie w szablony dziesiątki i tym podobnych nie należy do najfajniejszych rzeczy. PHP rzeczywiście sam z siebie jest językiem szablonowym, natomiast jego składnia daleka jest od optymalnej do takich zastosowań. Dlatego są takie narzędzia jak Smarty. Ja z trójki jestem zadowolony.
Comment by Melon — 27 April 2010 @ 7:56 AM
Oprogramowanie tego bloga najwyraźniej zjadło mi część mojego komentarza. W tym zdaniu chodziło mi o to: wstawianie w szablony dziesiątki otwierających i zamykających tagów php z echo i tym podobnych nie należy do najfajniejszych rzeczy. Czyli
Comment by Zyx — 6 May 2010 @ 11:37 AM
Składnia PHP faktycznie jest daleka od optymalnej i jak ją opakujesz w klamerki, dalej będzie daleka od optymalnej ze wszystkimi tego konsekwencjami. Pisanie mega-kompilatora tylko po to, by zamieniać foreach na foreach to czysta bezmyślność, kiedy można było poprawić dosłownie setki rzeczy. Jak komuś potrzebne są same klamerki, osiągnie to samo parserem ważącym pół kilobajta. Popatrz sobie na porządne systemy szablonów, jak OPT, PHPTAL czy nawet od biedy Twig. Prawdziwy wzrost produktywności o rząd wielkości możesz osiągnąć tylko zmieniając podejście do tworzenia szablonów.