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
相关产品推荐
相关产品推荐

