Smarty

**Smarty** on PHP-kielellä kirjoitettu mallinejärjestelmä. Smarty erottaa PHP:n ja  HTML:n toisistaan ja sen tarkoitus on lähinnä tuottaa HTML-sisältöä,
erillisten *Smarty-tarkkeiden* ja näytönohjauslogiikan avulla.

Sallittuja tarkkeita ovat esimerkiksi muuttujat kuten {$muuttuja} ja joukko loogisia ja
ohjausoperaattoreita, kuten {if}...{else}...{/if}.

Smartya käytetään useimmiten PHP-sovelluksissa erottamaan  toimintalogiikka esityslogiikasta.
Tämän avulla koodi saadaan selkeämmäksi ja helpommin muokattavaksi. Sovelluksen ulkoasua on
varsin helppo muuttaa koskematta varsinaiseen toimintalogiikkaan tai PHP-koodiin. Smarty on kuitenkin
yleispätevämpi ja sillä voi generoida tarvittaessa muitakin kieliä kuin HTML:ää.

Smarty mahdollistaa näyttölogiikan ohjaamisen
* Säännöllisillä lausekkeilla
* foreach- ja muilla toistorakenteilla
* Valintarakenteilla

ja monella muulla tavalla. Myös monet muut mallinejärjestelmät tukevat vastaavia toimintoja.

## Käännetyt mallineet
Smarty poikkeaa useista muista PHP-mallinejärjestelmistä siten, että Smarty tarkastaa aina mallineen
lukiessaan, onko siitä saatavilla tuore **käännetty versio**. Jos tällaista ei löydy, Smarty kääntää
mallineen puhtaaksi PHP-koodiksi ja sijoittaa koodin **käännetyt**-hakemistoon. Jos tuore käännetty
versio taas löytyy, Smarty käynnistää sen. Näin malline toimii erittäin nopeasti, koska PHP:n ei tarvitse
suorittaa lukuisia etsi-korvaa -toimintoja sijoittaessaan sisältöä muuttujiin. Myös ohjausrakenteet
(toistot, ehtorakenteet) kääntyvät optimoiduksi PHP-koodiksi.

Smartyssa on myös lukuisia laajennuksia, esimerkiksi select_date, joka luo halutulla tavalla
esitetyn päiväyskentän pudotuslistojen avulla. Laajennusten rakenne on yksinkertainen ja niitä on helppo
laatia lisää.

## Alkeisesimerkki

Koska Smarty erottaa PHP HTML:stä, tarvitaan kaksi tiedostoa. Luodaan aluksi malline basic.tpl


```php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<html>
<head>
   <title>{$otsikko}</title>
   <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
</head>

<body>

<p>{$sisalto}</p>

</body>
</html>
```


Toimintalogiikan hoitavassa koodissa Smarty määritellään käyttämään edellistä mallinetta:


```php
<?php
// basic.php
define('SMARTY_DIR', 'smarty-2.6.9/' );
require_once(SMARTY_DIR . 'Smarty.class.php');
// luodaan Smarty-olio ja alustetaan se
$smarty = new Smarty;
$smarty->config_dir = SMARTY_DIR;
$smarty->template_dir = './template';
$smarty->compile_dir = './template/compiled';
$smarty->compile_check = TRUE;
$smarty->debugging = FALSE;

// Siirretään muuttujiin haluttu sisältö
$smarty->assign('otsikko', 'Tämä on otsikko!');
$smarty->assign('sisalto', 'Tämä on assign-toiminolla lisätty sisältö');
// Näytetään malline
$smarty->display('basic.tpl');
?>
```


## Esimerkki toiston ja ehdon sisältävästä rakenteesta
Seuraavassa esimerkissä on kommentti, {if ...}- ja {section...}-toistorakenne.

```php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<html>
<head>
   <title>{$otsikko}</title>
   <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
</head>

<body>
 <table>
 {*
    käydään läpi taulukon 'valikkotekstit' kaikki alkiot ja
    käytetään indeksinä muuttujaa 'idx', jolla voidaan poimia
    myös muiden saatujen synkronistan taulukoiden alkioita
  *}
 {section name=idx loop=$valikkotekstit}
   <tr><td>
   {if $linkit[idx] ne ''}
     <a href='{$linkit[idx]}'>{$valikkotekstit[idx]}</a>
   {else}
     {$valikkotekstit[idx]} 
   {/if}
   </td></tr>
 {/section}
 </table>

</body>
</html>
```


Mallineen näyttävä PHP-koodi voisi olla seuraavanlainen:


```php
<?php
// basic.php
define('SMARTY_DIR', 'smarty-2.6.9/' );
require_once(SMARTY_DIR . 'Smarty.class.php');
// luodaan Smarty-olio ja alustetaan se
$smarty = new Smarty;
$smarty->config_dir = SMARTY_DIR;
$smarty->template_dir = './template';
$smarty->compile_dir = './template/compiled';
$smarty->compile_check = TRUE;
$smarty->debugging = FALSE;

// Luodaan rinnakkaiset taulukot linkit/tekstit, tyhjä linkki tarkoittaa väliotsikkoa
$linkit=array('','http://fi.wikipedia.org','http://www.google.com','http://www.php.net');
$valikkotekstit = array('Päävalikko','Wikipedia','Google','PHP-ohjelmointikieli');

// Siirretään muuttujiin haluttu sisältö
$smarty->assign('otsikko', 'Tämä on otsikko!');
$smarty->assign('linkit',$linkit);
$smarty->assign('valikkotekstit',$valikkotekstit);

// Näytetään malline
$smarty->display('menu.tpl');
?>
```


## Sisäkkäiset toistorakenteet
Toistorakenteet pääsevät oikeuksiinsa esimerkiksi näytettäessä tietokannasta haettuja rivejä.
Seuraava toistorakenne näyttää kaikki HTML-taulukossa kaikki rivit ja luo automaattisesti
oikean määrän sarakkeita:


```php
...  sivun alku...
<table>
{section name=rivinro loop=$data}
  <tr>
  {section name=sarakenro loop=$data[rivinro]}
    <td>{$data[$rivinro][$sarakenro]}</td>
  {/section}
  </tr>
{/section}
{/table}
...  sivu jatkuu ...
</pre>
Tiedot siirretään PHP:sta seuraavasti:

<pre>
<?php
  // kantayhteys avattu, kysellään tietoja
  $kysely = "SELECT * FROM asiakas ORDER BY nimi";
  $tulos  = mysql_query($kysely);
  // luodaan tiedoista kaksiulotteinen taulukko
  while($rivi=mysql_fetch_row($tulos){
    foreach($rivi as $arvo]{
      $tiedot[][] = $tieto;
    }
  }
  // smarty-olio luotu aiemmin.... siirretään tiedot oliolle
  $smarty->assign('data',$tiedot);
  $smarty->display('taulukko.tpl');
?>
```


## Smartyn avulla rakennettuja www-sovelluksia ja -ympäristöjä
* last.fm
* bBlog
* Gallery
* TikiWiki
* XOOPS
* ATK - Achievo ToolKit 

Virallinen Smarty-resurssisivu .

## Aiheesta muualla
* Smartyn kotisivu - virallinen sivusto.
* Lataa 
* Smarty-resurssiluettelo 
* Foorumi - muilla kielillä
* Smarty-Wiki 
* PHP Templating with Smarty  - Smarty-opas