logo

Types de blocs supplémentaires (EBT) – Nouvelle expérience de Layout Builder❗

Types de blocs supplémentaires (EBT) – types de blocs stylisés et personnalisables : diaporamas, onglets, cartes, accordéons et bien d’autres. Paramètres intégrés pour l’arrière-plan, la boîte DOM, les plugins JavaScript. Découvrez dès aujourd’hui le futur de la création de mises en page.

Démo des modules EBT Télécharger les modules EBT

❗Types de paragraphes supplémentaires (EPT) – Nouvelle expérience Paragraphes

Types de paragraphes supplémentaires (EPT) – ensemble de modules basé sur les paragraphes analogiques.

Démo des modules EPT Télécharger les modules EPT

Défilement
07/07/2025, by Ivan

Nous pouvons utiliser les paramètres dans l’URL pour les routes. Ils fonctionnent comme les filtres contextuels dans Views. Par exemple, nous pouvons passer dans l’URL l’ID de différentes entités, des chaînes de texte ou des ID séquentiels séparés par des virgules ou des plus. Dans cette leçon, nous passerons l’ID d’un nœud et afficherons le titre et le corps de ce nœud dans le contenu.

Des exemples de code sont disponibles sur GitHub :
https://github.com/levmyshkin/drupalbook8

Ajoutons une route dans le fichier drupalbook.routing.yml de notre module :

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

Ici, dans le chemin, nous passons en second argument {node}. Dans l’URL, nous écrirons l’ID classique : /display-node/101, mais un objet node prêt à l’emploi sera envoyé à notre contrôleur. Pour cela, nous indiquons dans options le type des paramètres afin que l’objet soit passé tel quel dans le contrôleur.

options:
    parameters:
      node: # nom de l’argument, ce qui est entre {}, peut être node1, node2 si on passe plusieurs arguments.
        type: entity:node # type de l’objet reçu, ici une entité node utilisable dans le contrôleur.

J’ai également défini la méthode qui affichera le titre avec _title_callback. Et nous limitons l’affichage des articles aux utilisateurs anonymes grâce au paramètre _custom_access, où nous précisons la méthode de restriction.

Passons maintenant à l’écriture de la classe pour cette route.

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

<?php
/**
 * @file
 * Contient \Drupal\drupalbook\Controller\DisplayNode.
 */
 
namespace Drupal\drupalbook\Controller;
 
use Drupal\Core\Access\AccessResult;
use Drupal\node\NodeInterface;
 
/**
 * Fournit les réponses pour la route DrupalBook.
 */
class DisplayNode {
 
  /**
   * Retourne une page simple.
   *
   * @return array
   *   Un tableau rendu simple.
   */
  public function content(NodeInterface $node) {
    $element = [
      '#markup' => $node->body->value,
    ];
    return $element;
  }
 
  /**
   * Vérifie l’accès à ce contrôleur.
   */
  public function access(NodeInterface $node) {
    $user = \Drupal::currentUser();
    if ($node->getType() == 'article' && !in_array('authenticated', $user->getRoles())) {
      return AccessResult::forbidden();
    }
    return AccessResult::allowed();
  }
 
  /**
   * Retourne le titre de la page.
   */
  public function getTitle(NodeInterface $node) {
    return $node->getTitle();
  }
 
}

J’ai créé une classe séparée pour ma route afin de ne pas tout mélanger dans un seul contrôleur. Voyons ce que signifie chaque ligne :

namespace Drupal\drupalbook\Controller;

On indique où se trouve le fichier de notre contrôleur.

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

On importe la classe AccessResult pour gérer les erreurs 403, et NodeInterface pour recevoir un objet node en paramètre dans les méthodes du contrôleur.

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

Ici, on reçoit l’objet node (Drupal convertit automatiquement l’ID en objet et le passe), puis on récupère la valeur du champ body avec $node->body->value. On renvoie un tableau rendu avec #markup pour afficher le contenu.

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

On récupère l’utilisateur courant, on vérifie le type du nœud et si l’utilisateur n’est pas authentifié et que le type est "article", on interdit l’accès (403). Sinon, on autorise.

La classe AccessResult offre plusieurs méthodes pour gérer les permissions, comme :

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

Vous pouvez expérimenter avec allowedIfHasPermission() pour définir différentes permissions selon les rôles sur votre route, par exemple en créant une permission personnalisée dans votre module et en l’utilisant dans le contrôleur. Cela permet une gestion fine des accès.

Drupal propose donc plusieurs façons flexibles d’implémenter l’accès au contenu, même si dans 99 % des cas, une simple permission dans le fichier yml suffit.

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

Ici, on retourne simplement le titre du nœud. On peut cependant étendre cette méthode, par exemple :

public function getTitle(NodeInterface $node) {
  $user = \Drupal::currentUser();
  if ($node->getType() == 'article' && !in_array('authenticated', $user->getRoles())) {
    return 'Contenu premium : ' . $node->getTitle();
  }
  else {
    return 'Contenu accessible librement : ' . $node->getTitle();
  }
}

Ou encore afficher la date de publication dans le titre.

En résumé, Drupal permet de configurer finement vos routes et contrôleurs. Ainsi, quand votre client a des idées sur la présentation des contenus, vous pouvez toujours les réaliser avec l’API Drupal et un peu de PHP.

Des exemples de code sont disponibles sur GitHub :
https://github.com/levmyshkin/drupalbook8