Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

41
Twig & Drupal 8 Monday, August 26, 13

Transcript of Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

Page 1: Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

Twig &

Drupal 8

Monday, August 26, 13

Page 2: Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

Arto Iijalainen

• Druid Oy (GOLD SPONSOR \o/)

• From Finland

• Drupal backend developer

• Drupal.org: Sir-Arturio

• Twitter: @arto_iijalainen, @druidfi

Monday, August 26, 13

Page 3: Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

Joonas Pajunen

• Fraktio Oy

• Symfony2 Developer

• Twitter: joonsp

Monday, August 26, 13

Page 4: Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

Twig

Monday, August 26, 13

Page 5: Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

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

Page 6: Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

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

Page 7: Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

<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

Page 8: Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

<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

Page 9: Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

<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

Page 10: Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

<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

Page 11: Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

Language features

• control structures

• expressions & tests

• variables

• logic

• math

Monday, August 26, 13

Page 12: Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

<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

Page 13: Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

Variable access

• array key $foo[‘bar’]

• object property $foo->bar

• getBar or isBar function $foo->getBar(), $foo->isBar()

{{ foo.bar }}

Monday, August 26, 13

Page 14: Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

Composability

• block

• extends

• include

• use

Monday, August 26, 13

Page 15: Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

{# 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

Page 16: Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

Filters, functions

{{ post.published_at|date("m/d/Y") }}

{{ [“alice”, “bob”]|first|upper }} -> ALICE

{{ random(['apple', 'orange', 'citrus']) }}

Monday, August 26, 13

Page 17: Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

Extensibility

• custom functions, tags, filters

• can override and customize syntax

Monday, August 26, 13

Page 18: Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

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

Page 19: Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

$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

Page 20: Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

Speed

• Twig template -> optimized PHP -> rendered HTML

• Caching at different levels

• C-extension available

Monday, August 26, 13

Page 21: Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

Documentation

• Extensive documentation available!

• http://twig.sensiolabs.org/documentation

Monday, August 26, 13

Page 22: Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

Good IDE highlight support

• phpstorm

• netbeans

• eclipse

• sublime text

• notepad++

• vim

• textmate

• etc …

Monday, August 26, 13

Page 23: Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

WhyD8

+ ?Monday, August 26, 13

Page 24: Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

New theme layer!D8

Monday, August 26, 13

Page 25: Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

Why do we need a new theme layer?

What’s wrong with D7’s theme layer?or

Monday, August 26, 13

Page 26: Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

http://www.smile-day.net/wp-content/uploads/2012/03/Winking-Smiley-Face1.jpg

Monday, August 26, 13

Page 27: Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

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

Page 28: Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

PHPtemplate is insecure<?php db_query("DROP TABLE {node}"); unlink('sites/default/files/myfilename.pdf'); ?>

Monday, August 26, 13

Page 29: Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

Monday, August 26, 13

Page 30: Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

PHPtemplate is insecure<?php db_query("DROP TABLE {node}"); unlink('sites/default/files/myfilename.pdf'); ?>

Not possible in Twig! \o/

Monday, August 26, 13

Page 31: Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

Twig - Security

• autoescape by default

• sandbox

Monday, August 26, 13

Page 32: Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

Template language is Drupal-only

Twig is proudly found elsewhere!No need to reinvent the wheel.

Monday, August 26, 13

Page 33: Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

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

Page 34: Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

Theme system is overly complex

http://www.slideshare.net/nyccamp/a-new-theme-layer-for-drupal-8

Monday, August 26, 13

Page 35: Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

Theme system is overly complex

http://www.slideshare.net/nyccamp/a-new-theme-layer-for-drupal-8

Monday, August 26, 13

Page 36: Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

Two ways of creating markup

theme_admin_view();admin-view.tpl.php

Only Twig templates left!admin-view.html.twig

Monday, August 26, 13

Page 37: Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

Too many and too cluttered templates

Templates will be cleaned and consolidated in the refactoring process.

Monday, August 26, 13

Page 38: Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

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

Page 39: Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

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

Page 40: Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

Conclusions …

Monday, August 26, 13

Page 41: Twig & D8 - DrupalCamp Baltics 2013 - Tallinn

Thanks!Questions?

Monday, August 26, 13