You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Drupal 10模块中替代标题无法显示的问题排查

Drupal节点替代标题不生效的解决办法

问题描述

开发自定义模块时,希望当节点的替代标题字段field_titel不为空时,替换节点原标题显示。目前使用hook_preprocess_page()修改$variables['#title'],虽然Messenger能输出修改后的标题,但页面实际仍显示原标题。

原因分析

hook_preprocess_page()中修改的$variables['#title']不一定会被主题模板取用:

  • 多数主题的页面标题依赖page_title区块渲染,而非直接使用$variables['#title']
  • 节点自身的标题显示通常在node.html.twig模板中调用节点的label变量,和页面预处理器的#title无关

解决方案

方案1:使用hook_preprocess_node()修改节点标题(推荐)

直接修改节点模板的标题变量,同时同步更新页面标题,确保节点显示和页面头部标题一致:

use Drupal\node\Entity\Node;

/**
 * Implements hook_preprocess_node().
 */
function alternative_title_preprocess_node(&$variables) {
  $node = $variables['node'];
  // 仅针对info类型节点处理
  if ($node->bundle() !== 'info') {
    return;
  }

  $alternative_title = $node->get('field_titel')->value;
  if (!empty(trim($alternative_title))) {
    // 修改节点模板中使用的标题变量
    $variables['label'] = $alternative_title;
    // 同步更新页面标题(浏览器标签+页面标题区块)
    if (\Drupal::routeMatch()->getRouteName() === 'entity.node.canonical') {
      \Drupal::service('page_title_resolver')->setTitle($alternative_title);
    }
  }
}

方案2:使用hook_page_title_alter()直接修改页面标题

如果只需要修改页面头部的标题(浏览器标签、页面标题区块),可以用这个钩子:

/**
 * Implements hook_page_title_alter().
 */
function alternative_title_page_title_alter(&$title, $context) {
  // 仅处理节点详情页
  if ($context['route_name'] !== 'entity.node.canonical') {
    return;
  }

  $node = \Drupal::routeMatch()->getParameter('node');
  if (!$node instanceof Node || $node->bundle() !== 'info') {
    return;
  }

  $alternative_title = $node->get('field_titel')->value;
  if (!empty(trim($alternative_title))) {
    $title = $alternative_title;
  }
}

注意事项

  • 确保field_titel字段是文本类型,如果是其他类型(比如实体引用)需要调整取值方式(如->target_id或->entity->label())
  • 修改钩子代码后必须清除Drupal缓存,否则新代码不会生效
  • 检查自定义主题的模板文件:如果主题重写了node.html.twig,确认标题是使用{{ label }}而非硬编码的原标题

内容的提问来源于stack exchange,提问作者svenjaleo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 05:41:12