Drupal 10 : Les blocs, enfin des entités, exemple de création

Apprendre à créer un nouveau bloc depuis le code.

Cet article a été initialement rédigé pour Drupal 8 mais son contenu est toujours d'actualité pour Drupal 9 et Drupal 10.

N'hésitez pas à nous contacter ou à vous inscrire à notre formation «Drupal pour les développeurs et développeuses» pour en savoir plus !

Le système de blocs depuis Drupal 8 met un point d’honneur à illustrer les efforts de la communauté pour homogénéiser les outils et principes utilisés dans Drupal. Ainsi, les blocs sont des plugins et s’inscrivent dans la logique tout est entité.

En effet, le module Block Content du cœur définit un type d’entité permettant de gérer des blocs au contenu administrable. Cela signifie qu’il est désormais possible de créer plusieurs bundles de blocs, chacun avec ses propres champs. Il devient dès lors très simple de permettre à un utilisateur d’avoir, par exemple, un bloc d’éditorial administrable sur sa page d’accueil sans utiliser de module contribué, ou de fournir des blocs d’appel à action sans passer par des nœuds.

Tous les éléments classiques de Drupal, comme le titre de la page, les onglets, le fil d’ariane, ou les informations du site (titre, slogan, etc) sont des blocs. Ainsi le template de page ne devrait plus contenir que des régions !

Point à noter, les blocs de menus proposent de choisir le niveau initial d’affichage et la profondeur. De plus, On retrouve les filtres de visibilité classiques (type de contenu, rôle, page) ainsi qu’un filtre de visibilité par langue.

Il est possible de positionner un bloc plusieurs fois, avec une configuration spécifique pour chaque bloc. Cela permettra par exemple de pouvoir avoir 2 blocs du menu principal avec des niveaux d’affichage différents.

Exemple de création d'un bloc programmatique

La création d’un bloc par le code se fait grâce à l’utilisation des plugins de Drupal 10. Nous rentrerons plus tard dans les détails du fonctionnement des plugins. Voyons, pour le moment, la recette rapide pour en implémenter un.

Il faut créer une classe dans un fichier portant le même nom dans le répertoire src/Plugin/Block/ de son module. Dans notre cas, LibraryBlock.php.

On doit ensuite définir l’espace de nom de notre classe ainsi que les classes dont on se sert. Nous allons étendre la classe Drupal\Core\Block\BlockBase, il faut donc la rajouter.


# src/Plugin/Block/LibraryBlock.php
namespace Drupal\happy_alexandrie\Plugin\Block;
use Drupal\Core\Block\BlockBase;

Pour que notre bloc soit découvert par Drupal, il faut définir une annotation juste avant la classe.

Il faut définir id qui est le nom machine du bloc et admin_label

# src/Plugin/Block/LibraryBlock.php
/**
 * Provides a 'Call to visit' block.
 *
 * @Block(
 *   id = "visit_library",
 *   admin_label = @Translation("Visit the library"),
 * )
 */
class LibraryBlock extends BlockBase {

Enfin, il faut définir la méthode build() de la classe et qui doit renvoyer un render array.

# src/Plugin/Block/LibraryBlock.php
public function build () {
  return array(
    '#markup' => "Contenu du bloc",
  );
}

Le bloc devrait maintenant être visible dans l’interface de gestion des blocs, et on peut le positionner là où bon nous semble.

Votre commentaire

Le contenu de ce champ sera maintenu privé et ne sera pas affiché publiquement.
Votre adresse servira à afficher un Gravatar et à vous notifier des réponses. Votre commentaire sera anonymisé si ce billet est dépublié pendant plus de 3 mois.
Pour lutter contre le spam notre système enregistre votre adresse IP et votre adresse e-mail si vous la partagez.
Nous vous invitons à consulter notre politique de confidentialité pour comprendre les traitements faits de ces données et comment les rectifier.

À propos de Julien

Co-fondateur - Scrum master & Expert technique

Utilisateur de Drupal depuis 2008, j’ai fait mes armes comme développeur chez Commerce Guys puis me suis mis à encadrer les nouveaux arrivants avant de donner des formations, participer aux avant ventes et accompagner les équipes au passage à Scrum.

Je suis impliqué dans la communauté française de Drupal depuis 2009, j’ai été tour à tour président puis vice-président de l’association Drupal France et francophonie entre 2011 et 2013.