Preprocessing en het wijzigen van attributen in het <em>.theme</em>-bestand
Net als in Drupal 7 kun je de uitvoer van bepaalde HTML beïnvloeden met behulp van preprocess-functies. Bijvoorbeeld, als je een klasse aan een menu wilt toevoegen en je verkiest dit op PHP-niveau te doen, kun je dat doen. Dit is een goede manier om de markup te wijzigen die betrekking heeft op een thema, maar als je markup wilt maken die niet afhankelijk is van het thema, is het beter om een eigen module te schrijven.
(Opmerking: voor documentatiedoeleinden is hier "mytheme" de machinenaam van je thema; bijvoorbeeld "bartik" is de machinenaam van dat thema.)
Om met preprocess-functies te werken:
1. Maak of bewerk een bestand in de map van je thema met de naam mytheme.theme
2. Maak een functie zoals mytheme_preprocess_HOOK, waarbij HOOK verwijst naar het element dat je wilt beïnvloeden*
3. Schrijf je wijzigingen en sla deze op
4. Bouw de cache opnieuw op, zodat je wijzigingen beschikbaar zijn (als je drush hebt geïnstalleerd: drush cr in de command line)
* HOOK-namen volgen de conventies van het Twig-sjabloon. Om een hook te maken voor page.html.twig, maak je mytheme_preprocess_page. Om een hook te maken voor een node – article.html.twig, maak je mytheme_preprocess_node__article (waarbij streepjes worden vervangen door underscores). Om hook-namen te vinden, zie de sectie «Het vinden van sjabloonbestanden met debugging».
Laten we aannemen dat we de klasse my-menu willen toevoegen aan alle menu’s op je site. Aangenomen dat je thema “mytheme” heet, moet je de volgende functie schrijven:
/**
* Implements hook_preprocess_HOOK() for menu.html.twig.
*/
function mytheme_preprocess_menu(&$variables) {
// Als er nog geen bestaande class-array is, maak een lege array aan.
if (!isset($variables['attributes']['class'])) {
$variables['attributes']['class'] = [];
}
// Samenvoegen met eventuele klassen die door andere hook_preprocess_menu-aanroepen zijn ingesteld
$variables['attributes']['class'] = array_merge($variables['attributes']['class'], ['my-menu']);
}
Dit lijkt sterk op Drupal 7 en is handig als je een specifiek menu wilt aanpassen.
Je kunt het object $variables controleren met een voorwaarde om te bepalen met welk menu je werkt. Elementen binnen $variables worden beschikbaar in Twig nadat de preprocess-fase van het thema is uitgevoerd.
Nu, om ons voorbeeld uit te breiden, laten we aannemen dat we de klasse my-main-menu aan het hoofdmenu van je site willen toevoegen. Dit zou de functie zijn:
/**
* Implements hook_preprocess_HOOK() for menu.html.twig.
*/
function mytheme_preprocess_menu(&$variables) {
if ($variables['menu_name'] == 'main') {
if (!isset($variables['attributes']['class'])) {
$variables['attributes']['class'] = [];
}
$variables['attributes']['class'] = array_merge($variables['attributes']['class'], ['my-main-menu']);
}
}
Verschillen met Drupal 7
Er is geen template.php-bestand meer. Dit bestand is vervangen door mytheme.theme. Toch functioneert het grotendeels op dezelfde manier, waardoor hooks de uitvoer kunnen wijzigen.