74
being dangerous with Twig a short story by Ryan Weaver March 4th, 2011 Symfony Live 2011

Being Dangerous with Twig (Symfony Live Paris)

Embed Size (px)

DESCRIPTION

Twig - the PHP templating engine - is easy to use, friendly and extensible. This presentation will introduce you to Twig and show you how to extend it to your bidding.

Citation preview

Page 1: Being Dangerous with Twig (Symfony Live Paris)

being dangerous with Twiga short story by Ryan Weaver

March 4th, 2011

Symfony Live 2011

Page 2: Being Dangerous with Twig (Symfony Live Paris)

A 5-step guide to using Twig – the fast, secure andextensible PHP templating engine – to create clean

template code, leverage powerful filters, make your designerswrite you love letters, write template functions that don't clog up your

global PHP namespace, take advantage of true template inheritance, hang out with Django programmers and be able to talk template syntax, enjoy true and non-invasive output 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 asimple {{, 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 he's misunderstoodhow 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 WeaverSymfony Live 2011

being dangerous with Twig

Page 3: Being Dangerous with Twig (Symfony Live Paris)

@weaverryan

» symfony

» symfony documentation

» collaboration

» the lovely @leannapelham

Page 4: Being Dangerous with Twig (Symfony Live Paris)

● Advertising & Integrated Marketing Solutions

• coming to you from» Nashville, TN» Washington, D.C.

• 150 employees

• and we're hiring!

iostudio: flying the symfony flag

Page 5: Being Dangerous with Twig (Symfony Live Paris)

Why Twig?

act 1

Page 6: Being Dangerous with Twig (Symfony Live Paris)

because template engines are awesome

Page 7: Being Dangerous with Twig (Symfony Live Paris)
Page 8: Being Dangerous with Twig (Symfony Live Paris)

Template engines

A template engine allows you to render apresentation (HTML, XML, etc) via a templatein a controlled environment

It should allow special functionality thatmakes creating templates easier (helpers,template inheritance, etc)

Page 9: Being Dangerous with Twig (Symfony Live Paris)

a template engineis a tool

Page 10: Being Dangerous with Twig (Symfony Live Paris)

why not just renderPHP templates?

Page 11: Being Dangerous with Twig (Symfony Live Paris)

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

Page 12: Being Dangerous with Twig (Symfony Live Paris)

we need the brevity of templates

with the isolation of object-oriented programming

Page 13: Being Dangerous with Twig (Symfony Live Paris)

so give me some Twiggy pudding

Twig is:» fast» flexible» concise» secure» fully-featured» Extensible» designer-friendly

http://www.twig-project.org

Twig offers:» true inheritance» real output escaping» tons of filters» custom tags» great documentation» global variables» the “for-else” control

Page 14: Being Dangerous with Twig (Symfony Live Paris)

Twig is concise

and each template compiles to an actual

PHP object

Page 15: Being Dangerous with Twig (Symfony Live Paris)

seeing is believing

Page 16: Being Dangerous with Twig (Symfony Live Paris)
Page 17: Being Dangerous with Twig (Symfony Live Paris)
Page 18: Being Dangerous with Twig (Symfony Live Paris)
Page 19: Being Dangerous with Twig (Symfony Live Paris)

a moment oftemplating zen

Page 20: Being Dangerous with Twig (Symfony Live Paris)

“The template system is meant to express presentation, not program

logic.”

- Django documentation

Page 21: Being Dangerous with Twig (Symfony Live Paris)

Twig can easily be used anywhere

Page 22: Being Dangerous with Twig (Symfony Live Paris)
Page 23: Being Dangerous with Twig (Symfony Live Paris)

act 2

Twig's simple life

Page 24: Being Dangerous with Twig (Symfony Live Paris)

Twig's three tags

Twig parses just three simple tags:

» comment tag

» print tag

» block tag

Page 25: Being Dangerous with Twig (Symfony Live Paris)

a. do nothing (comment tags)

{# comment #}» totally ignored when rendered

Page 26: Being Dangerous with Twig (Symfony Live Paris)

b. say something (print tags)

{{ 'print me!' }}» prints the given expression» think “<?php echo”

» If you're ultimately printing something, use this tag

Page 27: Being Dangerous with Twig (Symfony Live Paris)

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 you're *doing* something and not *printing* something, use this tag

Page 28: Being Dangerous with Twig (Symfony Live Paris)

Twig's three tags

» do nothing: {# comment tag #}

» say something: {{ print tag }}

» do something: {% block tag %}

it's just that simple

Page 29: Being Dangerous with Twig (Symfony Live Paris)

act 3

Everything is anexpression

Page 30: Being Dangerous with Twig (Symfony Live Paris)

expressions: Twig guts

» like PHP, most everything inside a tag is an expression

» expressions are the most interesting and flexible part of Twig

Page 31: Being Dangerous with Twig (Symfony Live Paris)

Expressions Block names

Block-specific tokens

Page 32: Being Dangerous with Twig (Symfony Live Paris)

an expression can consist of many different things

Page 33: Being Dangerous with Twig (Symfony Live Paris)

strings, variables, arrays, functions, filters, tests,

subscripts...

Page 34: Being Dangerous with Twig (Symfony Live Paris)

strings, numbers and variables

» like any language, strings, numbers and variables are commonplace

Page 35: Being Dangerous with Twig (Symfony Live Paris)

arrays and hashes

» arrays use [], hashes use {}

Page 36: Being Dangerous with Twig (Symfony Live Paris)

operators

» twig has operators just like PHP, but extensible and with some extras

Page 37: Being Dangerous with Twig (Symfony Live Paris)

filters

» a filter always follows a pipe (|) and modifies the value that precedes it

» a filter may or may not take arguments

Page 38: Being Dangerous with Twig (Symfony Live Paris)

functions

» just like PHP, returns a value based on some input

Page 39: Being Dangerous with Twig (Symfony Live Paris)

twig expresses himself

» strings, numbers and variables

» arrays and hashes

» operators

» filters

» functions

hey – it's simple like PHP, but flexible...

Page 40: Being Dangerous with Twig (Symfony Live Paris)

act 4

twig on the battlefield

Page 41: Being Dangerous with Twig (Symfony Live Paris)

the test...

» a template that displays a list of “widgets” inodd-even rows

» render tags and other info about each widget

» create basic, clean pagination

Page 42: Being Dangerous with Twig (Symfony Live Paris)

Resources/views/Main/widgets.html.twig

inside the SfLivePlayBundle

Page 43: Being Dangerous with Twig (Symfony Live Paris)

block tag

print tag

Page 44: Being Dangerous with Twig (Symfony Live Paris)

Let's clean things up

Page 45: Being Dangerous with Twig (Symfony Live Paris)

filter to title-casethe widget name

filters to strip tagsand shorten thewidget's description

Page 46: Being Dangerous with Twig (Symfony Live Paris)

your presenter is lying to you...

» the “truncate” filter isn't part of Twig, butis 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 – we'llprove it later

* https://github.com/fabpot/Twig-extensions

Page 47: Being Dangerous with Twig (Symfony Live Paris)

odd/even classeslike a boss

“really easily”

Page 48: Being Dangerous with Twig (Symfony Live Paris)

Twig function cycles throughthe given array items

Special variable available insideall “for” loops.

The “loop” variable knows othertricks like “loop.last” and“loop.revindex”

Page 49: Being Dangerous with Twig (Symfony Live Paris)

flex some filters

Page 50: Being Dangerous with Twig (Symfony Live Paris)

apply the date filter

chain filters to turn a list of tagsinto a comma-separated list

Page 51: Being Dangerous with Twig (Symfony Live Paris)

convenience,readability

Page 52: Being Dangerous with Twig (Symfony Live Paris)

even managementknows what this does

Page 53: Being Dangerous with Twig (Symfony Live Paris)

pagination?

Page 54: Being Dangerous with Twig (Symfony Live Paris)

function returns a positiveradius of numbers around thecenter (e.g. 3, 4, 5, 6, 7)

the awesome loop variable tells uswhen we're in the last iteration

Page 55: Being Dangerous with Twig (Symfony Live Paris)

the audacity: your speaker just lied again

» but.... the “radius” function doesn't actuallyexist in Twig.

but since it's pretty handy, let's create it!

Page 56: Being Dangerous with Twig (Symfony Live Paris)

act 5

Twig extensions

Page 57: Being Dangerous with Twig (Symfony Live Paris)

Twig extensions

everything in Twig is loaded by an “Extension” class:

» filters

» functions

» operators

» tests (e.g. divisbleby)

» custom tags

Extensions are EASY!

Page 58: Being Dangerous with Twig (Symfony Live Paris)

step 1: create a class that extends Twig_Extension

Page 59: Being Dangerous with Twig (Symfony Live Paris)

step 2: tell Twig about the extension

Page 60: Being Dangerous with Twig (Symfony Live Paris)

step 2: tell Twig about the extension (Symfony2)

* don't forget to import this file from your application's configuration (i.e. app/config/config.yml)

Page 61: Being Dangerous with Twig (Symfony Live Paris)

step 3: add some guts to the extension class

Page 62: Being Dangerous with Twig (Symfony Live Paris)

* buy a round of drinks

* watch the sun set

* ask a cute stranger out to dinner

step 4: Celebrate!!!

Page 63: Being Dangerous with Twig (Symfony Live Paris)

I want more!

ok great – do some reading!

» http://www.twig-project.org/doc/advanced.html

» http://www.twig-project.org/doc/extensions.html

seriously – the Twig docs are quite excellent

Page 64: Being Dangerous with Twig (Symfony Live Paris)

act 6

after-dinner mint

mmm

Page 65: Being Dangerous with Twig (Symfony Live Paris)

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 Twig's syntax scares your clients... change it!

Page 66: Being Dangerous with Twig (Symfony Live Paris)
Page 67: Being Dangerous with Twig (Symfony Live Paris)

cool, what aboutdebugging?

a debug tag ships withthe twig-extensions

Page 68: Being Dangerous with Twig (Symfony Live Paris)

the “debug” extension is available for youin Symfony2 - just enable it

Page 69: Being Dangerous with Twig (Symfony Live Paris)

prints every variableavailable

prints the foo variable

Page 70: Being Dangerous with Twig (Symfony Live Paris)

but we've only justscratched the surface

Page 71: Being Dangerous with Twig (Symfony Live Paris)

there's much much more

» inheritance

» macros (reusable code bits)

» subscripts

name can be: * an item on an array * property on an object * getName()

or you can force it to*just* fetch “name”as an array item

Page 72: Being Dangerous with Twig (Symfony Live Paris)

Twig, he's a people-person

» Twig loves contributions, so *get involved*!

» https://github.com/fabpot/twig

» https://github.com/fabpot/twig-extensions

» http://groups.google.com/group/twig-users

Page 73: Being Dangerous with Twig (Symfony Live Paris)

The Symfony documentation wants you!

» The Symfony2 documentation is a community effort

» The best way as a beginner to get involved

immediately!

» Talk to me!!!

Page 74: Being Dangerous with Twig (Symfony Live Paris)

Ryan [email protected] [at] thatsquality.com

thank you

*do* reach out to me – i'd love to talk nerd with you

http://joind.in/2765

comments, feedback, questions