http://traintosymfony.com1Emanuele GaspariTRAINTO SYMFONYVerona, 13•14 Aprile 2013the frameworkshophttp://traintosymfony.c...
http://traintosymfony.com2Emanuele Gaspariabout mecreatore di SymfonyBricksEmanuele Gaspariultimo sito pubblicato (copiain...
http://traintosymfony.com3Emanuele GaspariSymfony: teoria e codiceRouting Templatingframeworkshop: il programmaoverviewobi...
http://traintosymfony.com4Emanuele GaspariTemplatingtemplate engineTemplate Naming Patterndalla action al templateTWIGsint...
http://traintosymfony.com5Emanuele Gaspariil template engine TWIGUn template engine (web) è un software progettato per pro...
Train toSymfony6...posso usare ancora php, come prima?
http://traintosymfony.com7Emanuele Gasparisì
http://traintosymfony.com8Emanuele Gasparise vuoi ancora scrivere codice di questo tipo:
http://traintosymfony.com9Emanuele Gaspario_O<html><head><title>[...]</title>[...]</head><body><h3>I miei gruppi preferiti...
http://traintosymfony.com10Emanuele Gaspari
http://traintosymfony.com11Emanuele Gaspariperché un template engine●separazione tra contenuto (template) e logica (backen...
http://traintosymfony.com12Emanuele Gasparimmh, non è sufficiente
http://traintosymfony.com13Emanuele Gaspari●flessibile●veloce●sicuro●blocchi●ereditarietà●sviluppato da SensioLabs●è abili...
http://traintosymfony.com14Emanuele Gasparimmh, non è sufficiente (ancora)interessante, ma ancora non basta
http://traintosymfony.com15Emanuele Gasparisono due le caratteristiche che fanno preferire TWIG
Train toSymfony16*non a scapito della potenza1) semplicità, eleganza
http://traintosymfony.com17Emanuele Gasparisemplicità, eleganza<h1>I miei gruppi preferiti</h1><ul>{% for band in bands %}...
Train toSymfony18*e sono tutti contenti2) possono metterci le manisia web designer che sviluppatori
http://traintosymfony.com19Emanuele Gaspari
http://traintosymfony.com20Emanuele GaspariTemplatingtemplate engineTemplate Naming Patterndalla action al templateTWIGsin...
http://traintosymfony.com21Emanuele GaspariTemplate Naming Patternper riferirmi ad un template uso il nome logico, che ha ...
http://traintosymfony.com22Emanuele Gasparii templates si trovano di default inResources/viewsallinterno le cartelleResour...
http://traintosymfony.com23Emanuele Gasparitipanche TWIG supporta i namespace(Symfony2)TtsDemoBundle:Prodotto:show.html.tw...
http://traintosymfony.com24Emanuele GaspariTemplatingtemplate engineTemplate Naming Patterndalla action al templateTWIGsin...
http://traintosymfony.com25Emanuele Gasparicome Symfony sceglie quale template renderizzare per una certa azionedalla acti...
http://traintosymfony.com26Emanuele Gaspari# src/Tts/DemoBundle/Controller/ProdottoController.php<?phpclass ProdottoContro...
http://traintosymfony.com27Emanuele Gaspari# src/Tts/DemoBundle/Controller/ProdottoController.php<?phpuse SensioBundleFram...
http://traintosymfony.com28Emanuele Gaspari# src/Tts/DemoBundle/Controller/ProdottoController.php<?phpuse SensioBundleFram...
http://traintosymfony.com29Emanuele GaspariTemplatingtemplate engineTemplate Naming Patterndalla action al templateTWIGsin...
http://traintosymfony.com30Emanuele Gasparisintassisintassi speciale di TWIG{{ ... }}“dire” qualcosa{% ... %}“fare” qualcosa
http://traintosymfony.com31Emanuele Gasparivariabili{{ prodotto[codice] }}{{ prodotto[codice] }}{{ nomeProdotto }}{{ nomeP...
http://traintosymfony.com32Emanuele Gasparioperatore .loperatore . si comporta diversamente in base alla variabile●prodott...
http://traintosymfony.com33Emanuele Gasparidichiarare una variabile{% set nomeProdotto = Chiave inglese %}{% set nomeProdo...
http://traintosymfony.com34Emanuele GaspariTemplatingtemplate engineTemplate Naming Patterndalla action al templateTWIGsin...
http://traintosymfony.com35Emanuele Gasparifiltri{{ nomeProdotto | upper }}{{ nomeProdotto | upper }}le variabili posso es...
http://traintosymfony.com36Emanuele Gasparifiltri più comuni{{ catalogo.ultimoAggiornamento | date(“m/d/Y”) }}{{ catalogo....
http://traintosymfony.com37Emanuele Gaspariconcatenazione{{ misureDisponibili | slice(1, 5) | join(separator) }}{{ misureD...
http://traintosymfony.com38Emanuele Gasparifunzionile funzioni generano contenutosi possono utilizzare sia allinterno di {...
http://traintosymfony.com39Emanuele Gasparifunzioni comuni{{ dump(misureDisponibili) }}{{ dump(misureDisponibili) }}{{ inc...
http://traintosymfony.com40Emanuele Gasparicombinazione di funzioni{% for i in range( random(100) ) %}{% for i in range( r...
http://traintosymfony.com41Emanuele GaspariTemplatingtemplate engineTemplate Naming Patterndalla action al templateTWIGsin...
http://traintosymfony.com42Emanuele Gasparistrutture di controllogli operatori per le strutture di controllo in TWIG sono ...
http://traintosymfony.com43Emanuele Gasparistrutture di controlloi tag possono anche effettuare delle operazioni sul loro ...
http://traintosymfony.com44Emanuele Gasparicombinazione di tagsi tags possono essere utilizzati insieme{% macro printDescr...
http://traintosymfony.com45Emanuele GaspariTemplatingtemplate engineTemplate Naming Patterndalla action al templateTWIGsin...
http://traintosymfony.com46Emanuele Gaspariconfronti e testTWIG offre una sintassi semplice per effettuare confronti e test
http://traintosymfony.com47Emanuele Gasparioperatori di confrontooperatori di confronto{% if prodotto.codice == 127 %}{% i...
http://traintosymfony.com48Emanuele Gasparioperatore testloperatore is effettua dei test su una variabile{% if loop.index ...
http://traintosymfony.com49Emanuele Gasparioperatore ternariocome in PHP, anche in TWIG esiste un operatore ternario{% for...
http://traintosymfony.com50Emanuele GaspariTemplatingtemplate engineTemplate Naming Patterndalla action al templateTWIGsin...
http://traintosymfony.com51Emanuele Gaspariereditarietà di templatesla killer feature di TWIG è il meccanismo di ereditari...
http://traintosymfony.com52Emanuele Gaspariereditarietà di templates# src/Tts/DemoBundle/Resources/views/layout.html.twig<...
http://traintosymfony.com53Emanuele Gaspariereditarietà di templates# src/Tts/DemoBundle/Resources/views/Default/about.htm...
http://traintosymfony.com54Emanuele Gaspariereditarietà di templates<!DOCTYPE html><html><head><title>about | Train to Sym...
http://traintosymfony.com55Emanuele Gaspariregoleogni template può estendere al massimo un templateogni template può esser...
http://traintosymfony.com56Emanuele Gasparitag {% extends %}il tag {% extends %} è flessibile{% extends (mobile_layout) ? ...
http://traintosymfony.com57Emanuele GaspariTemplatingtemplate engineTemplate Naming Patterndalla action al templateTWIGsin...
http://traintosymfony.com58Emanuele Gasparimacro# src/Tts/DemoBundle/Resources/views/Default/index.html.twig{% import "Tts...
http://traintosymfony.com59Emanuele GaspariTemplatingtemplate engineTemplate Naming Patterndalla action al templateTWIGsin...
http://traintosymfony.com60Emanuele Gasparivariabili globaliin ogni template si posso utilizzare delle variabili globalime...
http://traintosymfony.com61Emanuele Gasparivariabili globali customè anche possibile specificare una variabile nei file di...
TRAINTO SYMFONYVerona, 13•14 Aprile 2013the frameworkshophttp://traintosymfony.com@TrainToSymfonyMedia partner:©Copyright ...
Upcoming SlideShare
Loading in …5
×

