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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 09:18:35