Being Dangerous with Twig


Published on

A presentation about Twig - the friendly templating engine written in PHP - given in San Francisco for Symfony Live 2011.

Published in: Technology
1 Comment
No Downloads
Total views
On SlideShare
From Embeds
Number of Embeds
Embeds 0
No embeds

No notes for slide

Being Dangerous with Twig

  1. 1. Symfony Live 2011being dangerous with Twiga short story by Ryan WeaverFebruary 9, 2011
  2. 2. being dangerous with Twig A 5-step guide to using Twig – the fast, secure and extensible PHP templating engine – to create clean template code, leverage powerful filters, make your designers write you love letters, write template functions that dont clog up yourglobal PHP namespace, take advantage of true template inheritance, hang out withDjango programmers and be able to talk template syntax, enjoy true and non- invasiveoutput escaping, have more time for your family, control whitespace, add global variables to all templates, stop lying when you try to tell yourself that <?php echo looks better than a simple {{, use the fancy for-else control, Rock some macros – little reusable code functions, do awesome stuff like “{% if i is divisibleby 2 %}”, mediate in the simplicity of your templates and drink more green tea, sandbox your template and whitelist capabilities – allowing Twig to be used in a CMS, take advantage of the fact that all templates compile to PHP classes that can extend a base class of your choosing, impress your friends by changing the print tag from {{ var }} to [all-your-base] var [are-belong-to-us], confuse the guy next to you by changing “is” and “is not” to mean the opposite things and convince him that hes misunderstood how logical expressions are used in programming languages all along, create a custom tag that takes the body of its block and tweets it, write templates the expresses presentation and not program logic. Ryan Weaver Symfony Live 2011
  3. 3. @weaverryan » symfony » documentation » collaboration » the lovely @leannapelham
  4. 4. iostudio: flying the symfony flag ● Advertising & Integrated Marketing Solutions • coming to you from » Nashville, TN » Washington, D.C. • 150 employees • and were hiring!
  5. 5. act 1 Why Twig?
  6. 6. because templateengines are awesome
  7. 7. Template enginesA template engine allows you to render apresentation (HTML, XML, etc) via a templatein a controlled environmentIt should allow special functionality thatmakes creating templates easier (helpers,template inheritance, etc)
  8. 8. a template engine is a tool
  9. 9. why not just render PHP templates?
  10. 10. PHP templating woes» rendering template files is a hack: an include statement with output-buffering control» no or faked template inheritance» no isolation: PHP templates suck in any global variables or functions available
  11. 11. we need the brevity of templateswith the isolation of object-oriented programming
  12. 12. so give me some Twiggy pudding Twig is: Twig offers: » fast » true inheritance » flexible » real output escaping » concise » tons of filters » secure » custom tags » fully-featured » great documentation » Extensible » global variables » designer-friendly » the “for-else” control
  13. 13. Twig is concise and each templatecompiles to an actual PHP object
  14. 14. seeing is believing
  15. 15. a moment oftemplating zen
  16. 16. “The template system is meant toexpress presentation, not program logic.” - Django documentation
  17. 17. Twig can easily be used anywhere
  18. 18. act 2 Twigs simple life
  19. 19. Twigs three tagsTwig parses just three simple tags: » comment tag » print tag » block tag
  20. 20. a. do nothing (comment tags){# comment #} » totally ignored when rendered
  21. 21. b. say something (print tags){{ print me! }} » prints the given expression » think “<?php echo” » If youre ultimately printing something, use this tag
  22. 22. c. do something (block tags){% set foo = inside a block tag %} » used mostly for control-flow statements like if, for, include and block » can have beginning and end tags » if youre *doing* something and not *printing* something, use this tag
  23. 23. Twigs three tags » do nothing: {# comment tag #} » say something: {{ print tag }} » do something: {% block tag %} its just that simple
  24. 24. act 3 Everything is an expression
  25. 25. expressions: Twig guts » like PHP, most everything inside a tag is an expression » expressions are the most interesting and flexible part of Twig
  26. 26. Expressions Block names Block-specific tokens
  27. 27. an expression can consist of many different things
  28. 28. strings, variables, arrays, functions, filters, tests, subscripts...
  29. 29. strings, numbers and variables » like any language, strings, numbers and variables are commonplace
  30. 30. arrays and hashes » arrays use [], hashes use {}
  31. 31. operators » twig has operators just like PHP, but extensible and with some extras
  32. 32. filters » a filter always follows a pipe (|) and modifies the value that precedes it » a filter may or may not take arguments
  33. 33. functions » just like PHP, returns a value based on some input
  34. 34. twig expresses himself » strings, numbers and variables » arrays and hashes » operators » filters » functions hey – its simple like PHP, but flexible...
  35. 35. act 4 twig on the battlefield
  36. 36. the test... » a template that displays a list of “widgets” in odd-even rows » render tags and other info about each widget » create basic, clean pagination
  37. 37. block tagprint tag
  38. 38. Lets clean things up
  39. 39. filter to title-case the widget namefilters to strip tagsand shorten thewidgets description
  40. 40. your presenter is lying to you... » the “truncate” filter isnt part of Twig, but is available via a repository of extensions » Everything in Twig is loaded via an Extension (even the core stuff) » Extensions are easy to use and create – well prove it later *
  41. 41. odd/even classes like a boss
  42. 42. Twig function cycles throughthe given array items Special variable available inside all “for” loops. The “loop” variable knows other tricks like “loop.last” and “loop.revindex”
  43. 43. flex some filters
  44. 44. apply the date filterchain filters to turn a list of tagsinto a comma-separated list
  45. 45. convenience, readability
  46. 46. even managementknows what this does
  47. 47. pagination?
  48. 48. function returns a positive radius of numbers around the center (e.g. 3, 4, 5, 6, 7)the awesome loop variable tells uswhen were in the last iteration
  49. 49. the audacity: your speaker just lied again » but.... the “radius” function doesnt actually exist in Twig. but since its pretty handy, lets create it!
  50. 50. act 5 Twig extensions
  51. 51. Twig extensions everything in Twig is loaded by an “Extension” class: » filters » functions » operators » tests (e.g. divisbleby) » custom tags Extensions are EASY!
  52. 52. step 1: create a class that extends Twig_Extension
  53. 53. step 2: tell Twig about the extension
  54. 54. step 2: tell Twig about the extension (Symfony2)* dont forget to import this file from your applications configuration (i.e. app/config/config.yml)
  55. 55. step 3: add some guts to the extension class
  56. 56. step 4: Celebrate!!!* buy a round of drinks* watch the sun set* kiss that cute girl at the coffee shop
  57. 57. I want more! ok great – do some reading! » » seriously – the Twig docs are quite excellent
  58. 58. act 6 after-dinner mint mmm
  59. 59. screw with the Twig syntax » because Twig is totally sandboxed (i.e. you control exactly what can and cannot be done inside a template, Twig is a perfect fit for a CMS. » and if Twigs syntax scares your clients... change it!
  60. 60. cool, what about debugging?a debug tag ships with the twig-extensions
  61. 61. the “debug” extension is available for youin Symfony2 - just enable it
  62. 62. prints every variable availableprints the foo variable
  63. 63. but weve only justscratched the surface
  64. 64. theres much much more » inheritance name can be: * an item on an array * property on an object » macros (reusable code bits) * getName() » subscripts or you can force it to *just* fetch “name” as an array item
  65. 65. Twig, hes a people-person » Twigs loves contributions, so *get involved*! » » »
  66. 66. thank you Ryan Weaver iostudio @weaverryan ryan [at] reach out to me – id love to hear from you!comments, feedback, questions