Как переопределить заголовок страницы по типу контента

12

Я использую pagetitleосновной модуль для отображения заголовка страницы. Тем не менее, для определенных типов контента я хочустраницаОсновной заголовок должен быть меткой типа контента (например, «Новости»), а не меткой узла (например, «Drupal 8 выпустил!»).

Есть ли простой способ добиться этого? Мое первое предположение было использовать, template_preprocess_page_titleно не $variablesимеет никакого контекста об узле, типе узла и т. Д ...

Филипе Мигель Фонсека
источник
Что вы имеете в виду, что при посещении узла в заголовке страницы будет отображаться метка типа содержимого этого узла?
MrD
Когда вы посещаете узел, заголовок страницы является заголовком узла (например, «Drupal 8 выпустил!». Я хочу, чтобы это был заголовок типа контента (например, «Новости»).
Filipe Miguel Fonseca

Ответы:

25

Как упомянул Иван Ярош Вы можете использовать hook_preprocess_page_title.

Вам просто нужно сначала загрузить узел из маршрута, чтобы получить некоторый контекст.

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

Если вы просто хотите использовать это с определенными типами контента, вы можете использовать, $node->bundle()чтобы получить машиночитаемое имя и проверить его.

Линус
источник
1
Это меняет название для block_title. Однако это не отменяет заголовок страницы. Любая идея, как установить для заголовка страницы то же значение, что и для заголовка
Malabya ​​Tewari
4

Линус понял это правильно для функции предварительной обработки, но я лично использовал бы ее, чтобы получить текущий узел (так как он короче и кажется проще ...)

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

Затем, чтобы получить доступ к заголовку узла, используйте:

$title = $node->getTitle()

или для доступа к другому настраиваемому полю (со значением):

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

На самом деле, доступ ко всему так же, как и к этим данным в обычной функции предварительной обработки узла :)

ZyDucksLover
источник
2

Используйте модуль Metatag, он уже готов для D8 и поддерживает то, что вам нужно.

DRUPWAY
источник
Хотя я не на 100%, если он поддерживает переопределение заголовка в блоке заголовка страницы. На данный момент я знаю только, что это работает для заголовка страницы.
Спасибо за вклад Иван Ярош, насколько я могу судить, что заголовок поддерживаемой страницы - это заголовок HTML, я хочу переопределить основной заголовок.
Филипе Мигель Фонсека
2
В этом случае hook_preprocess_page_title. Загрузите узел из маршрута, получите тип сущности и получите оттуда метку.
Это сработало для меня на странице профиля пользователя.
Кевин
0

Сделайте небольшой модуль. Требуются два файла:

Имя файла: 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

Файл: 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);
    }
  }
}

Возможно, у меня больше, чем мне нужно, например, я не думаю, что мне нужно значение по умолчанию и PLACEHOLDER в hook_form_alter (), но мне нужно дать кому-то причину, чтобы проголосовать за это (-;

Джо Хайд
источник
0

В THEMENAME_preprocess_html (& $ variable) {} есть $ variable ['head_title'], который является высшим экземпляром для заголовка страницы (Структурированное название: $ variable ['head_title_array']). Есть также другие интересные ключи массива, такие как $ variable ['page'] ['content'] и $ variable ['node_type'], на основе которых можно обрабатывать заголовок.

Заключительная мысль: $ variable ['head_title'] = ['title_part1', 'title_part2']; так как в html.html.twig

<title>{{ head_title|safe_join(' | ') }}</title>
Фрэнсис
источник