Templating (3/3) | Train to Symfony

1,058 views

Published on

Topic: Templating in Symfony
Language: italian (english version soon)
First of three presentations shown during the first edition of the Train to Symfony
Verona 13/14 April 2013

http://traintosymfony.com
http://twitter.com/TrainToSymfony

Emanuele Gaspari
https://twitter.com/inmarelibero

  • Be the first to comment

Templating (3/3) | Train to Symfony

  1. 1. http://traintosymfony.com1Emanuele GaspariTRAINTO SYMFONYVerona, 13•14 Aprile 2013the frameworkshophttp://traintosymfony.com@TrainToSymfonyMedia partner:Templating (3/3)
  2. 2. http://traintosymfony.com2Emanuele Gaspariabout mecreatore di SymfonyBricksEmanuele Gaspariultimo sito pubblicato (copiaincolla): www.ilovesanmartino.it4 bundles21 controllers6 services9 entities5 repositories custom4 estensioni twig14 macros10 bundles aggiuntivi(FOSUserBundle, FOSJsRoutingBundle, KnpPaginatorBundle, CopiaincollaMetaTagsBundle, etc..)co-sviluppatore di CopiaincollaMetaTagsBundle https://github.com/copiaincolla/MetaTagsBundlehttps://symfonybricks.cominmarelibero@gmail.com @inmarelibero
  3. 3. http://traintosymfony.com3Emanuele GaspariSymfony: teoria e codiceRouting Templatingframeworkshop: il programmaoverviewobiettivo della terza parte:i Templates in Symfony
  4. 4. http://traintosymfony.com4Emanuele GaspariTemplatingtemplate engineTemplate Naming Patterndalla action al templateTWIGsintassi e variabilifiltri e funzionistrutture di controllocomparazioni e testereditarietàmacrovariabili globaliTEMPLATING
  5. 5. http://traintosymfony.com5Emanuele Gaspariil template engine TWIGUn template engine (web) è un software progettato per processare un templatee dei contenuti, per produrre in output un documento webSymfony integra il template engine TWIG per il renderingdelle pagine html (e non solo)http://en.wikipedia.org/wiki/Template_engine_(web)
  6. 6. Train toSymfony6...posso usare ancora php, come prima?
  7. 7. http://traintosymfony.com7Emanuele Gasparisì
  8. 8. http://traintosymfony.com8Emanuele Gasparise vuoi ancora scrivere codice di questo tipo:
  9. 9. http://traintosymfony.com9Emanuele Gaspario_O<html><head><title>[...]</title>[...]</head><body><h3>I miei gruppi preferiti</h3><ul><?php$info = new BandsManager(true, 12);foreach($bands as $band_name) {$band_info = $info->findInfos($band);echo “<li>”.$band_name;if(!is_null($band_info)) {echo ‘(<a href=”‘.$band_info->site.’”>’.$band_info->site.’</a>)’;}echo “</li>”;}?></ul></body></html>
  10. 10. http://traintosymfony.com10Emanuele Gaspari
  11. 11. http://traintosymfony.com11Emanuele Gaspariperché un template engine●separazione tra contenuto (template) e logica (backend, php)●organizzazione del codice secondo il paradigma MVCperché adottare un template engine, invece che PHP semplice
  12. 12. http://traintosymfony.com12Emanuele Gasparimmh, non è sufficiente
  13. 13. http://traintosymfony.com13Emanuele Gaspari●flessibile●veloce●sicuro●blocchi●ereditarietà●sviluppato da SensioLabs●è abilitato di default in Symfonyperché twig
  14. 14. http://traintosymfony.com14Emanuele Gasparimmh, non è sufficiente (ancora)interessante, ma ancora non basta
  15. 15. http://traintosymfony.com15Emanuele Gasparisono due le caratteristiche che fanno preferire TWIG
  16. 16. Train toSymfony16*non a scapito della potenza1) semplicità, eleganza
  17. 17. http://traintosymfony.com17Emanuele Gasparisemplicità, eleganza<h1>I miei gruppi preferiti</h1><ul>{% for band in bands %}<li>{{ band.name }}{% if band.website %}(<a href=”{{ band.website }}”>official site</a>){% endif %}</li>{% endfor %}</ul>
  18. 18. Train toSymfony18*e sono tutti contenti2) possono metterci le manisia web designer che sviluppatori
  19. 19. http://traintosymfony.com19Emanuele Gaspari
  20. 20. http://traintosymfony.com20Emanuele GaspariTemplatingtemplate engineTemplate Naming Patterndalla action al templateTWIGsintassi e variabilifiltri e funzionistrutture di controllocomparazioni e testereditarietàmacrovariabili globaliTEMPLATING
  21. 21. http://traintosymfony.com21Emanuele GaspariTemplate Naming Patternper riferirmi ad un template uso il nome logico, che ha la sintassi:# src/Tts/DemoBundle/Resources/view/Prodotto/show.html.twig# src/Tts/DemoBundle/Resources/view/Prodotto/show.html.twigbundle:controller:templateTtsDemoBundle:Prodotto:show.html.twigBundle Controller TemplateTtsDemoBundleTtsDemoBundle ProdottoControllerProdottoController show.html.twigshow.html.twig
  22. 22. http://traintosymfony.com22Emanuele Gasparii templates si trovano di default inResources/viewsallinterno le cartelleResources/views/[nome controller]rispecchiano i Controller di un bundleSymfonyBricksSiteBundle::layout.html.twigSymfonyBricksSiteBundle::layout.html.twig
  23. 23. http://traintosymfony.com23Emanuele Gasparitipanche TWIG supporta i namespace(Symfony2)TtsDemoBundle:Prodotto:show.html.twighttp://symfony.com/doc/current/cookbook/templating/namespaced_paths.html@TtsDemoBundle/Prodotto/show.html.twig
  24. 24. http://traintosymfony.com24Emanuele GaspariTemplatingtemplate engineTemplate Naming Patterndalla action al templateTWIGsintassi e variabilifiltri e funzionistrutture di controllocomparazioni e testereditarietàmacrovariabili globaliTEMPLATING
  25. 25. http://traintosymfony.com25Emanuele Gasparicome Symfony sceglie quale template renderizzare per una certa azionedalla action al template corretto
  26. 26. http://traintosymfony.com26Emanuele Gaspari# src/Tts/DemoBundle/Controller/ProdottoController.php<?phpclass ProdottoController extends Controller{public function showAction($codice){$entity = $this->getRepository(TtsDemoBundle:Prodotto)->findOneBy(array(“codice” => $codice));return $this->render(TtsDemoBundle:Prodotto:show.html.twig,array(entity => $entity));}}# src/Tts/DemoBundle/Controller/ProdottoController.php<?phpclass ProdottoController extends Controller{public function showAction($codice){$entity = $this->getRepository(TtsDemoBundle:Prodotto)->findOneBy(array(“codice” => $codice));return $this->render(TtsDemoBundle:Prodotto:show.html.twig,array(entity => $entity));}}# src/Tts/DemoBundle/Resources/view/Prodotto/show.html.twig$this->render()la action restituisce un template twig compilato,specificato nella action
  27. 27. http://traintosymfony.com27Emanuele Gaspari# src/Tts/DemoBundle/Controller/ProdottoController.php<?phpuse SensioBundleFrameworkExtraBundleConfigurationTemplate;/*** @Template()*/public function showAction($codice){$entity = $this->getRepository(TtsDemoBundle:Prodotto)->findOneBy(array(“codice” => $codice));return array(“entity” => $entity);}# src/Tts/DemoBundle/Controller/ProdottoController.php<?phpuse SensioBundleFrameworkExtraBundleConfigurationTemplate;/*** @Template()*/public function showAction($codice){$entity = $this->getRepository(TtsDemoBundle:Prodotto)->findOneBy(array(“codice” => $codice));return array(“entity” => $entity);}# src/Tts/DemoBundle/Resources/view/Prodotto/show.html.twigsfrutto lannotazione @Template()@Template()
  28. 28. http://traintosymfony.com28Emanuele Gaspari# src/Tts/DemoBundle/Controller/ProdottoController.php<?phpuse SensioBundleFrameworkExtraBundleConfigurationTemplate;/*** @Template(“TtsDemoBundle:Prodotto:show_offerta.html.twig”)*/public function showAction($codice){[…]return array(“entity” => $entity);}# src/Tts/DemoBundle/Controller/ProdottoController.php<?phpuse SensioBundleFrameworkExtraBundleConfigurationTemplate;/*** @Template(“TtsDemoBundle:Prodotto:show_offerta.html.twig”)*/public function showAction($codice){[…]return array(“entity” => $entity);}# src/Tts/DemoBundle/Resources/view/Prodotto/show_offerta.html.twigutilizzo lannotazione @Template() specificando un parametro@Template(...)
  29. 29. http://traintosymfony.com29Emanuele GaspariTemplatingtemplate engineTemplate Naming Patterndalla action al templateTWIGsintassi e variabilifiltri e funzionistrutture di controllocomparazioni e testereditarietàmacrovariabili globaliTEMPLATING
  30. 30. http://traintosymfony.com30Emanuele Gasparisintassisintassi speciale di TWIG{{ ... }}“dire” qualcosa{% ... %}“fare” qualcosa
  31. 31. http://traintosymfony.com31Emanuele Gasparivariabili{{ prodotto[codice] }}{{ prodotto[codice] }}{{ nomeProdotto }}{{ nomeProdotto }}{{ ... }} stampa il contenuto di una variabilenomeProdotto è una stringaprodotto è un array associativo{{ prodotto.codice }}{{ prodotto.codice }}prodotto potrebbe essere un array o un oggetto
  32. 32. http://traintosymfony.com32Emanuele Gasparioperatore .loperatore . si comporta diversamente in base alla variabile●prodotto è un array e codice una chiave●prodotto è un oggetto e codice una proprietà accessibile●prodotto è un oggetto e codice() un metodo accessibile●prodotto è un oggetto e getCodice() un metodo accessibile●prodotto è un oggetto e isCodice() un metodo accessibile{{ prodotto.codice }}{{ prodotto.codice }}verifica se:
  33. 33. http://traintosymfony.com33Emanuele Gasparidichiarare una variabile{% set nomeProdotto = Chiave inglese %}{% set nomeProdotto = Chiave inglese %}{% set ... %} permette di inizializzare variabili allinterno del template TWIG{% set nomeProdottoEsteso = nomeProdotto ~ “ (Attrezzi da lavoro)” %}{% set nomeProdottoEsteso = nomeProdotto ~ “ (Attrezzi da lavoro)” %}concatenazione di stringhe{% set misureDisponibili = [12, 24, 36] %}{% set misureDisponibili = [12, 24, 36] %}{% set misureDisponibiliQuantita = {12: 128, 24: 2, 36: 74} %}{% set misureDisponibiliQuantita = {12: 128, 24: 2, 36: 74} %}
  34. 34. http://traintosymfony.com34Emanuele GaspariTemplatingtemplate engineTemplate Naming Patterndalla action al templateTWIGsintassi e variabilifiltri e funzionistrutture di controllocomparazioni e testereditarietàmacrovariabili globaliTEMPLATING
  35. 35. http://traintosymfony.com35Emanuele Gasparifiltri{{ nomeProdotto | upper }}{{ nomeProdotto | upper }}le variabili posso essere modificate dai filtrii filtri si applicano alla variabile separandoli con |,e possono accettare dei parametri{{ misureDisponibili | join(“, ”) }}{{ misureDisponibili | join(“, ”) }}http://twig.sensiolabs.org/doc/filters/index.html
  36. 36. http://traintosymfony.com36Emanuele Gasparifiltri più comuni{{ catalogo.ultimoAggiornamento | date(“m/d/Y”) }}{{ catalogo.ultimoAggiornamento | date(“m/d/Y”) }}{{ misureDisponibili | join(“, ”) }}{{ misureDisponibili | join(“, ”) }}{% if misureDisponibili | length > 0 %}...{% endif %}{% if misureDisponibili | length > 0 %}...{% endif %}{{ prodotto.descrizioneEstesa | nl2br }}{{ prodotto.descrizioneEstesa | nl2br }} {{ prodotto.descrizioneEstesa | raw }}{{ prodotto.descrizioneEstesa | raw }}{% for i in misureDisponibili | slice(1, 5) %}...{% endfor %}{% for i in misureDisponibili | slice(1, 5) %}...{% endfor %}
  37. 37. http://traintosymfony.com37Emanuele Gaspariconcatenazione{{ misureDisponibili | slice(1, 5) | join(separator) }}{{ misureDisponibili | slice(1, 5) | join(separator) }}{{ prodotto.descrizioneEstesa | nl2br | raw }}{{ prodotto.descrizioneEstesa | nl2br | raw }}i filtri possono essere concatenati
  38. 38. http://traintosymfony.com38Emanuele Gasparifunzionile funzioni generano contenutosi possono utilizzare sia allinterno di {{ ... }} che di {% ... %}{% for i in range(1, 100) %}{% for i in range(1, 100) %}{{ random(100) }}{{ random(100) }}http://twig.sensiolabs.org/doc/functions/index.html
  39. 39. http://traintosymfony.com39Emanuele Gasparifunzioni comuni{{ dump(misureDisponibili) }}{{ dump(misureDisponibili) }}{{ include(template_from_string("Codice prodotto: {{ prodotto.codice }}") }}{{ include(template_from_string("Codice prodotto: {{ prodotto.codice }}") }}{{ random([red, blue, yellow]) }}{{ random([red, blue, yellow]) }}{% for i in range(0, 3) %}...{% endfor %}{% for i in range(0, 3) %}...{% endfor %}
  40. 40. http://traintosymfony.com40Emanuele Gasparicombinazione di funzioni{% for i in range( random(100) ) %}{% for i in range( random(100) ) %}le funzioni possono essere utilizzate insieme
  41. 41. http://traintosymfony.com41Emanuele GaspariTemplatingtemplate engineTemplate Naming Patterndalla action al templateTWIGsintassi e variabilifiltri e funzionistrutture di controllocomparazioni e testereditarietàmacrovariabili globaliTEMPLATING
  42. 42. http://traintosymfony.com42Emanuele Gasparistrutture di controllogli operatori per le strutture di controllo in TWIG sono detti tag{% if misureDisponibili | length > 0 %}<ul>{% for misura, quantita in misureDisponibiliQuantita %}<li>{{ quantita }} pezzi sono disponibiliper la misura “{{ misura }}”</li>{% endfor %}</ul>{% else %}Spiacenti, questo articolo non è disponibile in alcuna misura{% endif %}{% if misureDisponibili | length > 0 %}<ul>{% for misura, quantita in misureDisponibiliQuantita %}<li>{{ quantita }} pezzi sono disponibiliper la misura “{{ misura }}”</li>{% endfor %}</ul>{% else %}Spiacenti, questo articolo non è disponibile in alcuna misura{% endif %}http://twig.sensiolabs.org/doc/tags/index.html
  43. 43. http://traintosymfony.com43Emanuele Gasparistrutture di controlloi tag possono anche effettuare delle operazioni sul loro contenuto{% filter lower | capitalize %}{{ prodotto.descrizione }}{% endfilter %}{% filter lower | capitalize %}{{ prodotto.descrizione }}{% endfilter %}{% macro printDescrizioneProdotto(prodotto) %}Descrizione prodotto: {{ prodotto.codice }} - {{ prodotto.descrizione | raw }}{% endmacro %}{{ _self.printDescrizioneProdotto(entity) }}{% macro printDescrizioneProdotto(prodotto) %}Descrizione prodotto: {{ prodotto.codice }} - {{ prodotto.descrizione | raw }}{% endmacro %}{{ _self.printDescrizioneProdotto(entity) }}{% spaceless %}<div><strong>foo</strong></div>{% endspaceless %}{% spaceless %}<div><strong>foo</strong></div>{% endspaceless %}
  44. 44. http://traintosymfony.com44Emanuele Gasparicombinazione di tagsi tags possono essere utilizzati insieme{% macro printDescrizioneProdotto(prodotto) %}Descrizione prodotto: {{ prodotto.codice }} -{% filter lower | capitalize %}{{ prodotto.descrizione | raw }}{% endfilter %}{% endmacro %}{% spaceless %}{{ _self.printDescrizioneProdotto(entity) }}{% endspaceless %}{% macro printDescrizioneProdotto(prodotto) %}Descrizione prodotto: {{ prodotto.codice }} -{% filter lower | capitalize %}{{ prodotto.descrizione | raw }}{% endfilter %}{% endmacro %}{% spaceless %}{{ _self.printDescrizioneProdotto(entity) }}{% endspaceless %}
  45. 45. http://traintosymfony.com45Emanuele GaspariTemplatingtemplate engineTemplate Naming Patterndalla action al templateTWIGsintassi e variabilifiltri e funzionistrutture di controllocomparazioni e testereditarietàmacrovariabili globaliTEMPLATING
  46. 46. http://traintosymfony.com46Emanuele Gaspariconfronti e testTWIG offre una sintassi semplice per effettuare confronti e test
  47. 47. http://traintosymfony.com47Emanuele Gasparioperatori di confrontooperatori di confronto{% if prodotto.codice == 127 %}{% if prodotto.codice == 127 %}== != < > >= <=== != < > >= <={% if misureDisponibili | length > 0 %}{% if misureDisponibili | length > 0 %}
  48. 48. http://traintosymfony.com48Emanuele Gasparioperatore testloperatore is effettua dei test su una variabile{% if loop.index is divisibleby(3) %}{% if loop.index is divisibleby(3) %}{% if loop.index is even %}{% if loop.index is even %}http://twig.sensiolabs.org/doc/tests/index.html{% if loop.index is not divisibleby(3) %}{% if loop.index is not divisibleby(3) %}
  49. 49. http://traintosymfony.com49Emanuele Gasparioperatore ternariocome in PHP, anche in TWIG esiste un operatore ternario{% for misura in misureDisponibili %}<tr class=”{{ ( loop.index is even ) ? “even” : “odd” }}”>[...]{% endfor %}{% for misura in misureDisponibili %}<tr class=”{{ ( loop.index is even ) ? “even” : “odd” }}”>[...]{% endfor %}http://twig.sensiolabs.org/doc/tests/index.html
  50. 50. http://traintosymfony.com50Emanuele GaspariTemplatingtemplate engineTemplate Naming Patterndalla action al templateTWIGsintassi e variabilifiltri e funzionistrutture di controllocomparazioni e testereditarietàmacrovariabili globaliTEMPLATING
  51. 51. http://traintosymfony.com51Emanuele Gaspariereditarietà di templatesla killer feature di TWIG è il meccanismo di ereditarietà di templatesin ogni template è possibile definire dei blocchiil cui contenuto può essere sovrascrittoun template può estendere un altro templateper sfruttare le parti comuni esovrascriverne altre
  52. 52. http://traintosymfony.com52Emanuele Gaspariereditarietà di templates# src/Tts/DemoBundle/Resources/views/layout.html.twig<!DOCTYPE html><html><head><title>{% block title %}workshop{% endblock %} | Train to Symfony</title></head><body><div id="main">{% block main %}{% endblock %}</div><div id="footer">{% block footer %}Train to Symfony - Verona, 13•14 Aprile 2013{% endblock %}</div></body></html># src/Tts/DemoBundle/Resources/views/layout.html.twig<!DOCTYPE html><html><head><title>{% block title %}workshop{% endblock %} | Train to Symfony</title></head><body><div id="main">{% block main %}{% endblock %}</div><div id="footer">{% block footer %}Train to Symfony - Verona, 13•14 Aprile 2013{% endblock %}</div></body></html>definisco un template di base (es. layout), che imposta la struttura generale
  53. 53. http://traintosymfony.com53Emanuele Gaspariereditarietà di templates# src/Tts/DemoBundle/Resources/views/Default/about.html.twig{% extends "TtsDemoBundle::layout.html.twig" %}{% block title %}about{% endblock %}{% block main %}<h1>Train to Symfony</h1><p>Train to Symfony è un puntualissimo convoglio che ti offre un corsofortemente pratico su questo sempre più utilizzato framework.</p>{% endblock %}# src/Tts/DemoBundle/Resources/views/Default/about.html.twig{% extends "TtsDemoBundle::layout.html.twig" %}{% block title %}about{% endblock %}{% block main %}<h1>Train to Symfony</h1><p>Train to Symfony è un puntualissimo convoglio che ti offre un corsofortemente pratico su questo sempre più utilizzato framework.</p>{% endblock %}creo un template che lo estende, e sovrascrivo solo i blocchi che mi servono
  54. 54. http://traintosymfony.com54Emanuele Gaspariereditarietà di templates<!DOCTYPE html><html><head><title>about | Train to Symfony</title></head><body><div id="main"><h1>Train to Symfony</h1><p>Train to Symfony è un puntualissimo convoglio che ti offre un corsofortemente pratico su questo sempre più utilizzato framework.</p></div><div id="footer">Train to Symfony - Verona, 13•14 Aprile 2013</div></body></html><!DOCTYPE html><html><head><title>about | Train to Symfony</title></head><body><div id="main"><h1>Train to Symfony</h1><p>Train to Symfony è un puntualissimo convoglio che ti offre un corsofortemente pratico su questo sempre più utilizzato framework.</p></div><div id="footer">Train to Symfony - Verona, 13•14 Aprile 2013</div></body></html>il risultato è la combinazione tra layout.html.twige i blocchi che sono stati sovrascritti
  55. 55. http://traintosymfony.com55Emanuele Gaspariregoleogni template può estendere al massimo un templateogni template può essere esteso da un altro templatelereditarietà si concatena
  56. 56. http://traintosymfony.com56Emanuele Gasparitag {% extends %}il tag {% extends %} è flessibile{% extends (mobile_layout) ? "layout_mobile.html.twig" : "layout.html.twig" %}{% extends (mobile_layout) ? "layout_mobile.html.twig" : "layout.html.twig" %}{% extends custom_layout %}{% extends custom_layout %}{% extends [custom_layout, mobile_layout] %}{% extends [custom_layout, mobile_layout] %}{% extends "TtsDemoBundle::layout.html.twig" %}{% extends "TtsDemoBundle::layout.html.twig" %}
  57. 57. http://traintosymfony.com57Emanuele GaspariTemplatingtemplate engineTemplate Naming Patterndalla action al templateTWIGsintassi e variabilifiltri e funzionistrutture di controllocomparazioni e testereditarietàmacrovariabili globaliTEMPLATING
  58. 58. http://traintosymfony.com58Emanuele Gasparimacro# src/Tts/DemoBundle/Resources/views/Default/index.html.twig{% import "TtsDemoBundle::macros/macrosProdotto.html.twig" as macrosProdotto %}{% for entity in entities %}{{ macroProdotto.printDescrizione(entity) }}{% endfor %}# src/Tts/DemoBundle/Resources/views/Default/index.html.twig{% import "TtsDemoBundle::macros/macrosProdotto.html.twig" as macrosProdotto %}{% for entity in entities %}{{ macroProdotto.printDescrizione(entity) }}{% endfor %}# src/Tts/DemoBundle/Resources/views/macros/macrosProdotto.html.twig{% macro printDescrizione(prodotto) %}<div>Descrizione prodotto: {{ prodotto.codice }} - {{ prodotto.descrizione | raw }}</div>{% endmacro %}# src/Tts/DemoBundle/Resources/views/macros/macrosProdotto.html.twig{% macro printDescrizione(prodotto) %}<div>Descrizione prodotto: {{ prodotto.codice }} - {{ prodotto.descrizione | raw }}</div>{% endmacro %}una macro è una porzione di codice TWIG riutilizzabile
  59. 59. http://traintosymfony.com59Emanuele GaspariTemplatingtemplate engineTemplate Naming Patterndalla action al templateTWIGsintassi e variabilifiltri e funzionistrutture di controllocomparazioni e testereditarietàmacrovariabili globaliTEMPLATING
  60. 60. http://traintosymfony.com60Emanuele Gasparivariabili globaliin ogni template si posso utilizzare delle variabili globalimesse a disposizione da Symfonyapp.security security context.app.user oggetto User correnteapp.request oggetto Requestapp.session oggetto Sessionapp.environment environment corrent (dev, prod)app.debug true se in modalità debugapp.security security context.app.user oggetto User correnteapp.request oggetto Requestapp.session oggetto Sessionapp.environment environment corrent (dev, prod)app.debug true se in modalità debug
  61. 61. http://traintosymfony.com61Emanuele Gasparivariabili globali customè anche possibile specificare una variabile nei file di configurazione,e utilizzarla in qualsiasi template TWIG{{ available_locales | join(“, ”) }}{{ available_locales | join(“, ”) }}# app/config/config.ymlparameters:available_locales: [it, en]twig:globals:available_locales: %available_locales%# app/config/config.ymlparameters:available_locales: [it, en]twig:globals:available_locales: %available_locales%
  62. 62. TRAINTO SYMFONYVerona, 13•14 Aprile 2013the frameworkshophttp://traintosymfony.com@TrainToSymfonyMedia partner:©Copyright Emanuele Gaspari Castelletti

×