Vergelijking van de PHPTemplate- en Twig-paradigma’s
Over Twig
Twig is een gecompileerde template-taal gebaseerd op PHP. Wanneer je webpagina wordt weergegeven, neemt de Twig-engine het sjabloon en zet dit om in een “gecompileerd” PHP-sjabloon dat wordt opgeslagen in een beveiligde map op sites/default/files/php/twig. De compilatie gebeurt één keer, sjabloonbestanden worden gecachet voor hergebruik en opnieuw gecompileerd bij het legen van de Twig-cache.
De Drupal Twig-initiatie heeft dezelfde motivatie als de Symfony-initiatie: een moderne, krachtige, OOP-gebaseerde engine introduceren die ontwikkelaars helpt zich op de juiste manier op Drupal te concentreren.
1. Docblock
PHPTemplate:
<?php /** * @file * File description */ ?>
Twig:
{#
/**
* @file
* File description
*/
#}
2. Bestands- en functienamen
PHPTemplate-bestand: node--article.tpl.php
Twig-bestand: node--article.html.twig
PHPTemplate-functie: THEME_node_links()
Twig-bestand: node-links.html.twig
3. Variabelen
Een variabele printen:
PHPTemplate: <div class="content"><?php print $content; ?></div>
Twig: <div class="content">{{ content }}</div>
Een hash-sleutelelement printen [1]
PHPTemplate: <?php print $item['#item']['alt']; ?>
Twig: {{ item['#item'].alt }}
Een variabele toewijzen:
PHPTemplate: <?php $custom_var = $content->comments; ?>
Twig: {% set custom_var = content.comments %}
Een array toewijzen:
PHPTemplate: <?php $args = array('@author' => $author, '@date' => $created); ?>
Twig: {% set args = {'@author': author, '@date': created} %}
4. Condities
PHPTemplate: <?php if ($content->comments): endif; ?>
Twig: {% if content.comments %} {% endif %}
PHPTemplate: <?php if (!empty($content->comments)): endif; ?>
Twig: {% if content.comments is not empty %} {% endif %}
PHPTemplate: <?php if (isset($content->comments)): endif; ?>
Twig: {% if content.comments is defined %} {% endif %}
PHPTemplate: <?php if ($count > 0): endif; ?>
Twig: {% if count > 0 %} {% endif %}
5. Controlestructuren
PHPTemplate: <?php foreach ($users as $user) {} ?>
Twig: {% for user in users %} {% endfor %}
6. Filters
Geëscapede HTML-tekens:
PHPTemplate: <?php print check_plain($title); ?>
Twig[2]: {{ title }}
Onbewerkte waarden:
PHPTemplate: <?php print $title; ?>
Twig: {{ title|raw }}
Vertalen:
PHPTemplate: <?php print t('Home'); ?>
Twig: {{ 'Home'|t }}
Vertalen met plaatsvervangers:
PHPTemplate: <?php print t('Welcome, @username', array('@username' => $user->name)); ?>
Twig: {{ 'Welcome, @username'|t({ '@username': user.name }) }}
Drupal 8 Twig (met trans tag extension):
{% set username = user.name %}
{% trans %}
Welcome, {{ username }}
{% endtrans %}
Lijst samenvoegen:
PHPTemplate: <?php echo implode(',', $usernames); ?>
Twig: {{ usernames|join(', ') }}
Lijst samenvoegen met markup:
Twig: {{ usernames|safe_join(',') }}
In het PHPTemplate-voorbeeld moet $usernames een array van strings zijn. Hetzelfde geldt voor het oorspronkelijke Twig-voorbeeld, waar “usernames” een array van strings is. Aan de andere kant verwacht het Drupal 8 Twig-voorbeeld een array van renderbare items. Dit is een fundamenteel verschil tussen Drupal 8 Twig en origineel Twig. Drupal 8 Twig kan zowel platte tekst als render-arrays “printen”.
Een ander aspect van dit voorbeeld is dat verwacht wordt dat alle drie de voorbeelden dezelfde uitvoer produceren, maar dit gebeurt standaard niet. Bijvoorbeeld:
{% set numbers = [{'#markup': 'One'}, {'#markup':'Two'}, {'#markup':'Three'}] %}
{{ numbers }}
Bovenstaand voorbeeld suggereert dat de items door komma’s gescheiden worden geprint. Maar de uitvoer is: OneTwoThree
7. Spatiebeheer
Twig heeft whitespace-controle waarmee je spaties kunt verwijderen die gebruikt worden om het sjabloonbestand te structureren.
<div class="body">
{{- block.content -}}
</div>
Dit is hetzelfde als:
<div class="body">{{ block.content }}</div>
Let op
- Het hash-sleutelelement-voorbeeld kan in de toekomst veranderen
- In het tweede voorbeeld laten we zien dat Twig verantwoordelijk is voor het opschonen van data. Voorheen moest dit gebeuren in het sjabloonbestand of in de preprocess-functie. Deze laatste wijziging is belangrijk voor iedereen die hoopt een PHPTemplate-thema naar Drupal 8 om te zetten – je moet je eigen data opschonen. ↩︎︎