Як замінити назву сторінки за типом вмісту


12

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

Чи є простий спосіб цього досягти? Моя перша здогадка полягала у використанні, template_preprocess_page_titleале $variablesне має жодного контексту щодо вузла, типу вузла тощо ...


що ви маєте на увазі, що під час відвідування вузла в заголовку сторінки відображатиметься мітка типу вмісту цього вузла?
Г-н

Коли ви відвідуєте вузол, заголовок сторінки - це заголовок вузла (наприклад, "Drupal 8 випущено!". Я хочу, щоб це був тип вмісту типу (наприклад, "Новини").
Філіпе Мігель Фонсека,

Відповіді:


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. Однак це не перекриває заголовок сторінки. Будь-яка ідея, як отримати заголовок сторінки таким же значенням, як блок заголовку
Малавія Тьюрі

4

Лінус отримав право на функцію попередньої обробки, але я особисто використовував це для отримання поточного вузла (оскільки він коротший і здається легшим ...)

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

Потім для доступу до назви вузла використовуйте:

$title = $node->getTitle()

або для доступу до іншого спеціального поля (зі значенням):

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

Насправді, отримуйте доступ до всього, як ви отримаєте доступ до цих даних, у звичайній функції попередньої обробки вузла :)


2

Використовуйте модуль Metatag, він вже готовий до D8 і підтримує те, що вам потрібно.


Хоча я не на 100%, якщо він підтримує переважаючий заголовок у блоці заголовка сторінки. На даний момент я знаю лише, що це працює для назви сторінки.

Дякую за вхід Іване Ярошу, наскільки я можу сказати, що підтримуваний заголовок сторінки - це той, що знаходиться на голові HTML, я хочу переосмислити головний заголовок.
Філіпе Мігель Фонсека,

2
У цьому випадку гак_препроцес_сторінка_тит. Завантажте вузол з маршруту, отримайте тип сутності та отримайте мітку звідти.

Це працювало для мене на сторінці профілю користувача.
Кевін

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 у moll_form_alter (), але мені потрібно дати комусь причину проголосувати за це (-;


0

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

Заключна думка: $ змінних ['head_title'] = ['title_part1', 'title_part2']; оскільки в html.html.twig

<title>{{ head_title|safe_join(' | ') }}</title>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.