logo

Extra Block Types (EBT) - Nieuwe Layout Builder ervaring❗

Extra Block Types (EBT) - gestileerde, aanpasbare bloktypes: Slideshows, Tabs, Cards, Accordions en vele andere. Ingebouwde instellingen voor achtergrond, DOM Box, javascript-plugins. Ervaar vandaag al de toekomst van layout building.

Demo EBT-modules Download EBT-modules

❗Extra Paragraph Types (EPT) - Nieuwe Paragraphs ervaring

Extra Paragraph Types (EPT) - analoge op paragrafen gebaseerde set modules.

Demo EPT-modules Download EPT-modules

Scroll
17/10/2025, by Ivan

We kunnen de parameters in de URL gebruiken voor routes. Ze werken net zoals contextuele filters in Views. We kunnen bijvoorbeeld de ID van verschillende entiteiten, tekststrings of opeenvolgende ID's gescheiden door komma's of plussen in de URL doorgeven. In deze les zullen we de ID van de node doorgeven en de titel en inhoud van deze node weergeven in de content.

Codevoorbeelden kunnen worden bekeken op github:
https://github.com/levmyshkin/drupalbook8

Laten we een route toevoegen aan ons drupalbook.routing.yml modulebestand:

drupalbook.display_node:
  path: '/display-node/{node}'
  defaults:
    _controller: '\Drupal\drupalbook\Controller\DisplayNode::content'
    _title_callback: '\Drupal\drupalbook\Controller\DisplayNode::getTitle'
  requirements:
    _custom_access: '\Drupal\drupalbook\Controller\DisplayNode::access'
  options:
    parameters:
      node:
        type: entity:node

Hier in het pad geven we het tweede argument {node} door, in de URL schrijven we de gebruikelijke ID: /display-node/101, maar een kant-en-klaar node-object komt naar onze controller. Om dit te doen, geven we in de opties de parameters aan die naar deze parameters moeten worden doorgegeven en wat de output zal zijn

options:
    parameters:
      node: # de naam van het argument, wat tussen {}, het kan node1, node2 zijn, als we twee verschillende argumenten doorgeven.
        type: entity: node # wat de output zal zijn, we kunnen het object van deze entiteit binnen de controller gebruiken.

Ik heb ook bepaald in welke methode we de koptekst zullen weergeven met behulp van de _title_callback parameter. En we zullen de output van artikelen voor anonieme gebruikers beperken, hiervoor gebruiken we de _custom_access parameter waarin we aangeven in welke methode we verschillende beperkingen zullen opleggen.

Nu we de beschrijving van de route hebben begrepen, laten we doorgaan met het schrijven van een klasse voor deze route.

modules/custom/drupalbook/src/Controller/DisplayNode.php:

<?php
/**
 * @file
 * Bevat \Drupal\drupalbook\Controller\DisplayNode.
 */
 
namespace Drupal\drupalbook\Controller;
 
use Drupal\Core\Access\AccessResult;
use Drupal\node\NodeInterface;
 
/**
 * Biedt route-antwoorden voor de DrupalBook-module.
 */
class DisplayNode {
 
  /**
   * Retourneert een eenvoudige pagina.
   *
   * @return array
   *   Een eenvoudige renderbare array.
   */
  public function content(NodeInterface $node) {
    $element = array(
      '#markup' => $node->body->value,
    );
    return $element;
  }
 
  /**
   * Controleert de toegang voor deze controller.
   */
  public function access(NodeInterface $node) {
    $user = \Drupal::currentUser();
    if ($node->getType() == 'article' && !in_array('authenticated', $user->getRoles())) {
      return AccessResult::forbidden();
    }
    return AccessResult::allowed();
  }
 
  /**
   * Retourneert een paginatitel.
   */
  public function getTitle(NodeInterface $node) {
    return $node->getTitle();
  }
 
}

Ik heb een aparte klasse voor mijn route gemaakt, zodat alles niet in één controllerklasse wordt gemengd. Laten we kijken wat elke van deze regels betekent.

\drupalbook\Controller;

