Cách ghi đè tiêu đề trang theo loại nội dung


12

Tôi đang sử dụng pagetitlemô-đun lõi để hiển thị tiêu đề trang. Tuy nhiên, đối với một số loại nội dung tôi muốntrangtiêu đề chính là nhãn loại nội dung (ví dụ: "Tin tức") chứ không phải nhãn nút (ví dụ: "Drupal 8 được phát hành!").

Có một cách đơn giản để đạt được nó? Dự đoán đầu tiên của tôi là sử dụng template_preprocess_page_titlenhưng $variableskhông có ngữ cảnh nào về nút, loại nút, v.v ...


Ý bạn là gì khi bạn truy cập một nút, tiêu đề trang sẽ hiển thị nhãn loại nội dung của nút này?
MrD

Khi bạn truy cập một nút, tiêu đề của trang là tiêu đề của nút (ví dụ: "Drupal 8 được phát hành!". Tôi muốn nó là tiêu đề loại nội dung (ví dụ: "Tin tức").
Filipe Miguel Fonseca

Câu trả lời:


25

Như được đề cập bởi Ivan Jaros Bạn có thể sử dụng hook_preprocess_page_title.

Bạn chỉ cần tải nút từ tuyến đầu tiên, để có được một số bối cảnh.

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

Nếu bạn chỉ muốn sử dụng điều này với một số loại nội dung nhất định, bạn có thể sử dụng $node->bundle()để có được tên máy có thể đọc được và kiểm tra lại nó.


1
Điều này thay đổi tiêu đề cho block_title. Tuy nhiên, nó không ghi đè tiêu đề Trang. Mọi ý tưởng làm thế nào để đặt tiêu đề trang được đặt cùng giá trị với khối tiêu đề
Malabya ​​Tewari

4

Linus đã hiểu đúng về chức năng tiền xử lý, nhưng cá nhân tôi sử dụng điều này để có được nút hiện tại (vì nó ngắn hơn và có vẻ dễ dàng hơn ...)

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

Sau đó, để truy cập tiêu đề nút, sử dụng:

$title = $node->getTitle()

hoặc để truy cập vào trường tùy chỉnh khác (có giá trị):

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

Trên thực tế, truy cập mọi thứ theo cách bạn truy cập các dữ liệu này trong chức năng tiền xử lý nút thông thường :)


2

Sử dụng mô-đun Metatag, nó đã sẵn sàng D8 và hỗ trợ những gì bạn cần.


Mặc dù tôi không 100% nếu nó hỗ trợ ghi đè tiêu đề trong khối tiêu đề trang. Tại thời điểm này tôi chỉ biết nó hoạt động cho tiêu đề trang.

Cảm ơn về đầu vào Ivan Jaros, theo như tôi có thể nói tiêu đề trang được hỗ trợ là tiêu đề trên đầu HTML, tôi muốn ghi đè tiêu đề chính.
Filipe Miguel Fonseca

2
Trong trường hợp đó hook_pre process_page_title. Tải nút từ tuyến đường, lấy thực thể và nhận nhãn từ đó.

Điều này làm việc cho tôi cho trang hồ sơ người dùng.
Kevin

0

Tạo một mô-đun nhỏ. Cần có hai tệp:

Tên tệp: liveeventtitle.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

Tập tin: liveeventtitle.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);
    }
  }
}

Tôi có thể có nhiều hơn tôi cần, chẳng hạn như tôi không nghĩ rằng tôi cần một giá trị mặc định và PLACEHOLDER trong hook_form_alter () nhưng tôi cần cho ai đó lý do để bỏ phiếu này (-;


0

Trong THEMENAME_pre process_html (& $ biến) {} có $ biến ['head_title'] là ví dụ cao nhất cho tiêu đề trang (Tiêu đề có cấu trúc: $ biến ['head_title_array']). Ngoài ra còn có các khóa mảng thú vị khác như $ biến ['page'] ['content'] và $ biến ['node_type'] dựa trên đó tiêu đề có thể được xử lý.

Suy nghĩ cuối cùng: $ biến ['head_title'] = ['title_part1', 'title_part2']; kể từ trong html.html.twig

<title>{{ head_title|safe_join(' | ') }}</title>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.