it-swarm.com.de

So überschreiben Sie den Seitentitel nach Inhaltstyp

Ich verwende das Kernmodul pagetitle, um einen Seitentitel zu rendern. Für bestimmte Inhaltstypen möchte ich jedoch die seite Haupttitel ist Inhaltstyp-Label (z. B. "News") und nicht Knoten-Label (z. B. "Drupal 8 veröffentlicht!").

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

12

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

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() verwenden, um den maschinenlesbaren Namen abzurufen und ihn zu überprüfen.

25
Linus

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

4
ZyDucksLover

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

2
user21641

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
Joe Hyde

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