能否按内容类型预览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 - 测试节点预览,此时系统会优先匹配内容类型对应的专属预览模板
原函数未生效的常见原因
- 未校验当前路由是否为节点预览路由,导致逻辑在非预览场景下错误执行
- 未引入
NodeInterface命名空间,导致节点类型判断失败 - 未清除缓存,新的模板建议未被系统识别
内容的提问来源于stack exchange,提问作者McHunkerson
相关产品推荐
相关产品推荐

