Date post: | 21-May-2015 |
Category: |
Technology |
Upload: | asmir-mustafic |
View: | 1,191 times |
Download: | 8 times |
TEMPLATE ENGINES(In ambiente PHP…)
Asmir Mustafic
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
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
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
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
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
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 client� Lato client� Elaborazione con browser (quasi sempre in javascript)
XSLT? Lato server e client, ma verboso…
Asmir Mustafic - PUG 2011 18/07/11
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 engineFonde 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
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
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
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
Caratteristiche comuni
� Variabili
� Assegnamenti
12
� Assegnamenti
� Condizioni
� Cicli
� Inclusioni
� Eriditarietà
� Auto escape� Auto escape
� I18n
� Plugin
Asmir Mustafic - PUG 2011 18/07/11
Caratteristiche comuni Variabili
$engine = new TemplteEngine();$engine->utente = "pippo";
Index.php
13
{$utente}
$engine->utente = "pippo";
$engine->display("template.tpl");
template.tpl
Pippo
Output
Asmir Mustafic - PUG 2011 18/07/11
Caratteristiche comuni Modificatori
$engine = new TemplteEngine();$engine->utente = "PIPPO";
Index.php
14
{$utente |lower|ucfirst}
$engine->utente = "PIPPO";
$engine->display("template.tpl");
template.tpl
Pippo
Output
Asmir Mustafic - PUG 2011 18/07/11
Caratteristiche comuni Assegnamenti
$engine = new TemplteEngine();$engine->numero = 5;
Index.php
15
{set $numero = $numero + 2 }
{$numero}
$engine->numero = 5;
$engine->display("template.tpl");
template.tpl
7
Output
Asmir Mustafic - PUG 2011 18/07/11
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
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
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
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
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
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
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
Riepilogo
$engine = new TemplteEngine();
$engine->utenti = getElencoUtenti($res); // dati
Index.php
23
<select name='utente' {attr-if $condizione class='combo'}>{foreach $utenti as $utente}
{if $utente[id] % 2 == 0}<option value='{$utente[id]}'>{$utente[nome]|upper}</option>
{/if}
{/foreach}
$engine->utenti = getElencoUtenti($res); // dati
$engine->display("template.tpl");
template.tpl
{/foreach}
</select>
<select name='utente' class='combo'><option value='2'>PIPPO</option>
</select>
Output
Asmir Mustafic - PUG 2011 18/07/11
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
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
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
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
Grazie!
28
Grazie!
Ma non è finita…
Asmir Mustafic - PUG 2011 18/07/11