So überschreiben Sie den Seitentitel nach Inhaltstyp


12

Ich verwende das pagetitleKernmodul, um einen Seitentitel zu rendern. Für bestimmte Inhaltstypen möchte ich jedoch dieSeiteHaupttitel ist die Bezeichnung des Inhaltstyps (z. B. "News") und nicht die Bezeichnung des Knotens (z. B. "Drupal 8 veröffentlicht!").

Gibt es einen einfachen Weg, dies zu erreichen? Meine erste Vermutung war, das zu verwenden template_preprocess_page_title, $variableshat aber keinerlei Kontext über Knoten, Knotentyp usw.


Was bedeutet es, dass beim Besuch eines Knotens im Seitentitel die Bezeichnung des Inhaltstyps dieses Knotens angezeigt wird?
MrD

Wenn Sie einen Knoten besuchen, ist der Titel der Seite der Titel des Knotens (z. B. "Drupal 8 veröffentlicht!"). Ich möchte, dass es sich um den Titel des Inhaltstyps handelt (z. B. "Nachrichten").
Filipe Miguel Fonseca

Antworten:


25

Wie von Ivan Jaros erwähnt, können Sie verwenden hook_preprocess_page_title.

Sie müssen nur zuerst den Knoten von der Route laden, um einen Kontext zu erhalten.

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

Wenn Sie dies nur für bestimmte Inhaltstypen verwenden möchten, können Sie $node->bundle()den maschinenlesbaren Namen abrufen und ihn überprüfen.


1
Dies ändert den Titel für die block_title. Der Seitentitel wird jedoch nicht überschrieben. Irgendeine Idee, wie man den
Seitentitel

4

Linus hat es für die Vorverarbeitungsfunktion richtig gemacht, aber ich persönlich würde dies verwenden, um den aktuellen Knoten zu erhalten (da er kürzer ist und einfacher zu sein scheint ...)

$node = \Drupal::request()->attributes->get('node')

Verwenden Sie dann, um auf den Knotentitel zuzugreifen:

$title = $node->getTitle()

oder um auf ein anderes benutzerdefiniertes Feld (mit einem Wert) zuzugreifen:

$node->get('field_MYFIELD')->value

Greifen Sie in einer regulären Knotenvorverarbeitungsfunktion auf alles zu, wie Sie auf diese Daten zugreifen würden :)


2

Verwenden Sie das Metatag- Modul, das bereits D8- fähig ist und alles unterstützt, was Sie benötigen.


Obwohl ich nicht 100% bin, wenn es das Überschreiben von Titeln im Seitentitelblock unterstützt. Zu diesem Zeitpunkt weiß ich nur, dass es für den Seitentitel funktioniert.

Vielen Dank für die Eingabe Ivan Jaros. Soweit ich feststellen kann, dass der unterstützte Seitentitel der Titel im HTML-Kopf ist, möchte ich den Haupttitel überschreiben.
Filipe Miguel Fonseca

2
In diesem Fall hook_preprocess_page_title. Laden Sie den Knoten von der Route, rufen Sie den Entitätstyp ab und rufen Sie von dort die Beschriftung ab.

Dies funktionierte bei mir für die Benutzerprofilseite.
Kevin

0

Machen Sie ein kleines Modul. Zwei Dateien erforderlich:

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

Datei: 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);
    }
  }
}

Ich habe wahrscheinlich mehr als ich brauche, zum Beispiel glaube ich nicht, dass ich einen Standardwert und PLACEHOLDER in hook_form_alter () brauche, aber ich muss jemandem einen Grund geben, dies abzustimmen (-;


0

In THEMENAME_preprocess_html (& $ variables) {} gibt es die $ variables ['head_title'], die die höchste Handinstanz für den Seitentitel ist (strukturierter Titel: $ variables ['head_title_array']). Es gibt auch andere interessante Array-Schlüssel wie $ variables ['page'] ['content'] und $ variables ['node_type'], auf deren Grundlage der Titel verarbeitet werden kann.

Letzter Gedanke: $ variables ['head_title'] = ['title_part1', 'title_part2']; da in der html.html.twig

<title>{{ head_title|safe_join(' | ') }}</title>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.