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.


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


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


2

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


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


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>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.