Twig & D8 - DrupalCamp Baltics 2013 - Tallinn
Upcoming SlideShare
Loading in...5
×
 

Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

on

  • 2,749 views

 

Statistics

Views

Total Views
2,749
Views on SlideShare
2,741
Embed Views
8

Actions

Likes
0
Downloads
4
Comments
0

3 Embeds 8

http://symfony2developer.com 3
http://ipv6.symfony2developer.com 3
https://twitter.com 2

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Twig & D8 - DrupalCamp Baltics 2013 - Tallinn Twig & D8 - DrupalCamp Baltics 2013 - Tallinn Presentation Transcript

  • Twig & Drupal 8 Monday, August 26, 13
  • Arto Iijalainen • Druid Oy (GOLD SPONSOR o/) • From Finland • Drupal backend developer • Drupal.org: Sir-Arturio • Twitter: @arto_iijalainen, @druidfi Monday, August 26, 13
  • Joonas Pajunen • Fraktio Oy • Symfony2 Developer • Twitter: joonsp Monday, August 26, 13
  • Twig Monday, August 26, 13
  • Overview • Twig in general • Why Twig is in Drupal 8? • Twig’s solutions to Drupal’s problems • Current state of the project & conclusion Monday, August 26, 13
  • Templating engine • Used in Symfony2 and other projects • Twig is not a Symfony component • Originates from the Python world (Django and Jinja Tempaltes) • Originally by Armin Ronacher, today maintained by Fabien Potencier Monday, August 26, 13
  • <body> <ul id="navigation"> {% for item in navigation %} <li><a href="{{ item.href }}">{{ item.caption }}</a></li> {% endfor %} </ul> <h1>My Webpage</h1> {{ a_variable }} {# <p> unimplemented feature </p> #} </body> Syntax Monday, August 26, 13
  • <body> <ul id="navigation"> {% for item in navigation %} <li><a href="{{ item.href }}">{{ item.caption }}</a></li> {% endfor %} </ul> <h1>My Webpage</h1> {{ a_variable }} {# <p> unimplemented feature </p> #} </body> • print {{ }} Syntax Monday, August 26, 13
  • <body> <ul id="navigation"> {% for item in navigation %} <li><a href="{{ item.href }}">{{ item.caption }}</a></li> {% endfor %} </ul> <h1>My Webpage</h1> {{ a_variable }} {# <p> unimplemented feature </p> #} </body> • print {{ }} • execute statements {% %} Syntax Monday, August 26, 13
  • <body> <ul id="navigation"> {% for item in navigation %} <li><a href="{{ item.href }}">{{ item.caption }}</a></li> {% endfor %} </ul> <h1>My Webpage</h1> {{ a_variable }} {# <p> unimplemented feature </p> #} </body> • print {{ }} • execute statements {% %} • comment {# #} Syntax Monday, August 26, 13
  • Language features • control structures • expressions & tests • variables • logic • math Monday, August 26, 13
  • <ul> {% for user in users %} {% if loop.index is divisibleby(2) %} <li class=”even”> {% else%} <li class=”odd”> {% endif %} {{ user.username }} </li> {% else %} <li>no users</li> {% endfor %} </ul> Monday, August 26, 13
  • Variable access • array key $foo[‘bar’] • object property $foo->bar • getBar or isBar function $foo->getBar(), $foo->isBar() {{ foo.bar }} Monday, August 26, 13
  • Composability • block • extends • include • use Monday, August 26, 13
  • {# base.html.twig #} <head> {% block head %} {% endblock %} </head> <body> <div id="content"> {% block content %}{% endblock %} </div> </div> {# page.html.twig #} {% extends "base.html.twig" %} {% block content %} <h1>Index</h1> <p class="important"> Welcome to my awesome homepage. </p> {% include "footer.html.twig" %} {% endblock %} Monday, August 26, 13
  • Filters, functions {{ post.published_at|date("m/d/Y") }} {{ [“alice”,“bob”]|first|upper }} -> ALICE {{ random(['apple', 'orange', 'citrus']) }} Monday, August 26, 13
  • Extensibility • custom functions, tags, filters • can override and customize syntax Monday, August 26, 13
  • class MoneyExtension extends Twig_Extension {     public function getFunctions() {         return array(             'cents_to_euros' => new Twig_Function_Method($this, 'centsToEuros')         );     }     public function centsToEuros($cents) {              return round($cents/100, 2);     }     public function getName() {         return 'money';     } } Example: creating a custom function Monday, August 26, 13
  • $twig = new Twig_Environment($loader); $twig->addExtension(new MoneyExtension()); {{ cents_to_euros(250) }} € becomes: 2.5 € Example: creating a custom function (usage) Monday, August 26, 13
  • Speed • Twig template -> optimized PHP -> rendered HTML • Caching at different levels • C-extension available Monday, August 26, 13
  • Documentation • Extensive documentation available! • http://twig.sensiolabs.org/documentation Monday, August 26, 13
  • Good IDE highlight support • phpstorm • netbeans • eclipse • sublime text • notepad++ • vim • textmate • etc … Monday, August 26, 13
  • Why D8 + ? Monday, August 26, 13
  • New theme layer! D8 Monday, August 26, 13
  • Why do we need a new theme layer? What’s wrong with D7’s theme layer? or Monday, August 26, 13
  • http://www.smile-day.net/wp-content/uploads/2012/03/Winking-Smiley-Face1.jpg Monday, August 26, 13
  • Flaws in D7’s theme layer • PHPtemplate is insecure • Template language is Drupal-only (PHPtemplate + drupalisms) • Lots of different ways to address variables • Theme system is overly complex • Two ways of creating markup: templates and theme functions • Too many and too cluttered templates Monday, August 26, 13
  • PHPtemplate is insecure <?php db_query("DROP TABLE {node}"); unlink('sites/default/files/myfilename.pdf'); ?> Monday, August 26, 13
  • Monday, August 26, 13
  • PHPtemplate is insecure <?php db_query("DROP TABLE {node}"); unlink('sites/default/files/myfilename.pdf'); ?> Not possible in Twig! o/ Monday, August 26, 13
  • Twig - Security • autoescape by default • sandbox Monday, August 26, 13
  • Template language is Drupal-only Twig is proudly found elsewhere! No need to reinvent the wheel. Monday, August 26, 13
  • Lots of different ways to address variables • array key • object property • getBar or isBar function {{ foo.bar }} • $foo[‘bar’] • $foo->bar • $foo->getBar() $foo->isBar() PHPtemplate Twig Monday, August 26, 13
  • Theme system is overly complex http://www.slideshare.net/nyccamp/a-new-theme-layer-for-drupal-8 Monday, August 26, 13
  • Theme system is overly complex http://www.slideshare.net/nyccamp/a-new-theme-layer-for-drupal-8 Monday, August 26, 13
  • Two ways of creating markup theme_admin_view(); admin-view.tpl.php Only Twig templates left! admin-view.html.twig Monday, August 26, 13
  • Too many and too cluttered templates Templates will be cleaned and consolidated in the refactoring process. Monday, August 26, 13
  • Flaws in D7’s theme layer • PHPtemplate is insecure • Template language is Drupal-only (PHPtemplate + drupalisms) • Lots of different ways to address variables • Theme system is overly complex • Two ways of creating markup: templates and theme functions • Too many and too cluttered templates } } Twig will fix Theme layer will fix Monday, August 26, 13
  • Current development status • *DONE* Twig is now an official template engine in D8 core • *DONE* Templates are being converted on Twig • *WAITING* Twig as a main template engine • *IN PROGRESS* Markup refactoring • … Creating Dream Markup • … Rely on Twig auto-escape • … Finish template suggenstions • HELP NEEDED! Monday, August 26, 13
  • Conclusions … Monday, August 26, 13
  • Thanks! Questions? Monday, August 26, 13