We geven aan waar ons controllerbestand zich bevindt.

\Core\Access\AccessResult;
use Drupal\node\NodeInterface;

We includeren de AccessResult class-bestanden - we zullen deze gebruiken om de 403-fout weer te geven en NodeInterface - we zullen deze gebruiken om het node-object in de parameter methode van onze controller te verkrijgen.

function content(NodeInterface $node) {
  $element = array(
    '#markup' => $node->body->value,
  );
  return $element;
}

Let hier op de parameter, we verkrijgen het node-object, Drupal zelf zet de ID uit de URL om en geeft het object aan ons door, zodat we het node-object niet opnieuw hoeven te laden, maar het klaar krijgen waar we het nodig hebben. $ node-> body-> value, dit is hoe we de veldwaarde uit de node halen, maar we zullen werken met objecten in de volgende les wanneer we de Entity API analyseren. En aan het einde retourneren we een array met #markup om onze node op de tekstpagina weer te geven.

function access(NodeInterface $node) {
  $user = \Drupal::currentUser();
  if ($node->getType() == 'article' && !in_array('authenticated', $user->getRoles())) {
    return AccessResult::forbidden();
  }
  return AccessResult::allowed();
}

Eerst gebruiken we de Drupal-methode currentUser() om het huidige gebruikersobject te verkrijgen, daarna gebruiken we dit object om de rollen van de huidige gebruiker op te halen. In de if-check controleren we het inhoudstype van onze node en de gebruikersrol, anonieme gebruikers krijgen een 403-fout, als alles goed is, gaan we verder en retourneren allowed(), dat wil zeggen, we keuren onze controle goed. Laten we de AccessResult-klasse openen en kijken welke andere methoden deze klasse heeft. Om dit te doen, moet je in PhpStorm twee keer op shift drukken en de naam van de klasse invoeren:

Access Result

Hier vind je de volgende methoden voor het controleren van machtigingen:

neutral
allowed
forbidden
allowedIf
forbiddenIf
allowedIfHasPermission
allowedIfHasPermissions
isAllowed
isForbidden
isNeutral
orIf
andIf

Je kunt experimenteren met allowedIfHasPermission(), bijvoorbeeld, en verschillende machtigingen instellen voor verschillende rollen voor je route. Maak bijvoorbeeld een nieuwe machtiging in je module en gebruik deze in de controller. Hoewel het natuurlijk gemakkelijker is om de machtiging in het yml-bestand van de route te gebruiken. Maar via de AccessResult-klasse kun je de logica voor het toegang krijgen tot content flexibel beschrijven, bijvoorbeeld "toegang tot content is toegestaan voor geautoriseerde gebruikers van 12 tot 16 uur, en voor gebruikers met de premium accountrol 24 uur per dag." Experimenteer en implementeer deze differentiatie van toegangsrechten naar artikel-nodes.

Zoals je kunt zien, biedt Drupal verschillende manieren om toegang tot content te implementeren, wat handig is omdat 99% van de gevallen één machtiging gebruikt en dit voldoende is om toegangsrechten te differentiëren.

function getTitle(NodeInterface $node) {
  return $node->getTitle();
}

Hier retourneren we gewoon de naam van de node als titel, maar we kunnen de mogelijkheden van onze callback uitbreiden. Bijvoorbeeld zo:

function getTitle(NodeInterface $node) {
    $user = \Drupal::currentUser();
    if ($node->getType() == 'article' && !in_array('authenticated', $user->getRoles())) {
     return 'Premium content:  ' . $node->getTitle();
   }
   else {
     return 'Free access content:  ' . $node->getTitle();
   }
 
}

Of toon de publicatiedatum in de titel:

Zoals je kunt zien, biedt Drupal de mogelijkheid om je route en controller flexibel in te stellen. Dus wanneer je klant ideeën heeft over de output van materialen naar de site, kun je dit altijd doen met de Drupal API en een beetje PHP-code.

Codevoorbeelden kunnen worden bekeken op github:
https://github.com/levmyshkin/drupalbook8