Drupal 9 : supprimer le bloc de titre de page pour certains types de contenu
Dans Drupal 9, l'affichage du titre du contenu se fait en dehors du "nœud", dans un bloc dédié : "Titre de page". C'est-à-dire que le titre sera forcément à un niveau supérieur par rapport au type de contenu et donc complètement détaché de celui-ci.
Il peut être utile dans certains cas de supprimer l'affichage de ce bloc sur des types de contenu et d'inclure le titre à l'intérieur du nœud. Par exemple, pour des raisons de mise en page, nous aurions besoin que notre titre apparaisse en dessous d'un autre champ (une image, un terme de taxonomie, etc...)
Pour cet exemple, nous allons nous concentrer sur l'affichage du type de contenu "Article" via notre thème "montheme".
Inclure le titre à l'intérieur du contenu
Dans un premier temps, nous allons inclure le titre à l'intérieur du contenu via un fichier de template.
Pour ce faire, nous allons créer un ficher node--article.html.twig qui est une copie du template générique des nœuds (node.html.twig).
Nous devrions avoir un fichier qui ressemble à ça :
<article{{ attributes }}>
{{ title_prefix }}
{% if label and not page %}
<h2{{ title_attributes }}>
<a href="{{ url }}" rel="bookmark">{{ label }}</a>
</h2>
{% endif %}
{{ title_suffix }}
{% if display_submitted %}
<footer>
{{ author_picture }}
<div{{ author_attributes }}>
{% trans %}Submitted by {{ author_name }} on {{ date }}{% endtrans %}
{{ metadata }}
</div>
</footer>
{% endif %}
<div{{ content_attributes }}>
{{ content }}
</div>
</article>
Nous allons inclure le titre (variable label) au-dessus de la balise <div> enveloppant le contenu :
<h1>{{ label }}</h1>
<div{{ content_attributes }}>
{{ content }}
</div>
Désormais, notre page affichant le contenu devrait avoir deux titres : le titre appartenant au bloc "Titre de page" et le titre que nous venons d'inclure via la variable label.
Exclure le bloc "Titre de page"
Dans un second temps, nous allons exclure l'affichage du bloc "Titre de page" uniquement pour les type de contenu "Article".
Pour y parvenir, nous allons utiliser la fonction hook_preprocess_page() dans le fichier montheme.theme .
Cette fonction est en charge du rendu de la page.
Voici le code :
/**
* Implements hook_preprocess_page().
*/
function montheme_preprocess_page(&$variables, $hook) {
// Remove page title for content type 'article'
if (isset($variables['node']) && isset($variables['page']['content']['page_title'])) {
$node = $variables['node'];
$type = $node->getType();
if ($type == 'article') {
unset($variables['page']['content']['page_title']);
}
}
}
En détail :
- Nous testons si nous sommes bien dans un "nœud" et si le bloc "Titre de page" est bien présent
- Nous vérifions que notre type de contenu est bien "Article"
- Nous enlevons le bloc "Titre de page" du rendu de la page
Désormais, notre page affichant le contenu ne devrait comporter qu'un seul titre : celui que nous avons inclus dans le template node--article.html.twig.
Libre à vous de manipuler le template node--article.html.twig pour que le placement du titre corresponde à vos besoins (ajout de balise HTML, ajout de champ, etc...)
Illustration par James Osborne de Pixabay