2. Chi sono…
Asmir Mustafic
Lavoro nel settore IT dal 2004
2
Lavoro nel settore IT dal 2004
Socio di Mercurio Sistemi SRL (Lignano Sabbiadoro)
Fissato con PHP…
Asmir Mustafic - PUG 2011 18/07/11
3. Approccio classico con PHP…
<?php
$res = mysql_query("SELECT * FROM utenti");
?>
3
?>
<select name='utente'>
<?php
while($data = mysql_fetch_array($res)){
echo "<option
value='".$data["id"]."' "
.($sel==$data["id"]?'selected':'').">";
echo htmspecialchars($data["nome"],ENT_QUOTES,'UTF-8');
echo "</option>";
}
echo "</select>";
Dati (SQL), Logica (PHP), Presentazione (HTML/CSS/JS)
Tutto in uno stesso “posto” (pagina, file, funzione…)!
Asmir Mustafic - PUG 2011 18/07/11
4. Problemi e soluzioni
Alcuni problemi Alcune soluzioni
4
Mancanza di divisione
tra:
Dati
logica di elaborazione
presentazione
Separare dati, logica
e presentazione!
(MVC?)
Model (ORM?)
Viste (Template Engine)presentazione
Difficile mantenibilità e
scalabilità del codice
Spaghetti code!
Viste (Template Engine)
Framework?
Asmir Mustafic - PUG 2011 18/07/11
5. Definizione (1/2)
Un Template engine è quel software progettato per
5
Un Template engine è quel software progettato per
elaborare “template” per produrre in output un
“documento” (Wikipedia)
Non mi piace…
Asmir Mustafic - PUG 2011 18/07/11
6. Definizione (2/2)
Un Template engine è quel componente software che
6
Un Template engine è quel componente software che
aiuta la separazione tra dati, logica e presentazione.
Meglio…?
Asmir Mustafic - PUG 2011 18/07/11
7. Tipologie di template engine
Statici
Pre-elaborazione (Dreamweaver, Frontpage…)
7
Pre-elaborazione (Dreamweaver, Frontpage…)
Lato server
Elaborazione sul server tramite linguaggi di
programmazione (
PHP[Smarty, Twig, PHPTAL,…]
Python[Kid, Django...]
…,Java, PERL…, .NET,…)
Lato clientLato client
Elaborazione con browser (quasi sempre in javascript)
XSLT? Lato server e client, ma verboso…
Asmir Mustafic - PUG 2011 18/07/11
8. Workflow
Dati
I dati devono essere
preparati e passati al TE
8
preparati e passati al TE
Templates
“Scheletri” nei quali il TE
inserirà i dati
Non semplice sostituzione di
variabili, ma anche loops,
condizioni, inclusioni
Template engine
Fonde i dati ed il template,Fonde i dati ed il template,
per produrre un documento in
output.
Output
A seconda del TE è un output
formattato, testo o binario
Asmir Mustafic - PUG 2011 18/07/11
9. PHP con template engine!
$engine = new TemplteEngine();
$engine->utenti = getElencoUtenti($res); // dati
Index.php
9
<select name='utente'>
{foreach $utenti as $utente}
<option value='{$utente[id]}'>{$utente[nome]}</option>
{/foreach}
</select>
$engine->utenti = getElencoUtenti($res); // dati
$engine->display("elenco.tpl");
elenco.tpl
<select name='utente'>
<option value='5'>Pippo</option>
<option value='6'>Pluto</option>
</select>
Output
Asmir Mustafic - PUG 2011 18/07/11
10. Vantaggi
Induce alla separazione tra i diversi livelli cocettuali
Aiuta ad adottare il pattern MVC ad esempio
Meno errori
10
Meno errori
Gli errori commessi nei sono isolati dall’resto dell’applicazione e sono
più faclimente individuabili
Cambiamenti
Si può cambiare completamente l’aspetto di un sito senza (qualsi)
intervenire sulla sua logica
Si può cambiare completamente lo scopo de alcune pagine di un sito
senza intervenire sulla sua logica (Elenco news in RSS)senza intervenire sulla sua logica (Elenco news in RSS)
Si può cambiare completamente la logica senza intervenire sui template
Aiuti/Automatismi
Escape automatico, attributi impliciti, macro,…e molto altro!
(dipende dall’implementazione del TE)
Asmir Mustafic - PUG 2011 18/07/11
11. Svantaggi
Altro linguaggio da imparare
Si aggiunge un altro livello all’intero sistema
11
Si aggiunge un altro livello all’intero sistema
Prestazioni
Errori
Ma penso che ne valga la pena…
Asmir Mustafic - PUG 2011 18/07/11
16. Caratteristiche comuni
Condizioni
$engine = new TemplteEngine();
$engine->condizione = true;
Index.php
16
<div>
{if $condizione}
OK
{/if}
</div>
$engine->condizione = true;
$engine->display("template.tpl");
template.tpl
<div>
OK
</div>
Output
Asmir Mustafic - PUG 2011 18/07/11
17. Caratteristiche comuni
Cicli
$engine = new TemplteEngine();
$engine->utenti = getElencoUtenti($res); // dati
Index.php
17
<select name='utente'>
{foreach $utenti as $utente}
<option value='{$utente.id}'>{$utente.nome}</option>
{/foreach}
</select>
$engine->utenti = getElencoUtenti($res); // dati
$engine->display("template.tpl");
template.tpl
<select name='utente'>
<option value='5'>Pippo</option>
<option value='6'>Pluto</option>
</select>
Output
Asmir Mustafic - PUG 2011 18/07/11
18. Caratteristiche comuni
Inclusioni
$engine = new TemplteEngine();
$engine->display("template.tpl");
Index.php
18
$engine->display("template.tpl");
<div>
{include "template-mini.tpl"}
</div>
template.tpl
<strong>
Sono un altro template
template-mini.tpl
<div>
<strong>
Sono un altro template
</strong>
</div>
Output
Sono un altro template
</strong>
Asmir Mustafic - PUG 2011 18/07/11
19. Caratteristiche comuni
Ereditarietà
<title>
{block titolo}
template-base.tpl
19
Index.php
{extends "template-base.tpl"}
{block titolo}
Benvenuti alla pagina 5 del sito di pippo
{/block}
Template-dettagliato.tpl
{block titolo}
Benvenuti al sito di pippo
{/block}
</title>
$engine = new TemplateEngine();
$engine->display("template-dettagliato.tpl");
Index.php
<title> Benvenuti alla pagina 5 del sito di pippo </title>
Output
Asmir Mustafic - PUG 2011 18/07/11
20. Caratteristiche comuni
Auto escape
$engine = new TemplteEngine();
$engine->utente = "pip<>po";
Index.php
20
{$utente}
$engine->utente = "pip<>po";
$engine->display("template.tpl");
template.tpl
pip<>po
Output
Asmir Mustafic - PUG 2011 18/07/11
21. Caratteristiche comuni
I18n
$engine = new TemplteEngine();
$engine->setLanguage("en");
Index.php
21
{i18n}Ciao mondo{/i18n}
$engine->setLanguage("en");
$engine->setTranslationDir("da/qualche/parte");
$engine->display("template.tpl");
template.tpl
Hello world
Output
Asmir Mustafic - PUG 2011 18/07/11
22. Caratteristiche comuni
Plugin
Template engine minimali
Tutte le funzionalità sono aggiunte tramite plugin
22
Tutte le funzionalità sono aggiunte tramite plugin
Anche quelle “quasi” core
Un template engine senza plugin è fine a se
stesso…
Asmir Mustafic - PUG 2011 18/07/11
24. Alcuni Template Engine PHP
(1/2)
Smarty
il primo ed il più famoso (v2 / v3)
24
il primo ed il più famoso (v2 / v3)
Dwoo
riscrittura di Smarty in PHP 5
Twig
Ispirato a Django, simile a Smarty ma più moderno e potente,
integrato in Simfony
Tanti, tanti altri, tutti molto simili tra loro…Tanti, tanti altri, tutti molto simili tra loro…
Asmir Mustafic - PUG 2011 18/07/11
25. Alcuni Template Engine PHP
(2/2)
Template scritti in linguaggio XML
PHPTAL
25
PHPTAL
Istruzioni unicamente con attributi
Basato sullo standard di Zope
Open Power Template
Simile a PHPTAL , forse ancora più “Strict”
Sintassi migliorata, sfrutta anche elementi oltre agli attributi
ATAL (Vedremo più avanti)ATAL (Vedremo più avanti)
Ispirato a PHPTAL ma pensato appositamente per PHP
Asmir Mustafic - PUG 2011 18/07/11
26. Quale scegliere?
Ogni caso hai il suo template engine!
Consiglio
26
Consiglio
Se dovete generare documenti basati su XML scegliete
un template engine basato su XML (anche HTML4 è
“quasi” XML…).
Perche ? Lo vedremo più avanti…
Anche se sempre, bisogna usare il buon senso…Anche se sempre, bisogna usare il buon senso…
Asmir Mustafic - PUG 2011 18/07/11
27. Indirizzi
Smarty (http://en.wikipedia.org/wiki/Smarty )
Twig (http://www.twig-project.org/ )
27
Twig (http://www.twig-project.org/ )
Dwoo (http://dwoo.org/ )
Phptal (http://phptal.org/ )
Open Power Template (http://www.invenzzia.org )
ATal (http://opensource.mercuriosistemi.com/ )ATal (http://opensource.mercuriosistemi.com/ )
Promising TE
(http://www.webresourcesdepot.com/19-promising-
php-template-engines/ ) 18/07/11Asmir M ustafic - PUG 2011