Rozszerzanie możliwości Smarty za pomocą pluginów

Wpis może trochę stary tema­tyką, jednak podsu­mo­wu­jący co nieco z punktu widze­nia mojej codzien­nej pięcio­mie­sięcz­nej praktyki.

Czy potrze­bu­jesz rozsze­rzać Smarty? Jeśli w twoich templat­kach 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 niebez­piecz­nie wkrada się do warstwy prezen­ta­cji. Problemu jesz­cze nie ma dopóki nie potrze­bu­jesz prze­rzu­cać sporych części szablo­nów w różne miej­sca i nikt nie musi konty­nu­ować Twojej roboty. W pozo­sta­łych przy­pad­kach natę­że­nie frustra­cji konty­nu­ato­rów rośnie (jak to k… działa?, po ch… tu jest ta zmienna?) i tak soczy­ście dalej…

Plugins to the rescue!

W zasa­dzie w moich szablo­nach używam trzech rodza­jów plugi­nów: mody­fi­ka­to­rów, funk­cji i funk­cji bloko­wych. Jest tego sporo więcej, jednak nie będę pisał o pozostałych.

Żeby korzy­stać z rozsze­rzeń należy najpierw wska­zać Smarty gdzie ma szukać plugi­nów. Robi się to super prosto. Wystar­czy w kodzie tworzą­cym instan­cję Smarty dodać

$smarty = new Smarty();
$smarty->addPluginsDir(__DIR__ . '/smarty_plugins');
 
// rest of initialization stuff

Druga rzecz to konwen­cja nazew­ni­cza. Mam na myśli nazew­nic­two funk­cji i plików. Jeśli nie prze­strze­gamy konwen­cji, Smarty wywali błąd.

Mody­fi­ka­tor

Prze­zna­cze­nie: prosta mody­fi­ka­cja tekstu.
Nazwa pliku: modifier.nazwa_modyfikatora.php.
Sygna­tura funk­cji: 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. *}

Funk­cja

Prze­zna­cze­nie: zaawan­so­wane gene­ro­wa­nie treści do wyświe­tle­nia.
Nazwa pliku: function.nazwa_funkcji.php.
Sygna­tura funk­cji: 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 *}

Funk­cja blokowa

Prze­zna­cze­nie: otacza­nie treści wyge­ne­ro­wa­nym ciągiem znaków.
Nazwa pliku: block.nazwa_funkcji.php.
Sygna­tura funk­cji: smarty_block_nazwa_funkcji(array $params, $content, \Smarty_Internal_Template $template, &$repeat).
Przykład:

/**
 * Funkcja blokowa doklejajaca zawartosc parametrow do tresci.
 * 
 * Wymagane parametry:
 * - (string) prefix
 * - (string) suffix
 * 
 * @param array $params
 * @param string $content
 * @param \Smarty_Internal_Template $template
 * @param boolean $repeat
 * @return string
 */
function smarty_block_test_function(array $params, $content, \Smarty_Internal_Template $template, &$repeat) {
  // return only when $content is not null
  if (!$repeat) {
 
    // in case of debug mode
    if ($template->getTemplateVars('debug_mode') === true || $template->getConfigVars('debug_mode') === true) {
      if (!isset($params['prefix']) || $params['prefix'] === null) {
        throw new \SmartyException('Unknown prefix');
      }
      if (!isset($params['suffix']) || $params['suffix'] === null) {
        throw new \SmartyException('Unknown suffix');
      }
    }
 
    $prefix = (isset($params['prefix'])) ? $params['prefix'] : '';
    $suffix = (isset($params['suffix'])) ? $params['suffix'] : '';
 
    return "{$prefix} {$content} {$suffix}";
  }
}

Użycie:

{test_function prefix='prefix string' suffix='suffix string'}contents{/test_function}
{* prefix string contents suffix string *}

Podobne wpisy:

  1. O mody­fi­ka­to­rach w Smarty i opisie słow­nym inter­wa­łów czasu
  2. 10 trików w Smarty
  3. Weź mi zrób proce­sor tekstu cz. 1 / 2
  4. Wycią­ga­nie klatek z filmów za pomocą PHP

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.

Możesz użyć następujących tagów oraz atrybutów HTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <p> <pre lang="" line="" escaped=""> <q cite=""> <strike> <strong>