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

Cet article est extrait de notre formation drupal 8 "de Drupal 7 à Drupal 8" à destination des développeurs. N'hésitez pas à nous contacter pour en savoir plus !

Le système de bloc dans 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 maintenant 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 noeuds.

La démarche tout est bloc initiée par Drupal 7 est maintenant achevée, car 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 devenus des blocs. Ainsi le template de page ne devrait plus contenir que des régions !

Point à noter, les blocs de menus proposent maintenant de choisir le niveau initial d’affichage et la profondeur à la façon de Menu Block dans Drupal 7. De plus, On retrouve les filtres de visibilité classiques (type de contenu, rôle, page) ainsi qu’un nouveau par langue qui n’était disponible que grâce au module Internationalization en Drupal 7.

Enfin, une dernière nouveauté et pas des moindres, il est dorénavant 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 8. 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. Une annotation est un commentaire spécial qui a un effet sur l’interprétation du code. Le fonctionnement de l’annotation sera détaillé plus tard, pour l’instant il faut voir cela comme un remplaçant du hook_block_info().

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 qui replace hook_block_view() 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

À propos de Julien

Gérant - 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.

Nous rejoindre ?

Vous avez envie de rejoindre une équipe éthique ?
Vous avez envie de faire un partenariat ?