如何按内容类型覆盖页面标题


12

我正在使用pagetitle核心模块来呈现页面标题。但是,对于某些内容类型,我希望主标题应该是内容类型标签(例如“新闻”),而不是节点标签(例如“ Drupal 8已发布!”)。

有没有简单的方法可以实现?我的第一个猜测是使用,template_preprocess_page_title$variables没有关于节点,节点类型等的任何上下文。


您访问节点时,页面标题将显示该节点的内容类型标签是什么意思?
MrD

当你访问一个节点页面的标题是节点的名称(如“的Drupal 8发布!”我希望它是内容类型标题(如“新闻报”)。
菲利普·米格尔·丰塞卡

Answers:


25

如Ivan Jaros所述,您可以使用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

Linus将其正确地用于预处理功能,但我个人将使用它来获取当前节点(因为它更短且更容易...)

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

然后使用以下命令访问节点标题:

$title = $node->getTitle()

或访问另一个自定义字段(带有值):

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

实际上,以常规节点预处理函数中的所有方式访问所有数据:)


2

使用Metatag模块已经支持D8,并支持您所需要的。


尽管我不是100%支持页面标题栏中的覆盖标题。目前,我只知道它适用于页面标题。

感谢您的输入Ivan Jaros,据我所知,支持的页面标题就是HTML头上的页面标题,我想覆盖主标题。
菲利普·米格尔·丰塞卡

2
在这种情况下,hook_preprocess_page_title。从路由加载节点,获取实体类型并从那里获取标签。

这对于我的用户个人资料页面有效。
凯文(Kevin)

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

我可能有更多需要的东西,例如,我认为我不需要在hook_form_alter()中使用默认值和PLACEHOLDER,但我需要给某人一个理由以拒绝它(-;


0

在THEMENAME_preprocess_html(&$ variables){}中,有$ variables ['head_title'],它是页面标题的最高用例(结构化标题:$ variables ['head_title_array'])。还可以使用其他有趣的数组键,例如$ variables ['page'] ['content']和$ variables ['node_type'],可基于这些键处理标题。

最后的想法:$ variables ['head_title'] = ['title_part1','title_part2']; 从html.html.twig开始

<title>{{ head_title|safe_join(' | ') }}</title>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.