Image repréentant des dès avec des lettres.
  • 19/04/2019
  • 0 commentaire

Le titre d'une page est capitale pour le référencement et l'intérêt que vous susciterez auprès de vos visiteurs. Sous Drupal, les titres des pages affichant des entités de contenu sont gérés automatiquement grâce au champ 'title'. Ce billet va traiter de la gestion des titres des autres types de pages.

Le titre d'une page est la première chose qu'un internaute lira, que ce soit sur la page en elle même ou via un partage sur les réseaux sociaux. C'est un élément majeure lors de la rédaction d'un contenu car si il ne donne pas envie, et même si votre contenu est qualitatif, une partie des internautes passera son chemin juste en se basant sur votre titre.

Pour les pages "basiques" de Drupal (nœud, terme de taxonomie, vues ...) les titres sont configurables dans le back office. Lorsque l'on veux gérer finement le titre d'une page custom ou d'une page existante (qui n'est pas une entité de contenu) cela devient un peu plus difficile.

Si vous rencontrez un autre cas que ceux listés ci-dessous, laissez moi un commentaire et je mettrai à jour ce billet.

I) Gestion des pages customs

Pour déclarer une route il faut un fichier mymodule.routing.yml qui se place à la racine d'un module Drupal.

Dans ce fichier vous devez fournir les informations concernant le comportement de votre route comme son nom machine, le path, si c'est un controller, un formulaire ou autre qui doit être appelé et plusieurs autres informations optionnelles ou custom.

Voici l'exemple d'une déclaration de route :

mymodule.custom_route:
  path: '/path/of/my/route'
  defaults:
    _controller: '\Drupal\mymodule\Controller\CustomController::customRoute'
    _title: 'Awesome title'
  requirements:
    _permission: 'access content'

   1) Déclaration du titre dans le fichier mymodule.routing.yml

Dans l'exemple ci-dessus, un titre fixe est déclarer dans la clefs defaults puis _title. Ce texte sera utilisé par défaut lors de la visite de votre page que ce soit via le bloc "Titre de la page" ou dans le titre de l'onglet. Pour traduire cette chaîne, il faut utiliser l'interface de traduction disponible à cette adresse : admin/config/regional/translate

   2) Création d'un titre dynamique

Vous pouvez être amené à vouloir un titre de page qui change en fonction du contexte dans lequel la page est visitée. En créant une page de recherche, vous pouvez mettre la valeur d'un filtre en titre de page. Pour cela il est nécessaire d'adapter le fichier mymodule.routing.yml en remplaçant la configuration _title par _title_callback. Il faut lui passer le namespace de la classe ainsi que la méthode qui générera le titre.

mymodule.routing.yml

mymodule.custom_route:
  path: '/path/of/my/route'
  defaults:
    _controller: '\Drupal\mymodule\Controller\CustomController::customRoute'
    _title_callback: '\Drupal\mymodule\Controller\CustomController::customRouteTitle'
  requirements:
    _permission: 'access content'

CustomController.php

<?php

namespace Drupal\mymodule\Controller;

use Drupal\Core\Controller\ControllerBase;


class CustomController extends ControllerBase {


  public function customRouteTitle() {
    return 'Route title with uniqID : '.uniqid();
  }

  public function customRoute() {
   return [
     '#markup' => 'Custome Route HTML'  
   ];
  }

}

Avec l'exemple ci-dessus, le titre peut contenir une partie variable. Cet exemple est volontairement simplifié et ne propose que la base minimale de vode.

Voici un exemple un peu plus parlant.
Mise en situation :
  - J'ai besoin d'une page affichant la médiathèque d'un utilisateur.
  - Le nom de ma page doit être "Médiathèque de Prénom"

mymodule.routing.yml :

mymodule.custom_route:
  path: '/mediatheque/{user}'
  defaults:
    _controller: '\Drupal\mymodule\Controller\MediathequeController::mediathequeByUser'
    _title_callback: '\Drupal\mymodule\Controller\MediathequeController::mediathequeByUserTitle'
  requirements:
    _permission: 'access content'
  options:
    parameters:
      user:
        type: entity:user

MediathequeController.php

<?php

namespace Drupal\mymodule\Controller;

use Drupal\Core\Controller\ControllerBase;
use Drupal\user\UserInterface;

class MediathequeController extends ControllerBase {


  public function mediathequeByUserTitle(UserInterface $user) {
    return 'Mediatheque of  '.$user->field_firstname->value;
  }

  public function mediathequeByUser(UserInterface $user) {
   return [
     '#themme' => 'mymodule_mediatheque_by_user',
     '#user' => $user 
   ];
  }

}

En passant un paramètre dans ma route et en spécifiant que c'est une entité de type user, je vais récupérer dans mon _controller l'objet directement chargé. De plus tous les paramètres qui sont passés au _controller le sont aussi pour le _title_callback. Grâce à ça, vous pourrez construire vos titres comme bon vous semble.

II) Réécriture de titre page existante

Pour changer le titre d'une route existante il faut altérer la déclaration de la route. Il suffit de déclarer un _title ou un _title_callback en passant par un service RouteSubscriber.

Déclarons dans un premier temps le service dans un fichier mymodule.services.yml

services:
  mymodule.route_subscriber:
    class: Drupal\mymodule\Routing\RouteSubscriber
    tags:
      - { name: event_subscriber }

Ce service appellera le classe RouteSubscriber et on pourra modifier les définitions des routes.

<?php

namespace Drupal\mymodule\Routing;

use Drupal\Core\Routing\RouteSubscriberBase;
use Symfony\Component\Routing\RouteCollection;

/**
 * Listens to the dynamic route events.
 */
class RouteSubscriber extends RouteSubscriberBase {

  /**
   * {@inheritdoc}
   */
  protected function alterRoutes(RouteCollection $collection) {
    if ($route = $collection->get('route_machine_name')) {
     // Static title
     $route->setDefault('_title', 'Contact us');
     // Dynamique title
     $route->setDefault('_title_controller', '\Drupal\mymodule\Controller\CustomController::customTitle');
    }
  }

}

 

Vous pouvez, dès à présent, gérer le titre de n'importe quelle page. Si votre exemple n'entre pas totalement dans le cadre de mes exemple ou si vous avez des questions, vous pouvez laisser un commentaire via le formulaire ci-dessous. Je mettrai à jour l'article pour prendre en compte les éléments que j'aurais oubliés ou pas assez détaillés.

N'hésitez pas non plus à venir faire un tour sur le Slack de la communauté française si vous avez des questions.