Content variabelen bedwingen in Drupal

De standaard templates in Drupal 7 waren PHP templates. In Drupal 8 zijn die vervangen door het krachtige Twig. Met Twig kan zowel de ontwikkelaar als de vormgever snel uit de voeten. De implementatie in Drupal verschilt verder niet wezenlijk van het oude vertrouwde PHP template uit Drupal 7. Een illustratie:

Het printen van de node variabelen in Drupal 7:

Een veld uitprinten in node.tpl.php:

<?php echo $content['field_example']; ?>
<?php unset($content['field_example']);?>

Daarbij is het goede praktijk om gelijk daarna de geprinte variabele te laten verdwijnen met unset en het template uiteindelijk af te sluiten met

<?php echo $content; ?>

om alle andere variabelen uit het content array op de standaard manier af  te drukken waarbij $content['field_example'] zich dus geen deel meer uitmaakt van het array.

Het printen van de node variabelen in Drupal 8 met twig.without:

Voor het afdrukken van dezelfde subset in Drupa 8 en Twig gebuiken we het Twig print commando {{}} in node.html.twig:

{{ content.field_example }}

Daarna drukken we de andere variabelen af met

{{ content|without('field_example') }}

Als je meerdere content velden (var1, var2, var3) over het template verdeeld kun je de overgebleven velden afdrukken met:

{{ content|without('var1','var2','var3') }}

Bij de implementatie van Twig in Drupal 8 is een aantal Twig instellingen aangepast. Zo is het escape filter is standaard toegevoegd aan het print commando zodat variabelen automatisch worden "escaped". In standaard twig moet het filter expliciet worden opgegeven:

{{ variabele|esc }}

De paginatitel

De paginatitel is een ander pagina element dat in Drupal 8 iets anders is geïmplementeerd dan in Drupal7. Maakte de paginatitle in Drupal 7 deel uit van page.tpl.php, nu is deze ondergebracht in een block dat boven de de content is geplaatst. De titel kan dus met door aanpassing van de weergaveinstellinen van he blok eenvoudig worden verborgen als dat ergens nodig is. 

Zowel in Drupal 7 al in Drupal 8 maakt de paginatitel in teaser mode (of beter: alle modes behalve page mode) deel uit van het node template (node.tpl.php resp. node.html.twig) In beide gevallen kan de paginatitel daarom ook in page mode eenvoudig in dit template worden ondergebracht. Om de een of andere reden heet de title in Drupal 8 overigens label. Met onderstaand in node.html.twig fragment plaats je dus een afbeelding voor de titel. Dan natuurlijk wel de titel uitschakelen in de block weergave voor het betreffende geval (bijvoorbeeld voor content-type articel als het een aanpassing in node--article.html.twig betreft).

<div{{ content_attributes.addClass('content') }}> {{ content.field_afbeelding }} </div> 
{{ title_prefix }} 
{% if page %} 
  <h1 class="page-header">{{ label }}</h1> 
{% else %} 
  <h2{{ title_attributes }}> <a href="{{ url }}" rel="bookmark">{{ label }}</a> </h2> 
{% endif %} 
{{ title_suffix }}

En dan natuurlijk verderop in het template

{{content}}

vervangen door:

{{ content|without('field_afbeelding') }}

Debugging

{{ dump(_context|keys) }}

Reactie toevoegen