web-dev-qa-db-fra.com

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

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 ...

12

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.

25
Linus

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

4
ZyDucksLover

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

2
user21641

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

0
Joe Hyde

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>
0
Francis