Jak zastąpić tytuł strony według typu zawartości

12

Używam pagetitlemodułu podstawowego do renderowania tytułu strony. Jednak dla niektórych typów treści chcęstronagłównym tytułem ma być etykieta typu treści (np. „Wiadomości”), a nie etykieta węzła (np. „Wydano Drupala 8!”).

Czy istnieje prosty sposób na osiągnięcie tego? Moje pierwsze przypuszczenie polegało na użyciu, template_preprocess_page_titleale $variablesbez kontekstu na temat węzła, typu węzła itp.

Filipe Miguel Fonseca
źródło
co masz na myśli mówiąc, że kiedy odwiedzasz węzeł, tytuł strony pokaże etykietę typu zawartości tego węzła?
MrD
Kiedy odwiedzasz węzeł, tytuł strony jest tytułem węzła (np. „Drupal 8 wydany!”. Chcę, aby był to tytuł typu zawartości (np. „Wiadomości”).
Filipe Miguel Fonseca

Odpowiedzi:

25

Jak wspomniano Ivan Jaros Możesz użyć hook_preprocess_page_title.

Musisz najpierw załadować węzeł z trasy, aby uzyskać kontekst.

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

Jeśli chcesz tego używać tylko z niektórymi typami treści, możesz użyć $node->bundle()tej nazwy, aby uzyskać nazwę do odczytu maszynowego i porównać z nią.

Linus
źródło
1
To zmienia tytuł block_title. Jednak nie zastępuje tytułu strony. Każdy pomysł, jak ustawić tytuł strony na taką samą wartość jak
tabelka rysunkowa
4

Linus ma to odpowiednie dla funkcji wstępnego przetwarzania, ale osobiście użyłbym tego, aby uzyskać bieżący węzeł (ponieważ jest krótszy i wydaje się łatwiejszy ...)

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

Następnie, aby uzyskać dostęp do tytułu węzła, użyj:

$title = $node->getTitle()

lub aby uzyskać dostęp do innego niestandardowego pola (z wartością):

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

W rzeczywistości masz dostęp do wszystkich danych w taki sam sposób, w jaki miałbyś dostęp do tych danych w zwykłej funkcji wstępnego przetwarzania węzła :)

ZyDucksLover
źródło
2

Użyj modułu Metatag , który jest już gotowy na D8 i obsługuje to, czego potrzebujesz.

DRUPWAY
źródło
Chociaż nie jestem w 100%, jeśli obsługuje nadpisywanie tytułu w bloku tytułowym strony. W tym momencie wiem tylko, że to działa na tytuł strony.
Dzięki za wprowadzenie Ivana Jarosa, o ile mogę stwierdzić, że obsługiwany tytuł strony jest nagłówkiem HTML, chcę zastąpić tytuł główny.
Filipe Miguel Fonseca
2
W takim przypadku hook_preprocess_page_title. Załaduj węzeł z trasy, uzyskaj typ jednostki i stamtąd uzyskaj etykietę.
To działało dla mnie na stronie profilu użytkownika.
Kevin,
0

Zrób mały moduł. Wymagane dwa pliki:

Nazwa pliku: 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

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

Prawdopodobnie mam więcej niż potrzebuję, na przykład nie sądzę, że potrzebuję wartości domyślnej i PLACEHOLDER w hook_form_alter (), ale muszę dać komuś powód, aby zagłosować w dół (-;

Joe Hyde
źródło
0

W THEMENAME_preprocess_html (& zmienne $) {} znajduje się zmienna $ ['head_title'], która jest najwyższym układem strony - tytuł strony (Structured title: $ variable ['head_title_array']). Istnieją również inne interesujące klucze tablicy, takie jak $ zmienne [„strona”] [„treść”] i $ zmienne [„typ_węzła”], na podstawie których można przetwarzać tytuł.

Ostatnia myśl: $ zmienne ['head_title'] = ['title_part1', 'title_part2']; ponieważ w pliku html.html.twig

<title>{{ head_title|safe_join(' | ') }}</title>
Francis
źródło