无附加HTML框时如何查找编辑Moodle page-header源码
Moodle原生课程页面源码路径及page-header区块定位方法
以下路径均为不使用附加HTML框插件的原生渲染逻辑路径,按渲染执行顺序排列:
排查中断问题修正
你卡在{{{ output.full_header }}}节点的核心原因是两个拼写错误:
- 你提到的模板文件名是
drawers.mustache,不是drawers.mustche - 该输出项对应的PHP方法、模板变量均为下划线分隔的
full_header,你用带空格的full header、点分隔的full.header作为关键词检索,不可能匹配到结果。
另外Moodle的mustache模板中output.xxx格式的输出项,不是引用其他mustache模板,是直接调用核心渲染器的对应方法返回拼接好的HTML字符串,不存在你要找的跨模板引用链。
各层源码存放路径
- PHP逻辑层(负责数据拉取、权限校验、内容组装)
- 课程页面统一入口:
/course/view.php,所有课程前台页的请求都会先经过这个文件,完成课程读取、权限判断、页面初始化 - page-header核心组装方法:
/lib/outputlib.php中core_renderer类的full_header()方法,就是output.full_header对应的实际逻辑,负责把头部资源、页头DOM、导航数据拼合成完整的header字符串 - 课程专属页头逻辑:
/course/lib.php中的course_get_header()函数,负责拼接课程全名、编辑状态按钮、课程进度提示等课程页专属的header内容 - 主题覆写逻辑:如果使用boost主题,优先检查
/theme/boost/lib.php中theme_boost_core_renderer类是否重写了full_header()方法,主题重写的方法优先级高于核心逻辑
- 课程页面统一入口:
- 模板层(负责输出固定HTML结构)
- 全局页面外壳:
/theme/boost/templates/drawers.mustache,也就是你找到的布局文件,{{{ output.full_header }}}所在位置就是页头内容的插入点 - 核心页头模板:默认的
<div id="page-header">结构存放在/lib/templates/page_header.mustache,头部meta、CSS/JS资源引用存放在/lib/templates/head.mustache,两个文件的渲染结果共同组成full_header返回的内容 - 主题覆写模板:如果boost主题自定义了页头结构,对应覆写的模板会存放在
/theme/boost/templates/core/page_header.mustache,这个路径的模板优先级高于核心lib目录下的模板,排查时优先检查
- 全局页面外壳:
- SQL数据层(负责页头相关数据查询)
- 课程基础信息查询逻辑在
/course/lib.php的get_course()方法中,对应查询mdl_course表的课程名称、摘要、显示设置等字段 - 面包屑、顶部导航的查询逻辑在
/lib/navigationlib.php的navigation_node类中,会关联查询mdl_course_categories、mdl_context、mdl_course_sections等表的数据组装导航节点
- 课程基础信息查询逻辑在
快速修改标红区块的操作步骤
- 先访问
/admin/purgecaches.php清空Moodle的模板缓存,避免修改后因为缓存不生效 - 优先检查主题覆写模板路径
/theme/boost/templates/core/page_header.mustache,如果文件存在直接修改即可,是最高优先级的渲染文件 - 如果该路径不存在文件,直接修改核心模板
/lib/templates/page_header.mustache的DOM结构 - 如果需要调整页头的动态内容(比如增减按钮、修改显示字段),不要改模板,找到对应渲染器的
full_header()方法调整组装逻辑即可
排查注意事项
- 不要死磕前端看到的
page-header选择器:主题重写渲染逻辑时可能修改div的id、class属性,前端看到的选择器不一定能在源码里直接搜到 - 遇到指向不存在文件的引用是正常现象:Moodle支持插件、主题动态注入页面内容,很多引用是运行时动态注册的,没有对应的实体文件,追渲染器方法比追文件引用效率高很多
内容的提问来源于stack exchange,提问作者Dean Howard
相关产品推荐
相关产品推荐

