Smarty è un motore di web template scritto in PHP. Smarty consente di separare il codice PHP, la business logic (la programmazione del software), dal codice HTML, il presentation logic (l'aspetto grafico di un sito web), e di generare contenuti web mediante il rimpiazzo di speciali Smarty tag all'interno del documento (sostituzione di variabili e molto altro).

Smarty
software
GenereMotore di template (non in lista)
SviluppatoreMonte Ohrt, Messju Mohr
Data prima versione2001 e 2002
Ultima versione5.0.2 (28 marzo 2024)
Sistema operativoMultipiattaforma
LinguaggioPHP
LicenzaLGPL
(licenza libera)
Sito webwww.smarty.net/

Un tag (marcatore) è una direttiva, racchiusa da speciali caratteri (tipicamente parentesi graffe), interpretata dal motore di Smarty. Queste direttive possono essere delle variabili, denotate dal simbolo del dollaro ($), funzioni, o anche istruzioni di controllo del flusso. Smarty permette ai programmatori PHP di definire delle funzioni da includere nei tag stessi di Smarty.

Model-View-Controller modifica

La raffinata astrazione creata da Smarty consente di separare drasticamente l'interfaccia grafica di una pagina web (la presentazione) dal back-end in PHP, favorendo lo sviluppo di applicazioni di gran lunga più organizzate ed eleganti. L'uso di Smarty facilita agli sviluppatori PHP l'implementazione del modello di sviluppo Model-View-Controller (MVC), che presenta degli indubbi vantaggi: è infatti possibile "nascondere" ai webdesigner la logica di programmazione di un sito, mentre i programmatori lavoreranno senza curarsi dell'interfaccia grafica del sito.

Caratteristiche modifica

Smarty consente la programmazione di template (modelli) attraverso una serie di caratteristiche built-in, tra cui:

  • espressioni regolari
  • foreach, while
  • if, elseif, else
  • modificatori di variabile - per esempio {$variabile|nl2br}
  • funzioni create dall'utente
  • calcolo matematico all'interno del template

oltre a molte altre. Ci sono comunque altri motori di template che supportano queste caratteristiche.

Codice di esempio modifica

Poiché Smarty separa il codice PHP dall'HTML, avremo due file. Il primo è index.tpl:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//IT" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html>
<head>
   <title>{$title_text}</title>
   <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
</head>

<body> {* Questo è un piccolo commento che NON sarà visibile nel sorgente HTML *}

<p>{$body_text}</p>

</body><!-- Questo è un piccolo commento che sarà visibile nel sorgente HTML -->
</html>

Nel codice del business logic (es. index.php) è possibile interfacciarsi a Smarty per usare il template qui sopra:

define('SMARTY_DIR', 'smarty-2.6.9/' );
require_once(SMARTY_DIR . 'Smarty.class.php');

$smarty = new Smarty();
$smarty->template_dir = './templates/';
$smarty->compile_dir = './templates/compile/';
$smarty->cache_dir = './templates/cache/';
$smarty->caching = false;
$smarty->error_reporting = E_ALL; // LASCIA E_ALL DURANTE LO SVILUPPO

$smarty->assign('title_text', 'TITOLO: Un semplice esempio sull\'uso di Smarty...');
$smarty->assign('body_text', 'BODY: Questo e\' il messaggio impostato con assign()');

$smarty->display('index.tpl');

Versione 3.0 modifica

La versione 3.0 di Smarty è stata riscritta per PHP 5 utilizzando le funzionalità offerte da questa versione e che non erano presenti in PHP 4. Quindi Smarty 3 non funziona con le versioni precedenti di PHP. Le funzionalità principali introdotte sono:

  • Eridaterietà dei template;
  • Auto-Escapement {} per JavaScript o per qualunque file interpretato da smarty (CSS, JS, etc);
  • Definizione di funzioni nei template.

Come esempio di questa ultima funzionalità vediamo questo snippet di codice:

{* define the function *}
{function name=menu level=0}
  <ul class="level{$level}">
  {foreach $data as $entry}
    {if is_array($entry)}
      <li>{$entry@key}</li>
      {menu data=$entry level=$level+1}
    {else}
      <li>{$entry}</li>
    {/if}
  {/foreach}
  </ul>
{/function}

{* create an array to demonstrate *}
{$menu = ['item1','item2','item3' => ['item3-1','item3-2','item3-3' =>
['item3-3-1','item3-3-2']],'item4']}

{* run the array through the function *}
{menu data=$menu}

L'output risultante è il seguente:

* item1
* item2
* item3
      o item3-1
      o item3-2
      o item3-3
            + item3-3-1
            + item3-3-2
* item4

Voci correlate modifica

Altri progetti modifica

Collegamenti esterni modifica