Napisanie własnej funkcji w Smarty może się okazać niezbędne. Wprawdzie ten popularny system szablonów ma zaimplementowane pewne funkcje, jednak czasami może się okazać, że nie są one wystarczające.
Dla przykładu taka funkcja może być odpowiedzialna za zamianę emotikonów na odpowiednie obrazki, obsługę BBCode czy zabezpieczanie maili przed spamem (które opiszę w następnym artykule).
Funkcja czy modyfikator?
W szablonach Smarty istnieje rozgraniczenie funkcji od modyfikatora. Różnica jest prosta. Modyfikatory używa się do modyfikowania zmiennych, natomiast funkcje są osobnymi konstrukcjami. Najlepszym przykładem funkcji jest wszystkim dobrze znana funkcja assign:
{assign var='zmienna' value='wartosc'}
Sposób używania modyfikatorów opisałem w artykule „Skomplikowane operacje w Smarty”. Dla przypomnienia proste użycie modyfikatora replace, który jest synonimem funkcji PHP str_replace:
{$waluta|trim|replace:'zł':'PLN'}
Własne modyfikatory w Smarty
Wszystkie modyfikatory oraz funkcje możemy znaleźć w katalogu Smarty – libs/plugins/. W tym katalogu każdy plik odpowiada za jeden modyfikator lub funkcję.
Tworzenie nowego modyfikatora zacznę od utworzenia nowego pliku modifier.emotikony.php i zapisania go w katalogu z modyfikatorami. Na początku pliku dajemy komentarz z informacjami o zastosowaniu modyfikatora czyli cel do którego został stworzony i ewentualny sposób zastosowania. Następnie piszemy jego definicję. Podmiana buziek na odpowiednie obrazki będzie się odbywać za pomocą funkcji PHP str_replace:
function smarty_modifier_emotikony($tekst){ return str_replace( Array( ':)', ';)', ':(', ':o', 'ROTFL' ), Array( '<img src="zdjecia/emotikony/usmiech.png" alt="usmiech" />', '<img src="zdjecia/emotikony/przekorny.png" alt="przekorny" />', '<img src="zdjecia/emotikony/smutny.png" alt="smutny" />', '<img src="zdjecia/emotikony/zdziwiony.png" alt="zdziwiony" />', '<img src="zdjecia/emotikony/rotfl.gif" alt="rotfl" />' ), $tekst ); }
I oto cały modyfikator. Oczywiście wymieniłem tutaj tylko kilka podstawowych buziek, jednak nic nie stoi na przeszkodzie, by dopisać ich więcej. Teraz przejdźmy do BBCode.
BBCode w Smarty
Własny modyfikator w Smarty zamieniający BBCode będzie zrobiony na podobnej zasadzie jak powyższy, jednak tutaj niezbędne będzie użycie wyrażeń regularnych. Zawartość tego modyfikatora umieszczę w pliku modifier.bbcode.php.
function smarty_modifier_bbcode($tekst){ $tekst=preg_replace('/\[b\](.*)\[\/b\]/siU','<strong>$1</strong>',$tekst); $tekst=preg_replace('/\[u\](.*)\[\/u\]/siU','<span class="u">$1</span>',$tekst); $tekst=preg_replace('/\[i\](.*)\[\/i\]/siU','<span class="i">$1</span>',$tekst); $tekst=preg_replace('/\[img\](.*)\[\/img\]/siU','<img src="$1" alt="" />',$tekst); $tekst=preg_replace('/\[img=(.*)\](.*)\[\/img\]/siU','<img src="$1" alt="$2" />',$tekst); $tekst=preg_replace('/\[url\](http.*)\[\/url\]/siU','<a href="$1">$1</a>',$tekst); $tekst=preg_replace('/\[url\](.*)\[\/url\]/siU','<a href="$1">$1</a>',$tekst); $tekst=preg_replace('/\[url=(http.*)\](.*)\[\/url\]/siU','<a href="$1">$2</a>',$tekst); $tekst=preg_replace('/\[url=(.*)\](.*)\[\/url\]/siU','<a href="$1">$2</a>',$tekst); $tekst=preg_replace('/\[quote\](.*)\[\/quote\]/siU','<blockquote>$1</blockquote>',$tekst); $tekst=preg_replace('/\[quote=(.*)\](.*)\[\/quote\]/siU','<cite>$1</cite> napisał:<blockquote>$2</blockquote>',$tekst); $tekst=preg_replace('/\[code\](.*)\[\/code\]/siU','<pre>$1</pre>',$tekst); retrn $tekst; }
Podobnie jak przy emotikonach, pokazałem tutaj pokazałem jedynie najbardziej niezbędne elementy BBCode czyli [b], [u], [i], [img], [url], [code] oraz [quote]. Jeśli chodzi o zdjęcia, to uwzględniłem tutaj również zdjęcia z tekstem alternatywnym. Podobnie jest z cytatem – został uwzględniony autor.
Na pewno zauważyliście, że element [url] jest parsowany czterokrotnie. Zrobiłem to z dwóch powodów:
- eliminacja błędnych adresów url, poprzez sprawdzanie, czy link ma początek http
- uwzględniłem również fakt, że link może mieć anchor tekst
Własne funkcje w Smarty
Funkcje w Smarty tworzy się podobnie jak modyfikatory. W nazwie funkcji i pliku zawierającym funkcję, wyraz modifier zastępujemy wyrazem function.
Inaczej się również ma sprawa przekazywanymi parametrami. Definicja funkcji posiada dwa parametry:
- lista parametrów przekazywanych w funkcji
- obiekt Smarty przekazany przez referencje, dzięki któremu będziemy mogli np. raportować błędy
Niestety nie przychodzi mi do głowy żaden pomysł na funkcję, która by się przydała, dlatego napiszę własną funkcję w Smarty wypisującą element HTML – INPUT.
function smarty_function_wypiszInput($parametry, &$smarty){ if(!isset($parametry['type'])){ $smarty->trigger_error('wypiszInput: Brak parametru "type"', E_USER_WARNING); $parametry['type']='text'; } $wynik='<input type="'.$parametry['type'].'"'; if(isset($parametry['value'])) $wynik.=' value="'.$parametry['value'].'"'; if(isset($parametry['name'])) $wynik.=' name="'.$parametry['name'].'"'; if(isset($parametry['id'])) $wynik.=' id="'.$parametry['id'].'"'; if(isset($parametry['class'])) $wynik.=' class="'.$parametry['class'].'"'; if(isset($parametry['dodatki'])) $wynik.=' '.$parametry['dodatki']; return $wynik.' />'; }
Każdy element INPUT musi mieć parametr TYPE. Funkcja sprawdza czy jest on zdefiniowany i jeśli go nie ma, to domyślnie zostanie przypisana wartość TEXT oraz wyświetlone ostrzeżenie o błędzie.
A oto przykład zastosowania tej funkcji:
{input type="text" name="inpucik" value="jakaś wartość"}
Szablony do PHP Smarty nie są niczym trudnym i każdy jest w stanie sobie z tym poradzić. Jak wpadnę na jeszcze jakiś pomysł, to go dodam. Czekam na Wasze komentarze.