Aller au contenu principal

Comment Supprimer la Navigation du Module Book dans Drupal : Guide du Développeur

Comment Supprimer la Navigation du Module Book dans Drupal : Guide du Développeur
Temps de lecture
7 minutes

Dans cet article, j'expliquerai comment j'ai créé le module book_navigation_remover pour Drupal 7. Je décrirai ce qu'est Drupal 7, le rôle du module Book, et pourquoi le simple fait de masquer la navigation du livre avec CSS n'est pas suffisant. Je fournirai ensuite des instructions détaillées, étape par étape, sur la façon dont vous pouvez créer votre propre module pour désactiver la navigation du livre. Enfin, je proposerai des conseils sur l'adaptation du concept pour Drupal 9, 10 et 11, y compris les noms de fichiers, le code commenté et les options de personnalisation supplémentaires.

Qu'est-ce que Drupal 7 ?

Drupal 7 est un système de gestion de contenu (CMS) open-source que de nombreuses organisations et développeurs utilisent pour créer des sites web robustes et flexibles. Drupal 7 est connu pour son architecture modulaire, qui vous permet d'étendre les fonctionnalités de votre site web en installant des modules personnalisés ou contribués.

Qu'est-ce que le Module Book ?

Le module Book est un module de base dans Drupal qui vous permet de créer, d'organiser et de naviguer dans des collections de contenus connexes, similaires aux chapitres d'un livre. Le module génère automatiquement un menu de navigation, connu sous le nom de navigation du livre, pour aider les utilisateurs à se déplacer entre les sections. Cependant, certains administrateurs de sites choisissent de masquer la navigation avec CSS. Bien que cette méthode supprime visuellement le menu, le HTML sous-jacent est toujours présent, ce qui n'est pas idéal.

Pourquoi ne pas simplement masquer la navigation avec CSS ?

Masquer la navigation du livre à l'aide de CSS (par exemple, en définissant display: none;) est une pratique courante. Cependant, cette approche présente plusieurs inconvénients :

  • Impact sur les performances : Le balisage caché est toujours chargé et livré à l'utilisateur, ce qui peut affecter les performances.
  • Préoccupations d'accessibilité : Les technologies d'assistance telles que les lecteurs d'écran peuvent toujours détecter les éléments cachés.
  • Défis de maintenance : Les développeurs futurs peuvent être confus par des éléments cachés qui semblent ne servir à rien.

Dans mon module, je souhaite désactiver complètement la navigation du livre. L'utilisation d'un module pour désactiver la sortie est une solution plus propre qui améliore les performances, renforce l'accessibilité et maintient un balisage propre.

Création du module book_navigation_remover pour Drupal 7

Voici les étapes que j'ai suivies pour créer mon module, qui désactive la navigation du livre dans Drupal 7.

Étape 1 : Créer le dossier du module

Créez un dossier nommé book_navigation_remover dans votre répertoire de modules Drupal 7. Celui-ci se trouve généralement à sites/all/modules/custom.

Étape 2 : Créer le fichier .info

À l'intérieur du dossier book_navigation_remover, créez un fichier nommé book_navigation_remover.info avec le contenu suivant :

; book_navigation_remover.info name = Book Navigation Remover description = "Désactive le menu de navigation du livre dans la sortie du site." core = 7.x package = Custom

Les commentaires, qui commencent par un point-virgule, fournissent des informations sur le module. Ce fichier indique à Drupal les détails de base de votre module.

Étape 3 : Créer le fichier .module

Ensuite, créez un fichier nommé book_navigation_remover.module dans le même dossier. Ce fichier contient le code PHP qui désactive la navigation du livre :

