SlideShare una empresa de Scribd logo
1 de 28
Descargar para leer sin conexión
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 clientLato 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 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
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 escapeAuto 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&lt;&gt;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

Más contenido relacionado

La actualidad más candente

La actualidad más candente (6)

Perl Template Toolkit
Perl Template ToolkitPerl Template Toolkit
Perl Template Toolkit
 
Corso di php01
Corso di php01Corso di php01
Corso di php01
 
Php e database: php mysql
Php e database: php mysqlPhp e database: php mysql
Php e database: php mysql
 
jQuery e i suoi plugin
jQuery e i suoi pluginjQuery e i suoi plugin
jQuery e i suoi plugin
 
Facebook Developer Garage Venice 2 parte
Facebook Developer Garage Venice 2 parteFacebook Developer Garage Venice 2 parte
Facebook Developer Garage Venice 2 parte
 
PHP
PHPPHP
PHP
 

Destacado

GraphDB in PHP @ Codemotion 03/23/2012
GraphDB in PHP @ Codemotion 03/23/2012GraphDB in PHP @ Codemotion 03/23/2012
GraphDB in PHP @ Codemotion 03/23/2012Alessandro Nadalin
 
More developers on DevOps with Docker orchestration
More developers on DevOps with Docker orchestrationMore developers on DevOps with Docker orchestration
More developers on DevOps with Docker orchestrationGiulio De Donato
 
PHP: Un progetto open source cresciuto insieme al web
PHP: Un progetto open source cresciuto insieme al webPHP: Un progetto open source cresciuto insieme al web
PHP: Un progetto open source cresciuto insieme al webAsmir Mustafic
 
Symfony 2 : chapitre 2 - Les vues en Twig
Symfony 2 : chapitre 2 - Les vues en TwigSymfony 2 : chapitre 2 - Les vues en Twig
Symfony 2 : chapitre 2 - Les vues en TwigAbdelkader Rhouati
 
TWIG: the flexible, fast and secure template language for PHP
TWIG: the flexible, fast and secure template language for PHPTWIG: the flexible, fast and secure template language for PHP
TWIG: the flexible, fast and secure template language for PHPCesare D'Amico
 
Context oriented architecture - Put the boundary in the right place
Context oriented architecture - Put the boundary in the right placeContext oriented architecture - Put the boundary in the right place
Context oriented architecture - Put the boundary in the right placeLeonardo Proietti
 

Destacado (6)

GraphDB in PHP @ Codemotion 03/23/2012
GraphDB in PHP @ Codemotion 03/23/2012GraphDB in PHP @ Codemotion 03/23/2012
GraphDB in PHP @ Codemotion 03/23/2012
 
More developers on DevOps with Docker orchestration
More developers on DevOps with Docker orchestrationMore developers on DevOps with Docker orchestration
More developers on DevOps with Docker orchestration
 
PHP: Un progetto open source cresciuto insieme al web
PHP: Un progetto open source cresciuto insieme al webPHP: Un progetto open source cresciuto insieme al web
PHP: Un progetto open source cresciuto insieme al web
 
Symfony 2 : chapitre 2 - Les vues en Twig
Symfony 2 : chapitre 2 - Les vues en TwigSymfony 2 : chapitre 2 - Les vues en Twig
Symfony 2 : chapitre 2 - Les vues en Twig
 
TWIG: the flexible, fast and secure template language for PHP
TWIG: the flexible, fast and secure template language for PHPTWIG: the flexible, fast and secure template language for PHP
TWIG: the flexible, fast and secure template language for PHP
 
Context oriented architecture - Put the boundary in the right place
Context oriented architecture - Put the boundary in the right placeContext oriented architecture - Put the boundary in the right place
Context oriented architecture - Put the boundary in the right place
 

Similar a PHP Template Engine (introduzione)

Web Performance Optimization
Web Performance OptimizationWeb Performance Optimization
Web Performance OptimizationAlessandro Martin
 
