Comment remplacer le titre de la page par le type de contenu

12

J'utilise le pagetitlemodule principal pour afficher le titre d'une page. Cependant, pour certains types de contenu, je veux que lepagele titre principal doit être le libellé du type de contenu (par exemple "News") et non le libellé du 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_titlemais $variablesn'a aucun contexte sur le nœud, le type de nœud, etc ...

Filipe Miguel Fonseca
la source
que voulez-vous dire que lorsque vous visitez un nœud, le titre de la page affiche l'étiquette de type de contenu de ce nœud?
MrD
Lorsque vous visitez un nœud, le titre de la page est le titre du nœud (par exemple, "Drupal 8 est sorti!". Je veux que ce soit le titre du type de contenu (par exemple, "Actualités").
Filipe Miguel Fonseca

Réponses:

25

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 cela avec certains types de contenu, vous pouvez utiliser $node->bundle()pour obtenir le nom lisible par machine et le vérifier.

Linus
la source
1
Cela change le titre du fichier block_title. Cependant, il ne remplace pas le titre de la page. Toute idée comment obtenir le titre de la page à la même valeur que le bloc de titre
Malabya ​​Tewari
4

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 :)

ZyDucksLover
la source
2

Utilisez le module Metatag, il est déjà prêt pour D8 et prend en charge ce dont vous avez besoin.

DRUPWAY
la source
Bien que je ne sois pas à 100% s'il prend en charge le titre prioritaire dans le bloc de titre de la page. À ce stade, je sais seulement que cela fonctionne pour le titre de la page.
Merci pour l'entrée Ivan Jaros, pour autant que je sache que le titre de la page prise en charge est celui de la tête HTML, je veux remplacer le titre principal.
Filipe Miguel Fonseca du
2
Dans ce cas, hook_preprocess_page_title. Chargez le nœud de route, obtenez le type d'entité et obtenez l'étiquette à partir de là.
Cela a fonctionné pour moi pour la page de profil utilisateur.
Kevin
0

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 (-;

Joe Hyde
la source
0

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>
Francis
la source