如何在Moodle 4.0自定义主题中重载cm::export_for_template方法
在Moodle 4.0自定义主题中重载
cm::export_for_template方法的正确方式 要解决这个问题,首先得明确:Moodle的AJAX服务core_courseformat_get_state调用的类并不走主题渲染器工厂(renderer factory),它属于课程格式的输出组件范畴,而非主题渲染器类,这也是你之前方案无效的核心原因。以下是正确实现步骤:
1. 利用Moodle类自动重载机制
Moodle支持通过特定命名空间的类文件自动重载核心类,无需依赖主题渲染器配置:
- 在你的自定义主题目录下,创建路径:
classes/output/local/state/ - 在该路径下新建
cm.php文件,写入以下代码:
<?php namespace theme_mytheme\output\local\state; use core_courseformat\output\local\state\cm as core_cm; class cm extends core_cm { /** * 重载export_for_template方法修改输出数据 * @param \renderer_base $output * @return array */ public function export_for_template(\renderer_base $output) { // 获取父类原始输出数据 $data = parent::export_for_template($output); // 在这里自定义修改数据,示例操作: // 添加自定义字段 $data['custom_tag'] = '自定义标识'; // 修改现有字段内容 $data['name'] = '[自定义] ' . $data['name']; // 删除不需要的字段 unset($data['availabilityinfo']); return $data; } }
2. 清除Moodle缓存
Moodle会缓存类映射关系,必须执行缓存清除操作:
- 后台路径:站点管理 → 开发 → 清除缓存
- 或命令行执行:
php admin/cli/purge_caches.php
3. 验证效果
刷新课程页面(可强制刷新或清除浏览器缓存),触发左侧抽屉的AJAX加载,此时返回的JSON数据会包含你修改后的内容。
补充说明
如果需要同时调整展示逻辑,你依然可以重载/theme/mytheme/templates/core_courseformat/local/courseindex/cm.mustache模板,配合修改后的数据实现自定义展示。
内容的提问来源于stack exchange,提问作者pgee70
相关产品推荐
相关产品推荐

