On Github mortendk / drupal8-twig-drupalconaustin
i'm So Sörry
i'm Danish
geek Röyale - copenhagens finest themes
From the frontend perspective ?
sorry devs you can moan later<div class="foo bar baz whatever">
<div class="foo bar baz whatever">
<div class="foo bar baz whatever">
<h1 class="pane-title">hello im drupal</h1>
<div class="node node-type node-viewmode-argh">
always add another div
</div>
</div>
</div>
</div>
<style media="all">
@import url("sites/modules/system/system.base.css?mz4mz0");
@import url("sites/modules/system/system.menus.css?mz4mz0");
@import url("sites/modules/system/system.messages.css?mz4mz0");
@import url("sites/modules/system/system.theme.css?mz4mz0");</style>
<style media="all">
@import url("sites/modules/contextual/contextual.css?mz4mz0");
</style>
<style media="all">
@import url("sites/modules/aggregator/aggregator.css?mz4mz0");
@import url("sites/modules/book/book.css?mz4mz0");
@import url("sites/modules/comment/comment.css?mz4mz0");
@import url("sites/sites/all/modules/contrib/date/date_api/date.css?mz4mz0");
@import url("sites/modules/field/theme/field.css?mz4mz0");
@import url("sites/modules/node/node.css?mz4mz0");
@import url("sites/sites/all/modules/contrib/picture/picture_wysiwyg.css?mz4mz0");
@import url("sites/modules/poll/poll.css?mz4mz0");
@import url("sites/modules/search/search.css?mz4mz0");
@import url("sites/sites/all/modules/contrib/search_krumo/search_krumo.css?mz4mz0");
@import url("sites/modules/user/user.css?mz4mz0");
@import url("sites/sites/all/modules/contrib/video_filter/video_filter.css?mz4mz0");
@import url("sites/modules/forum/forum.css?mz4mz0");
@import url("sites/sites/all/modules/contrib/views/css/views.css?mz4mz0");
@import url("sites/sites/all/modules/contrib/admin_menu/admin_menu.css?mz4mz0");
@import url("sites/sites/all/modules/contrib/admin_menu/admin_menu.uid1.css?mz4mz0");
</style>
<style media="all">
@import url("sites/sites/all/modules/contrib/ctools/css/ctools.css?mz4mz0");
@import url("sites/sites/all/modules/contrib/panels/css/panels.css?mz4mz0");
@import url("sites/sites/all/modules/contrib/panels/plugins/layouts/twocol_stacked/twocol_stacked.css?mz4mz0");
@import url("sites/sites/all/themes/mothership/mothership/templates/panels//mothership-html5page/mothership-html5page.admin.css?mz4mz0");
</style>
<style media="all">
@import url("sites/themes/stark/layout.css?mz4mz0");
</style>
<div class="field field-something field-even_more another-field-cause-im-drupal">
wait im just a piece of data
</div>
but but but but but what if...
Themers are not that Dumb
or 666 reasons why Drupal8 is better than Drupal7
<header role="banner">
<nav>
<a href="/">home</a> | <a href="/info">info</a>
</nav>
</header>
<main>
<div>
...
</div>
</main>
<footer role="">
</footer>
75% less ID's *
<body class="html one-sidebar sidebar-first not-front logged-in
page-node page-node- page-node-4 node-type-fieldtest ">
<body class=" how-about-we_figure_that-out ">
.notification {
/* general styles for all notifications */
}
.notification--info {
/* blue color adjustments */
}
provide visibility
themes now lives in "/themes"
or "sites/ *** /themes"
modulename/templates/*.html.twig
$settings['twig_debug'] = TRUE;
settings.php
the twig templates are compiled
(not to themers: its the same thingie that the compile thingie do)
<article class="foo foo-whateverdrupal">
<article class="foo foo-inner foo-whateverdrupal">
....
</article>
</article>
HARD coded
is now a block
its dead easy
/*
comment
*/
<?php print $foo ; ?>
phptemplate
{# comment #}
{{ foo }}
twig
/*
so php template
Now where is that value again
*/
<?php print $foo['bar']['UND']->baz['what']->thefuck['seriously'] ?>
phptemplate
{# hello twig can you find valdo ? #}
{{ foo.bar.baz.done.with.this.shit }}
{{ foo['bar'] }}
{% functions %}
Twig
<?php if($foo): ?>
<?php print $var; ?>
<?php endif; ?>
phptemplate
{% if foo %}
{{ var }}
{% endif %}
twig
<h2>Team Awesome </h2>
<ul>
{% for user in users %}
<li>{{ user.username}}</li>
{% endfor %}
</ul>
twig
<h2>Team Awesome </h2>
<ul>
<li>cottset</li>
<li>joel</li>
<li>jen</li>
<li>mark carver</li>
<li>mortendk</li>
</ul>
drupal8
{{ loop.length }}
{{ loop.first }}
{{ loop.last }}
{{ loop.index }}
{% if loop.first %}
...
{% elseif loop.index == 2 %}
...
{% elseif loop.last %}
...
{% endif %}
{% set foo %}
count-{{ loop.index }}
{% endset %}
{{ foo }},
twig
count-1,count-2, count-3,
output
<p>
{% filter upper %}
uppercase for the win
{% endfilter %}
</p>
<p>
UPPERCASE FOR THE WIN
</p>
{{ foo|dostufftofoo }}
{# name = <a hred="foo">morten</a> #}
{{ name|striptags|title }}
twig
Morten
name: drupal7themename
description = This is my epic D7 theme
screenshot = screenshot.png
engine = phptemplate
core = 7.x
php = 5.2
regions[header] = Header
regions[logo] = Logo
regions[menu] = Menu
regions[messages] = Messages
regions[content] = Content
regions[footer] = Footer
stylesheets[all][] = css/style.css
#FOAD fix
stylesheets[all][] = donteverloadmeagain.css
name: drupal8themename
type: theme
description: This is my epic D8 theme
package: Core
core: 8.x
stylesheets:
all:
- css/layout.css
print:
- css/print.css
stylesheets-remove:
- system.theme.css
- user.icons.css
- stuffidontwant.css
regions:
header: Header
logo: Logo
menu: Menu
messages: Messages
content: Content
footer: Footer
# engine: phptemplate
# engine: phptemplate
themename.info
its now build in
stylesheets[all][] = css/style.css
#FOAD fix
;stylesheets[all][] = donteverloadmeagain.css
stylesheets[all][] = system.theme.css
stylesheets[all][] = user.icons.css
stylesheets[all][] = stuffidontwant.css
drupal 7
stylesheets-remove:
- system.theme.css
- user.icons.css
- stuffidontwant.css
drupal 8
<?php if ($page['footer']): ?>
<footer role="contentinfo">
<?php print render($page[footer]); ?>
</footer>
<?php endid ?>
<?php print render($page[region]); ?>
{% if page.footer %}
<footer role="contentinfo">
{{ page.footer}}
</footer>
{% endif %}
twig: {{ page.region }}
<div{{ attributes }}>
{{ title_prefix }}
{% if label %}
<h2{{ title_attributes }}>{{ label }}</h2>
{% endif %}
{{ title_suffix }}
<div{{ content_attributes }}>
{{ content }}
</div>
</div>
block.twig
<nav class="{{ attributes.class }}" role="{{ attributes.role}}">
{{ title_prefix }}
{% if label %}
<h2{{ title_attributes }}>{{ label }}</h2>
{% endif %}
{{ title_suffix }}
{{ content }}
</nav>
block--system-menu-block.html.twig
theme hook suggestions
<div class="block blockmore blockmorecauseofdrupal">...</div>
{{ attributes.class |replace( {'block': '' }) }}
block.html.
<nav class="{{ attributes.class }}" role="{{ attributes.role}}">
{{ title_prefix }}
{% if label %}
<h2{{ title_attributes }}>{{ label }}</h2>
{% endif %}
{{ title_suffix }}
{{ content }}
</nav>
block--system-menu-block.html.twig
<nav class="l-foobar mainmenu" role="navigation">
... content ...
</nav>
Done
<article {{attributes}}=""> ... </article>
<article class="{{attributes.class}}" {{attributes}}="">
...
</article>
<article class="{{ attributes.class }}" role="{{ attributes.role }}" {{="" attributes="" }}="">
....
</article>
<article class="foo {{ attributes.class}}" {{attributes}}="">
foo
</article>
.twig
<article class="foo field-foo" role="something">
foo
</article>
drupal
the designer is an idiot
and they wanna support ie "something"
<div class="tags">
<span>3 tags:</span>
<a href="#" class="odd">foo</a>,
<a href="#" class="even thedesignerisanidiot">bar</a>,
<a href="#" class="odd">baz</a>.
</div>
the markup
.thedesignerisanidiot{
color: green;
font-style:italic;
}
<article class="...">
....
{{ content.field_tags}}
{{ content|without('field_tags') }}
</article>
node.html.twig
{# Start the loop #}
{% for delta, item in items %}
{# create a class var #}
{% set class %}
{# odd even #}
{{- cycle(["even", "odd"], delta) }}
{# count-x #}
count-{{ loop.index -}}"
{% endset %}
<a href="#" class="{{class}}">{{item}}</a>,
{# end the loop #}
{% endfor %}
field--field-tags.html.twig
<a href="#" class="odd count-1">Odin</a>,
<a href="#" class="even count-2">Thor</a>,
<a href="#" class="odd count-3">Freya</a>,
drupal8
{# first loop #}
{% if loop.first %}
{# set tags / tag #}
<span>
{% if loop.length > 1 %}
{{ loop.length }}
tags:
{% else %}
tag:
{% endif %}
<span>
...
</span></span>
field--field-tags.html.twig
<span>3 tags:</span>
{% if loop.first %}
...
{% elseif loop.index == 2 %}
<a href="#" class="thedesignerisanidiot {{class}}">{{item}}</a>,
...
{# end the loop #}
{% endfor %}
field--field-tags.html.twig
<a href="#" class="odd count-1">Odin</a>
<a href="#" class="thedesignerisanidiot even count-2">Thor</a>
<a href="#" class="odd count-3">Freya</a>
{% if loop.first %}
<span>
{% if loop.length > 1 %}
{{ loop.length }} tags:
{% else %}
tag:
{% endif %}
<span>
<a href="#" class="{{class}}">{{item}}</a>,
{% elseif loop.index == 2 %}
<a href="#" class="thedesignerisanidiot {{class}}">{{item}}</a>,
{% elseif loop.last %}
<a href="#" class="{{class}}">{{item}}</a>.
{% else %}
<a href="#" class="{{class}}">{{item}}</a>,
{% endif %}
</span></span>
field--field-tags.html.twig
3 tags:
<a href="#" class="odd count-1">Odin</a>,
<a href="#" class="thedesignerisanidiot even count-2">Thor</a>,
<a href="#" class="odd count-3">Freya</a>.
{% block foobar %}
{# i can be something else #}
{% endblock %}
{% block headerblock %}
change me if im on the frontpage
{% endblock %}
page.twig.html
{% extends "themes/yggdrasil/templates/page.html.twig" %}
{% block headerblock %}
Im on the frontpage!
{% endblock %}
page--front.html.twig
{{ 'last checked: @time ago'| t({'@time':time}) }}
{% trans %}
Hi im a swede and i speak funny: Höidy hoeeeydi
{% endtrans %}
cottser joel jen lampton mortendk ruben mark carver fabianx marc Drummond the real Lewis Newman
TWIG documentation drupaltwig.org http://mortendk.github.io/drupal8-twig-chicago-2014
https://drupaltheming2014.webform.com/form/11517