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

Drupal 9 如何无主题页面模板输出纯HTML页面内容

Drupal 9 实现URL参数控制输出无主题包装纯内容页

你参考的Drupal 7实现逻辑在Drupal 9中完全可行,不需要开发自定义模块,在主题层即可完成配置,具体操作步骤如下:

第一步:编写主题预处理逻辑

打开当前启用主题根目录下的.theme文件,添加以下两个预处理钩子,注意将代码中所有MY_THEME替换为你当前主题的机读名称(即主题文件夹的名称):

/**
 * Implements hook_preprocess_html().
 */
function MY_THEME_preprocess_html(&$variables) {
  // 通过Drupal请求对象获取URL参数,兼容缓存机制
  $response_type = \Drupal::request()->query->get('response_type');
  if ($response_type === 'embed') {
    $variables['theme_hook_suggestions'][] = 'html__embed';
    // 可选:禁用该页面的动态缓存避免多余内容输出
    $variables['page']['#cache']['max-age'] = 0;
  }
}

/**
 * Implements hook_preprocess_page().
 */
function MY_THEME_preprocess_page(&$variables) {
  $response_type = \Drupal::request()->query->get('response_type');
  if ($response_type === 'embed') {
    $variables['theme_hook_suggestions'][] = 'page__embed';
  }
}

注意不要直接读取$_GET获取参数,Drupal 9的缓存机制会导致直接读取超全局变量时参数判断失效,必须通过核心请求对象获取参数。

第二步:创建对应Twig模板

Drupal 9不再使用.tpl.php后缀的模板文件,需使用.html.twig后缀,模板命名规则为:钩子名中的双下划线__替换为双连字符--。
在主题的templates目录(没有可手动新建)下新建两个模板文件:

  • 第一个文件命名为html--embed.html.twig,文件内仅保留一行代码,剔除默认html模板中的所有头部资源、页面框架、管理工具栏等冗余内容:
{{ page }}
  • 第二个文件命名为page--embed.html.twig,文件内仅保留核心内容区输出,剔除默认page模板中的页头、侧栏、页脚、面包屑等所有非内容区块:
{{ page.content }}

如果需要给纯内容页添加极简样式,可以直接在该模板内写内联样式,或者引入单独的极简样式文件,不要调用主题默认的全局样式资源。

第三步:生效配置

登录Drupal后台清空全站缓存,新的模板规则即可生效。
后续给链接添加?response_type=embed参数,同时给链接加上target="_blank"属性,点击后就会在新标签页打开不带任何主题包装的纯内容页面,示例链接写法:

<a href="/node/123?response_type=embed" target="_blank">查看纯内容页</a>

常见失效原因排查

  • 预处理函数中的主题名未替换为当前启用主题的机读名
  • 模板文件后缀错误,使用了Drupal7的.tpl.php后缀而非.html.twig
  • 模板文件存放路径错误,未放在当前启用主题的目录下
  • 修改配置后未清空全站缓存

其他可选方案(非必须)

如果仅需要给视图生成的页面提供纯内容输出,可以直接在视图配置中新建「嵌入」显示模式,选择无布局的行样式,不需要修改主题代码,但该方案仅适用于视图页,无法覆盖节点、自定义实体等通用内容页面。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 13:51:10