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

能否按内容类型预览Drupal内容?求对应技术方案

实现Drupal按内容类型匹配节点预览页面模板

当前Drupal节点预览时的模板匹配优先级如下:

page--node--preview--f7fd5df8-d58d-42f8-b274-8d224eddbb5a--full.html.twig
   ▪️ page--node--preview--f7fd5df8-d58d-42f8-b274-8d224eddbb5a.html.twig
   ✅ page--node--preview.html.twig
   ▪️ page--node.html.twig
   ▪️ page.html.twig

需要实现按内容类型匹配预览模板(例如使用page--node--preview--CONTENT-TYPE.html.twig,其中CONTENT-TYPE为内容类型机器名),但尝试的预处理函数未生效。


以下是经过验证的可行解决方案:

修正后的预处理函数

use Drupal\node\NodeInterface;

function THEME_theme_suggestions_page_alter(array &$suggestions, array $variables) {
  // 校验当前路由是否为节点预览路由
  if (\Drupal::routeMatch()->getRouteName() === 'entity.node.preview') {
    $node_preview = \Drupal::routeMatch()->getParameter('node_preview');
    // 确认获取到的是合法节点对象
    if ($node_preview instanceof NodeInterface) {
      // 添加内容类型专属的预览模板建议
      $suggestions[] = 'page__node__preview__' . $node_preview->bundle();
      // 可选:添加结合视图模式的精细化模板建议
      if ($view_mode = \Drupal::routeMatch()->getParameter('view_mode_id')) {
        $suggestions[] = 'page__node__preview__' . $node_preview->bundle() . '__' . $view_mode;
      }
    }
  }
}

操作步骤

  • 将代码中的THEME替换为你的主题机器名(例如my_custom_theme)
  • 将函数添加到主题的.theme配置文件中
  • 清除Drupal缓存(可通过后台配置 > 性能页面,或执行Drush命令drush cr)
  • 创建对应内容类型的模板文件,例如针对article内容类型,创建page--node--preview--article.html.twig
  • 测试节点预览,此时系统会优先匹配内容类型对应的专属预览模板

原函数未生效的常见原因

  1. 未校验当前路由是否为节点预览路由,导致逻辑在非预览场景下错误执行
  2. 未引入NodeInterface命名空间,导致节点类型判断失败
  3. 未清除缓存,新的模板建议未被系统识别

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 21:52:43