Enrico Zimuel - PUG Milano meetup - Codemotion Milan 2017
Enrico Zimuel - PUG Milano meetup - Codemotion Milan 2017Enrico Zimuel - PUG Milano meetup - Codemotion Milan 2017
Enrico Zimuel - PUG Milano meetup - Codemotion Milan 2017Codemotion
 
Sviluppo web dall'antichità all'avanguardia e ritorno
Sviluppo web  dall'antichità all'avanguardia e ritornoSviluppo web  dall'antichità all'avanguardia e ritorno
Sviluppo web dall'antichità all'avanguardia e ritornolordarthas
 
Write less do more...with jQuery
Write less do more...with jQueryWrite less do more...with jQuery
Write less do more...with jQueryXeDotNet
 
Dominare il codice legacy
Dominare il codice legacyDominare il codice legacy
Dominare il codice legacyTommaso Torti
 
Gianfrasoft Corso Di Php Parte 2
Gianfrasoft   Corso Di Php   Parte 2Gianfrasoft   Corso Di Php   Parte 2
Gianfrasoft Corso Di Php Parte 2Gianfranco Fedele
 
JAMP DAY 2010 - ROMA (3)
JAMP DAY 2010 - ROMA (3)JAMP DAY 2010 - ROMA (3)
JAMP DAY 2010 - ROMA (3)jampslide
 
Mantenere una distribuzione Drupal attraverso test coverage: Paddle case study
Mantenere una distribuzione Drupal attraverso test coverage: Paddle case studyMantenere una distribuzione Drupal attraverso test coverage: Paddle case study
Mantenere una distribuzione Drupal attraverso test coverage: Paddle case studyDrupalDay
 
breve introduzione a node.js
breve introduzione a node.jsbreve introduzione a node.js
breve introduzione a node.jsnetmeansnet
 
Routing (2/3) | Train to Symfony
Routing (2/3) | Train to SymfonyRouting (2/3) | Train to Symfony
Routing (2/3) | Train to Symfonyinmarelibero
 
Come portare il profiler di symfony2 in drupal8
Come portare il profiler di symfony2 in drupal8Come portare il profiler di symfony2 in drupal8
Come portare il profiler di symfony2 in drupal8Luca Lusso
 
Drupal diventa un CMF e WordPress che fa? Slide WordCamp Milano 2019
Drupal diventa un CMF e WordPress che fa? Slide WordCamp Milano 2019Drupal diventa un CMF e WordPress che fa? Slide WordCamp Milano 2019
Drupal diventa un CMF e WordPress che fa? Slide WordCamp Milano 2019Matteo Enna
 
Non Conventional Android Programming (Italiano)
Non Conventional Android Programming (Italiano)Non Conventional Android Programming (Italiano)
Non Conventional Android Programming (Italiano)Davide Cerbo
 
(My) Best Practices in Symfony
(My) Best Practices in Symfony(My) Best Practices in Symfony
(My) Best Practices in Symfonyinmarelibero
 

Similar a PHP Template Engine (introduzione) (20)

eZ publish - Extension
eZ publish - ExtensioneZ publish - Extension
eZ publish - Extension
 
Web Performance Optimization
Web Performance OptimizationWeb Performance Optimization
Web Performance Optimization
 
TYPO3 CMS 7.3 - le novita
TYPO3 CMS 7.3 - le novitaTYPO3 CMS 7.3 - le novita
TYPO3 CMS 7.3 - le novita
 
Enrico Zimuel - PUG Milano meetup - Codemotion Milan 2017
Enrico Zimuel - PUG Milano meetup - Codemotion Milan 2017Enrico Zimuel - PUG Milano meetup - Codemotion Milan 2017
Enrico Zimuel - PUG Milano meetup - Codemotion Milan 2017
 
Sviluppo web dall'antichità all'avanguardia e ritorno
Sviluppo web  dall'antichità all'avanguardia e ritornoSviluppo web  dall'antichità all'avanguardia e ritorno
Sviluppo web dall'antichità all'avanguardia e ritorno
 
