Wpis może trochę stary tematyką, jednak podsumowujący co nieco z punktu widzenia mojej codziennej pięciomiesięcznej praktyki.
Czy potrzebujesz rozszerzać Smarty? Jeśli w twoich templatkach coraz więcej {assign}
, {math}
, {if 5|in_array:$object->getFeatureIds()}
, {$object->getPhotosLinks() assign="photos"}{$photos[0]}
, {assign var="values" value=$values|cat:'random shit here'}
itd. to wiedz, że coś się dzieje. Warstwa logiki niebezpiecznie wkrada się do warstwy prezentacji. Problemu jeszcze nie ma dopóki nie potrzebujesz przerzucać sporych części szablonów w różne miejsca i nikt nie musi kontynuować Twojej roboty. W pozostałych przypadkach natężenie frustracji kontynuatorów rośnie (jak to k… działa?, po ch… tu jest ta zmienna?) i tak soczyście dalej…
Plugins to the rescue!
W zasadzie w moich szablonach używam trzech rodzajów pluginów: modyfikatorów, funkcji i funkcji blokowych. Jest tego sporo więcej, jednak nie będę pisał o pozostałych.
Żeby korzystać z rozszerzeń należy najpierw wskazać Smarty gdzie ma szukać pluginów. Robi się to super prosto. Wystarczy w kodzie tworzącym instancję Smarty dodać
$smarty = new Smarty();
$smarty->addPluginsDir(__DIR__ . '/smarty_plugins');
// rest of initialization stuff
Druga rzecz to konwencja nazewnicza. Mam na myśli nazewnictwo funkcji i plików. Jeśli nie przestrzegamy konwencji, Smarty wywali błąd.
Modyfikator
Przeznaczenie: prosta modyfikacja tekstu. Nazwa pliku: modifier.nazwa_modyfikatora.php. Sygnatura funkcji: smarty_modifier_nazwa_modyfikatora($value, [$param1, $paramN]). Przykład:
/**
* Modyfikator odwracajacy podany tekst,
* opcjonalnie wrzucajacy jakis ciag pomiedzy znaki tekstu.
*
* @param string $value
* @param string $separationChar
* @return string
*/
function smarty_modifier_reverse_me($value, $separationChar = '') {
$arrayString = preg_split('//u', $value, -1, PREG_SPLIT_NO_EMPTY);
$reversedString = '';
for ($i = count($arrayString) - 1; $i >= 0; $i--) {
$reversedString .= $arrayString[$i] . $separationChar;
}
return $reversedString;
}
Użycie:
{'some text string'|reverse_me}
{* gnirts txet emos *}
{assign var='text_string' value='some text string'}
{$text_string|reverse_me:'.'}
{* g.n.i.r.t.s. .t.x.e.t. .e.m.o.s. *}
Funkcja
Przeznaczenie: zaawansowane generowanie treści do wyświetlenia. Nazwa pliku: function.nazwa_funkcji.php. Sygnatura funkcji: smarty_function_nazwa_funkcji(array $params, \Smarty_Internal_Template $template). Przykład:
/**
* Funkcja zwracajaca biezacy czas w postaci ciagu 'dzien tygodnia, dd.mm.yyyy'.
*
* @param array $params
* @param \Smarty_Internal_Template $smarty
* @return string
*/
function smarty_function_get_localized_time_string(array $params, \Smarty_Internal_Template $template) {
static $weekdays = ['Niedziela', 'Poniedziałek', 'Wtorek', 'Środa', 'Czwartek', 'Piątek', 'Sobota'];
static $today = null;
if ($today == null) {
$today = new \DateTime();
}
return "{$weekdays[$today->format('w')]}, {$today->format('d.m.Y')}";
}
Użycie:
{get_localized_time_string}
{* Czwartek, 27.12.2012 *}
Funkcja blokowa
Przeznaczenie: otaczanie treści wygenerowanym ciągiem znaków. Nazwa pliku: block.nazwa_funkcji.php. Sygnatura funkcji: smarty_block_nazwa_funkcji(array $params, $content, \Smarty_Internal_Template $template, &$repeat). Przykład:
Czytaj dalej tutaj (rozwija treść wpisu)
Czytaj dalej na blogu autora...
Zwiń
Czytaj na blogu autora...