J'utilise le module de base pagetitle
pour afficher le titre d'une page. Cependant, pour certains types de contenu, je veux que le page le titre principal doit être étiquette de type de conten (par exemple "News") et non pas étiquette de nœud (par exemple "Drupal 8 sorti!").
Existe-t-il un moyen simple d'y parvenir? Ma première supposition a été d'utiliser le template_preprocess_page_title
mais $variables
n'a aucun contexte sur le nœud, le type de nœud, etc ...
Comme mentionné par Ivan Jaros Vous pouvez utiliser hook_preprocess_page_title
.
Il vous suffit de charger le nœud à partir de la route d'abord, pour obtenir un peu de contexte.
function yourtheme_preprocess_page_title(&$variables) {
// Load the node entity from current route
if ($node = \Drupal::routeMatch()->getParameter('node')) {
// Load the label of the bundle
$bundle_label = \Drupal::entityTypeManager()
->getStorage('node_type')
->load($node->bundle())
->label();
// Set the page title
$variables['title'] = $bundle_label;
}
}
Si vous souhaitez simplement utiliser ceci avec certains types de contenu, vous pouvez utiliser $node->bundle()
pour obtenir le nom lisible par machine et le vérifier.
Linus l'a fait pour la fonction de prétraitement, mais je l'utiliserais personnellement pour obtenir le nœud actuel (car il est plus court et semble plus facile ...)
$node = \Drupal::request()->attributes->get('node')
Ensuite, pour accéder au titre du nœud, utilisez:
$title = $node->getTitle()
ou pour accéder à un autre champ personnalisé (avec une valeur):
$node->get('field_MYFIELD')->value
En fait, accédez à tout comme vous accéderiez à ces données dans une fonction de prétraitement de nœud régulière :)
Utilisez le module Metatag il est déjà prêt pour D8 et prend en charge ce dont vous avez besoin.
Faites un petit module. Deux fichiers requis:
Nom du fichier: liveeventtitles.info.yml
name: Live Event Titles
description: Programmatically generates titles for event node bundles.
package: Custom
type: module
version: 1.0
core: 8.x
dependencies:
- node
Fichier: liveeventtitles.module
<?php
/**
* @file
* Modify the node create/edit form and automatically generate a node title for event nodes.
*/
define('LIVEEVENTTITLES_PLACEHOLDER', '%LiveEventTitle%');
/**
* Implements hook_form_alter().
*/
function liveeventtitles_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
if ($form_id == 'node_event_form' || $form_id == 'node_event_edit_form') {
$title_widget = &$form['title']['widget'][0];
$default = (!empty($title_widget['value']['#default_value'])? $title_widget['value']['#default_value'] : LIVEEVENTTITLES_PLACEHOLDER);
$title_widget['value']['#default_value'] = $default;
$title_widget['value']['#type'] = 'value';
$title_widget['value']['#required'] = FALSE;
$form['title']['#access'] = FALSE;
}
}
/**
* Implements hook_node_presave
*/
function liveeventtitles_node_presave(Drupal\node\Entity\Node $node) {
$type = $node->getType();
if ($type == 'event') {
// Load the artist node to get the title
if ($artist_id = $node->field_artist->getString()) {
$artist = \Drupal\node\Entity\Node::load($artist_id);
$artist_name = $artist->title->getString();
}
// Load the Venue to get the title
if ($venue_id = $node->field_venue->getString()) {
$venue = \Drupal\node\Entity\Node::load($venue_id);
$venue_name = $venue->title->getString();
}
if (!empty($venue_name) && !empty($artist_name)) {
$node->setTitle($artist_name . ' at ' . $venue_name);
}
}
}
J'ai probablement plus que ce dont j'ai besoin, comme je ne pense pas avoir besoin d'une valeur par défaut et d'un PLACEHOLDER dans hook_form_alter () mais je dois donner à quelqu'un une raison de voter contre (-;
Dans THEMENAME_preprocess_html (& $ variables) {}, il y a $ variables ['head_title'] qui est l'instance la plus élevée pour le titre de la page (Titre structuré: $ variables ['head_title_array']). Il existe également d'autres clés de tableau intéressantes comme $ variables ['page'] ['content'] et $ variables ['node_type'] en fonction desquelles le titre peut être traité.
Pensée finale: $ variables ['head_title'] = ['title_part1', 'title_part2']; puisque dans le html.html.twig
<title>{{ head_title|safe_join(' | ') }}</title>