Write less do more...with jQuery
Write less do more...with jQueryWrite less do more...with jQuery
Write less do more...with jQuery
 
Il testing con zend framework
Il testing con zend frameworkIl testing con zend framework
Il testing con zend framework
 
Il testing con zend framework
Il testing con zend frameworkIl testing con zend framework
Il testing con zend framework
 
PHP7 e Rich Domain Model
PHP7 e Rich Domain ModelPHP7 e Rich Domain Model
PHP7 e Rich Domain Model
 
Dominare il codice legacy
Dominare il codice legacyDominare il codice legacy
Dominare il codice legacy
 
Gianfrasoft Corso Di Php Parte 2
Gianfrasoft   Corso Di Php   Parte 2Gianfrasoft   Corso Di Php   Parte 2
Gianfrasoft Corso Di Php Parte 2
 
JAMP DAY 2010 - ROMA (3)
JAMP DAY 2010 - ROMA (3)JAMP DAY 2010 - ROMA (3)
JAMP DAY 2010 - ROMA (3)
 
Mantenere una distribuzione Drupal attraverso test coverage: Paddle case study
Mantenere una distribuzione Drupal attraverso test coverage: Paddle case studyMantenere una distribuzione Drupal attraverso test coverage: Paddle case study
Mantenere una distribuzione Drupal attraverso test coverage: Paddle case study
 
breve introduzione a node.js
breve introduzione a node.jsbreve introduzione a node.js
breve introduzione a node.js
 
Routing (2/3) | Train to Symfony
Routing (2/3) | Train to SymfonyRouting (2/3) | Train to Symfony
Routing (2/3) | Train to Symfony
 
Come portare il profiler di symfony2 in drupal8
Come portare il profiler di symfony2 in drupal8Come portare il profiler di symfony2 in drupal8
Come portare il profiler di symfony2 in drupal8
 
Drupal diventa un CMF e WordPress che fa? Slide WordCamp Milano 2019
Drupal diventa un CMF e WordPress che fa? Slide WordCamp Milano 2019Drupal diventa un CMF e WordPress che fa? Slide WordCamp Milano 2019
Drupal diventa un CMF e WordPress che fa? Slide WordCamp Milano 2019
 
Non Conventional Android Programming (Italiano)
Non Conventional Android Programming (Italiano)Non Conventional Android Programming (Italiano)
Non Conventional Android Programming (Italiano)
 
XSLT
XSLT XSLT
XSLT
 
(My) Best Practices in Symfony
(My) Best Practices in Symfony(My) Best Practices in Symfony
(My) Best Practices in Symfony
 

Último

Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Associazione Digital Days
 
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...Associazione Digital Days
 
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...Associazione Digital Days
 
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Associazione Digital Days
 
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Associazione Digital Days
 
ScrapeGraphAI: a new way to scrape context with AI
ScrapeGraphAI: a new way to scrape context with AIScrapeGraphAI: a new way to scrape context with AI
ScrapeGraphAI: a new way to scrape context with AIinfogdgmi
 
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...Associazione Digital Days
 
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Associazione Digital Days
 
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Associazione Digital Days
 

Último (9)

Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
 
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
 
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
 
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
 
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
 
ScrapeGraphAI: a new way to scrape context with AI
ScrapeGraphAI: a new way to scrape context with AIScrapeGraphAI: a new way to scrape context with AI
ScrapeGraphAI: a new way to scrape context with AI
 
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
 
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
 
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
 

PHP Template Engine (introduzione)

  • 1. TEMPLATE ENGINES (In ambiente PHP…) Asmir Mustafic
  • 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
  • 13. 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
  • 14. 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
  • 15. 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
  • 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&lt;&gt;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
  • 23. 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
  • 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
  • 28. Grazie! 28 Grazie! Ma non è finita… Asmir Mustafic - PUG 2011 18/07/11