<?php /** * @file * Fichier du module Book Navigation Remover. */ /** * Implémente hook_menu_alter(). * * Dans mon module, je souhaite désactiver la navigation du livre en supprimant le rappel de menu. */ function book_navigation_remover_menu_alter(&$items) {  // Vérifie si l'élément de menu de navigation du livre existe.  if (isset($items['book'])) {    // Supprime l'élément de menu de navigation du livre pour l'empêcher de s'afficher.    unset($items['book']);  } } /** * Alternativement, vous pouvez implémenter hook_preprocess_page() pour supprimer la variable. * Décommentez le code suivant si vous préférez cette approche. */ // function book_navigation_remover_preprocess_page(&$variables) { //   if (isset($variables['book_navigation'])) { //     $variables['book_navigation'] = ''; //   } // } ?>

Le code utilise les hooks de Drupal pour modifier le comportement par défaut du module Book. Dans mon module, je souhaite désactiver la navigation du livre en supprimant l'élément de menu qui le génère. Une approche alternative utilisant hook_preprocess_page() est fournie dans les commentaires.

Étape 4 : Activer le module

Accédez à Administration > Modules sur votre site Drupal 7. Localisez "Book Navigation Remover" sous la catégorie Custom et activez-le. N'oubliez pas de vider le cache afin que Drupal puisse enregistrer les modifications.

Adapter le concept pour Drupal 9, 10 et 11

Alors que les modules Drupal 7 sont écrits en PHP procédural, Drupal 8 et les versions ultérieures utilisent une approche orientée objet. Le concept global reste le même : vous souhaitez désactiver la sortie de navigation du livre, mais la structure des fichiers et le style de code diffèrent.

Structure de fichiers pour Drupal 9/10/11

Pour Drupal 9, 10 ou 11, créez un dossier nommé book_navigation_remover dans votre répertoire de modules personnalisés (généralement /modules/custom/book_navigation_remover). À l'intérieur de ce dossier, créez les fichiers suivants :

  • book_navigation_remover.info.yml
  • src/EventSubscriber/RemoveBookNavigationSubscriber.php
  • (Facultativement) un fichier book_navigation_remover.module si des hooks procéduraux sont nécessaires.

Exemple : book_navigation_remover.info.yml

# book_navigation_remover.info.yml name: Book Navigation Remover type: module description: 'Désactive le menu de navigation du livre dans la sortie du site.' core_version_requirement: ^9 || ^10 || ^11 package: Custom

Exemple : Utilisation d'un abonné d'événement

Dans Drupal 8 et versions ultérieures, vous pouvez utiliser un abonné d'événement pour modifier les tableaux de rendu. Créez un fichier nommé RemoveBookNavigationSubscriber.php dans le dossier src/EventSubscriber/ avec le code suivant :

<?php namespace Drupal\book_navigation_remover\EventSubscriber; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Drupal\Core\Render\PageDisplayVariantSubscriber; use Symfony\Component\HttpKernel\Event\ViewEvent; use Symfony\Component\HttpKernel\KernelEvents; /** * Classe RemoveBookNavigationSubscriber. * * Supprime la navigation du livre du tableau de rendu de la page. */ class RemoveBookNavigationSubscriber implements EventSubscriberInterface {  /**   * {@inheritdoc}   */  public static function getSubscribedEvents() {    // S'abonne à l'événement de vue du noyau avec une priorité plus élevée que page_display.    $events[KernelEvents::VIEW][] = ['onView', PageDisplayVariantSubscriber::PRIORITY + 10];    return $events;  }  /**   * Modifie le tableau de rendu de la page pour supprimer la navigation du livre.   *   * @param \Symfony\Component\HttpKernel\Event\ViewEvent $event   *   L'objet d'événement.   */  public function onView(ViewEvent $event) {    $result = $event->getControllerResult();        // N'agit que sur les tableaux de rendu    if (is_array($result)) {      // Supprime la navigation du livre si présente      if (isset($result['book_navigation'])) {        unset($result['book_navigation']);        $event->setControllerResult($result);      }            // Vérifie également la navigation du livre dans le contenu      if (isset($result['content']['book_navigation'])) {        unset($result['content']['book_navigation']);        $event->setControllerResult($result);      }    }  } }

Déclaration du service

Pour Drupal 9/10/11, vous devez déclarer l'abonné d'événement dans un fichier book_navigation_remover.services.yml :

# book_navigation_remover.services.yml services:  book_navigation_remover.remove_subscriber:    class: Drupal\book_navigation_remover\EventSubscriber\RemoveBookNavigationSubscriber    tags:      - { name: event_subscriber }

Améliorations et personnalisations supplémentaires

Vous pouvez améliorer davantage votre module avec des fonctionnalités supplémentaires :

Options de configuration

Créez un formulaire de configuration pour rendre le module plus flexible :

<?php // book_navigation_remover.module pour Drupal 9/10/11 /** * Implémente hook_form_FORM_ID_alter(). */ function book_navigation_remover_form_book_admin_settings_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {  $config = \Drupal::config('book_navigation_remover.settings');    $form['book_navigation_remover'] = [    '#type' => 'details',    '#title' => t('Paramètres de suppression de la navigation du livre'),    '#open' => TRUE,  ];    $form['book_navigation_remover']['remove_all'] = [    '#type' => 'checkbox',    '#title' => t('Supprimer la navigation du livre de toutes les pages'),    '#default_value' => $config->get('remove_all') ?: TRUE,    '#description' => t('Si coché, la navigation du livre sera supprimée de toutes les pages. Sinon, utilisez les paramètres de type de contenu ci-dessous.'),  ];    $form['book_navigation_remover']['content_types'] = [    '#type' => 'checkboxes',    '#title' => t('Types de contenu'),    '#description' => t('Sélectionnez les types de contenu pour lesquels supprimer la navigation du livre.'),    '#options' => node_type_get_names(),    '#default_value' => $config->get('content_types') ?: [],    '#states' => [      'visible' => [        ':input[name="remove_all"]' => ['checked' => FALSE],      ],    ],  ];    $form['#submit'][] = 'book_navigation_remover_settings_submit'; } /** * Gestionnaire de soumission pour le formulaire de paramètres du livre. */ function book_navigation_remover_settings_submit($form, \Drupal\Core\Form\FormStateInterface $form_state) {  $config = \Drupal::configFactory()->getEditable('book_navigation_remover.settings');  $config->set('remove_all', $form_state->getValue('remove_all'))    ->set('content_types', $form_state->getValue('content_types'))    ->save(); } ?>

Navigation sécurisée et optimisée pour votre site Drupal

L'approche du module dédié pour supprimer la navigation du livre offre des avantages significatifs par rapport aux solutions basées sur CSS. Cette méthode apporte de nombreux bénéfices à votre site web :

  1. Performance améliorée : Vos pages se chargeront plus rapidement car le balisage inutile n'est pas livré au client.
  2. Meilleure accessibilité : Les lecteurs d'écran et autres technologies d'assistance ne seront pas confus par des éléments de navigation cachés mais présents.
  3. Code propre : Les développeurs futurs travaillant sur votre site trouveront une base de code plus propre et plus facile à maintenir sans éléments cachés.
  4. Meilleures pratiques : Cette approche s'aligne sur les meilleures pratiques de développement et les principes architecturaux de Drupal.

La nature modulaire de cette solution vous permet d'activer ou de désactiver facilement la fonctionnalité selon vos besoins, vous donnant un contrôle total sur la structure de navigation de votre site. Que vous travailliez avec Drupal 7 ou les versions plus modernes Drupal 9, 10 ou 11, ces principes s'appliquent à toutes les versions.

Le temps investi dans la création d'un module approprié plutôt que d'appliquer des correctifs CSS rapides résulte en une base plus robuste pour votre site qui vous servira bien à mesure que votre projet évolue. Les exemples de code fournis sont prêts pour une implémentation immédiate, et les options de personnalisation vous permettent d'adapter la solution à vos besoins spécifiques.

Bon codage, et que vos projets Drupal s'épanouissent avec une navigation propre et efficace !

Simon Adjatan

Disqus