PHP Template Engine (introduzione)

1,485 views

Published on

Introduzione ai template engine per PHP

Published in: Technology, Business
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,485
On SlideShare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
14
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

PHP Template Engine (introduzione)

  1. 1. TEMPLATE ENGINES (In ambiente PHP…) Asmir Mustafic
  2. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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
  12. 12. Caratteristiche comuni Variabili Assegnamenti 12 Assegnamenti Condizioni Cicli Inclusioni Eriditarietà Auto escapeAuto escape I18n Plugin Asmir Mustafic - PUG 2011 18/07/11
  13. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 28. Grazie! 28 Grazie! Ma non è finita… Asmir Mustafic - PUG 2011 18/07/11

×