如何在Grav的Twig模板中单独获取页面的标题、副标题、子副标题
刚好做过类似的Grav模板定制,给你一套靠谱的解决方案:
在Grav Twig模板中获取自定义标题层级的方法
第一步:在页面Markdown文件中规范定义标题字段
首先确保每个页面的frontmatter(.md文件顶部的YAML配置块)里,用固定字段名声明三个标题:
--- title: "我的主标题" subtitle: "这是副标题" subsubtitle: "最底层的子副标题" --- // 页面正文内容...
这里title是Grav默认支持的字段,subtitle和subsubtitle是我们自定义的固定字段名,只要后续不修改这些字段名,模板就能稳定读取。
第二步:在Twig模板中安全调用字段值
在你的Twig模板(比如templates/page.html.twig或自定义模板文件)中,通过page.header对象访问这些字段。为了避免空字段输出破坏布局,建议加上存在性判断:
<!-- 页面标题区域 --> <div class="page-header-group"> <h1 class="main-title">{{ page.header.title }}</h1> {% if page.header.subtitle %} <h2 class="sub-title">{{ page.header.subtitle }}</h2> {% endif %} {% if page.header.subsubtitle %} <h3 class="sub-sub-title">{{ page.header.subsubtitle }}</h3> {% endif %} </div>
这样只有当页面填写了对应字段时,模板才会渲染对应的标签,不会出现空的标题元素。
第三步:(可选)让Admin后台支持可视化编辑
如果你用Grav Admin插件管理页面,默认没有subtitle和subsubtitle的输入框,可以通过自定义页面蓝图添加这些字段,让用户在后台直接填写:
- 在
user/blueprints/pages/目录下创建或修改蓝图文件(比如default.yaml) - 添加字段配置:
title: Default Page form: fields: tabs: fields: content: fields: # 保留默认主标题字段 header.title: type: text label: Main Title validate: required: true # 添加副标题字段 header.subtitle: type: text label: Subtitle # 添加子副标题字段 header.subsubtitle: type: text label: Subsubtitle
保存后,Admin后台编辑页面时就会出现这两个字段的输入框,用户无需手动编写YAML。
核心优势
这种方案完全匹配你的需求:不管后续页面内容结构怎么调整(比如正文添加模块、修改布局),只要用户保持title、subtitle、subsubtitle这三个字段名不变,模板就能自动读取并渲染标题,无需修改模板代码。
内容的提问来源于stack exchange,提问作者M.E.




