Jak wyświetlić aktualny tytuł węzła w page.html.twig LUB w node.html.twig?

14

Jeśli chcę wyświetlić bieżący tytuł węzła w page.html.twig (domyślnie wydaje się, że jest dostępny tylko w node.html.twig), muszę utworzyć funkcję wstępnego przetwarzania w następujący sposób:

function theme_preprocess_page(&$variables, $hook) {
  // Set our page title so we can access it in page.html.twig
  if ($node = \Drupal::routeMatch()->getParameter('node')) {
    $variables['my_node_title'] = $node->title->value;
  }
}

A potem muszę nadpisać page-title.html.twig, kopiując go do mojego bieżącego folderu motywów i komentując wszystko.

To nie wydaje się „właściwe”. Czy jest lepszy sposób?

Greg
źródło

Odpowiedzi:

21

Węzeł jest już dostępny w szablonie strony, dzięki template_preprocess_pageczemu nie ma potrzeby korzystania z funkcji wstępnego przetwarzania. Możesz wypisać tytuł za pomocą:

{{ node.label }}

Sam tytuł strony to blok, więc jeśli już go nie potrzebujesz, po prostu usuń go z regionu w / admin / structure / block. Nie trzeba kopiować szablonu do motywu ani zmieniać oryginału.

Clive
źródło
To nie wydaje się działać na pierwszej stronie, gdzie nodejest po prostu NULL. Czy istnieje sposób na uzyskanie dowolnego tytułu strony, w tym tytułu pierwszej strony (nawet jeśli zastosowano zastąpienie tytułu )?
Florian Brucker
Zgadza się @FlorianBrucker - chyba że strona główna jest węzłem, nie byłaby dostępna zmienna węzła. Tytuł prawdopodobnie jest w page['#title']środku, nie jestem pewien, czy zawierałoby to jakiekolwiek zmiany wprowadzone przez VIews (ale prawdopodobnie)
Clive
@Clive Niestety, tutaj page['#title']jest pusty ciąg znaków page.html.twig.
Florian Brucker
Szkoda, myślę, że było to ważne w pewnym momencie w przeszłości, oczywiście nie teraz. To podobne pytanie może pomóc
Clive
@Clive, dzięki za wskaźnik, ale to też mi nie pomogło. Zadałem pytanie dotyczące tego problemu .
Florian Brucker
3

Możesz dodać poniższe kody na górze node.html.twigw folderze szablonów swojego motywu:

{% if not page %}
  <h2{{ title_attributes }}>
    <a href="{{ url }}" rel="bookmark">{{ label }}</a>
  </h2>
{% endif %}

{% if page %}
  <h2{{ title_attributes }}>
    {{ label }}
  </h2>
{% endif %}
Mojtaba Reyhani
źródło
0

Kod Drupal 8 służący do robienia tego, co powinien zrobić kod pokazany poniżej, jest następujący.

function theme_preprocess_page(&$variables) {
  $request = \Drupal::request();
  $route_match = \Drupal::routeMatch();
  if ($route_match->getParameter('node')) {
    $page_title = \Drupal::service('title_resolver')->getTitle($request, $route_match->getRouteObject());
    $variables['my_node_title'] = $page_title;
  }
}
kiamlaluno
źródło