Your SlideShare is downloading. ×
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Templating (3/3) | Train to Symfony
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Templating (3/3) | Train to Symfony

741

Published on

Topic: Templating in Symfony …

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

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
741
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
28
Comments
0
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. http://traintosymfony.com1Emanuele GaspariTRAINTO SYMFONYVerona, 13•14 Aprile 2013the frameworkshophttp://traintosymfony.com@TrainToSymfonyMedia partner:Templating (3/3)
  • 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. http://traintosymfony.com3Emanuele GaspariSymfony: teoria e codiceRouting Templatingframeworkshop: il programmaoverviewobiettivo della terza parte:i Templates in Symfony
  • 4. http://traintosymfony.com4Emanuele GaspariTemplatingtemplate engineTemplate Naming Patterndalla action al templateTWIGsintassi e variabilifiltri e funzionistrutture di controllocomparazioni e testereditarietàmacrovariabili globaliTEMPLATING
  • 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. Train toSymfony6...posso usare ancora php, come prima?
  • 7. http://traintosymfony.com7Emanuele Gasparisì
  • 8. http://traintosymfony.com8Emanuele Gasparise vuoi ancora scrivere codice di questo tipo:
  • 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. http://traintosymfony.com10Emanuele Gaspari
  • 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. http://traintosymfony.com12Emanuele Gasparimmh, non è sufficiente
  • 13. http://traintosymfony.com13Emanuele Gaspari●flessibile●veloce●sicuro●blocchi●ereditarietà●sviluppato da SensioLabs●è abilitato di default in Symfonyperché twig
  • 14. http://traintosymfony.com14Emanuele Gasparimmh, non è sufficiente (ancora)interessante, ma ancora non basta
  • 15. http://traintosymfony.com15Emanuele Gasparisono due le caratteristiche che fanno preferire TWIG
  • 16. Train toSymfony16*non a scapito della potenza1) semplicità, eleganza
  • 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. Train toSymfony18*e sono tutti contenti2) possono metterci le manisia web designer che sviluppatori
  • 19. http://traintosymfony.com19Emanuele Gaspari
  • 20. http://traintosymfony.com20Emanuele GaspariTemplatingtemplate engineTemplate Naming Patterndalla action al templateTWIGsintassi e variabilifiltri e funzionistrutture di controllocomparazioni e testereditarietàmacrovariabili globaliTEMPLATING
  • 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. 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. 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. http://traintosymfony.com24Emanuele GaspariTemplatingtemplate engineTemplate Naming Patterndalla action al templateTWIGsintassi e variabilifiltri e funzionistrutture di controllocomparazioni e testereditarietàmacrovariabili globaliTEMPLATING
  • 25. http://traintosymfony.com25Emanuele Gasparicome Symfony sceglie quale template renderizzare per una certa azionedalla action al template corretto
  • 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. 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. 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. http://traintosymfony.com29Emanuele GaspariTemplatingtemplate engineTemplate Naming Patterndalla action al templateTWIGsintassi e variabilifiltri e funzionistrutture di controllocomparazioni e testereditarietàmacrovariabili globaliTEMPLATING
  • 30. http://traintosymfony.com30Emanuele Gasparisintassisintassi speciale di TWIG{{ ... }}“dire” qualcosa{% ... %}“fare” qualcosa
  • 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. 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. 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. http://traintosymfony.com34Emanuele GaspariTemplatingtemplate engineTemplate Naming Patterndalla action al templateTWIGsintassi e variabilifiltri e funzionistrutture di controllocomparazioni e testereditarietàmacrovariabili globaliTEMPLATING
  • 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. 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. 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. 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. 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. 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. http://traintosymfony.com41Emanuele GaspariTemplatingtemplate engineTemplate Naming Patterndalla action al templateTWIGsintassi e variabilifiltri e funzionistrutture di controllocomparazioni e testereditarietàmacrovariabili globaliTEMPLATING
  • 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. 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. 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. http://traintosymfony.com45Emanuele GaspariTemplatingtemplate engineTemplate Naming Patterndalla action al templateTWIGsintassi e variabilifiltri e funzionistrutture di controllocomparazioni e testereditarietàmacrovariabili globaliTEMPLATING
  • 46. http://traintosymfony.com46Emanuele Gaspariconfronti e testTWIG offre una sintassi semplice per effettuare confronti e test
  • 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. 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. 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. http://traintosymfony.com50Emanuele GaspariTemplatingtemplate engineTemplate Naming Patterndalla action al templateTWIGsintassi e variabilifiltri e funzionistrutture di controllocomparazioni e testereditarietàmacrovariabili globaliTEMPLATING
  • 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. 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. 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. 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. http://traintosymfony.com55Emanuele Gaspariregoleogni template può estendere al massimo un templateogni template può essere esteso da un altro templatelereditarietà si concatena
  • 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. http://traintosymfony.com57Emanuele GaspariTemplatingtemplate engineTemplate Naming Patterndalla action al templateTWIGsintassi e variabilifiltri e funzionistrutture di controllocomparazioni e testereditarietàmacrovariabili globaliTEMPLATING
  • 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. http://traintosymfony.com59Emanuele GaspariTemplatingtemplate engineTemplate Naming Patterndalla action al templateTWIGsintassi e variabilifiltri e funzionistrutture di controllocomparazioni e testereditarietàmacrovariabili globaliTEMPLATING
  • 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. 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. TRAINTO SYMFONYVerona, 13•14 Aprile 2013the frameworkshophttp://traintosymfony.com@TrainToSymfonyMedia partner:©Copyright Emanuele Gaspari Castelletti

×