
在moodle自定义页面中直接使用echo format_text($course->summary);会导致课程摘要中的图片无法正常显示,仅呈现文件名及小图标(如“image.jpg”旁带默认缩略图)。这是因为$course->summary存储的是富文本内容,其中图片引用的是相对路径或未解析的pluginfile.php链接,而当前上下文缺乏必要的文件访问权限与路径重写机制。
要正确渲染含图片的课程摘要,推荐以下两种专业、安全且符合Moodle最佳实践的方法:
✅ 方法一:使用课程渲染器(推荐)
Moodle 3.2+ 提供了内置的 coursecat_helper 渲染器,它会自动处理文件URL重写、HTML过滤与上下文适配:
global $CFG; require_once($CFG->dirroot . '/course/renderer.php'); $renderer = new \core_course\output\coursecat_helper(); // 注意:新版应使用命名空间类 $summary = $renderer->get_course_formatted_summary($course, FORMAT_HTML, ['overflowdiv' => true]); echo $summary;
⚠️ 注意:coursecat_helper 在较新版本中已迁移至 \core_course\output\coursecat_helper 命名空间,请根据你的Moodle版本(≥3.9建议用此路径)调整。若使用旧版(如3.5–3.8),可保留 new coursecat_helper(),但需确保已引入对应类文件。
✅ 方法二:手动重写插件文件URL(灵活可控)
适用于需精细控制格式或集成到非标准上下文(如AJAX响应、API输出)的场景:
$context = context_course::instance($course->id);
$summary = file_rewrite_pluginfile_urls(
$course->summary,
'pluginfile.php',
$context->id,
'course',
'summary',
null // itemid 为 null 表示课程级别摘要(无需指定具体附件ID)
);
echo format_text($summary, FORMAT_HTML, ['context' => $context]);? 关键说明:
- file_rewrite_pluginfile_urls() 将
替换为完整可访问的 pluginfile.php?file=... URL;
- 必须传入正确的 context(课程上下文),否则权限校验失败,图片仍不可见;
- 后续调用 format_text() 时显式传入 ['context' => $context],确保HTML过滤器能正确解析媒体资源。
? 总结与注意事项
- ❌ 避免直接 echo format_text($course->summary) —— 缺失上下文与URL重写,图片必然失效;
- ✅ 优先选用渲染器方案(get_course_formatted_summary),它已封装安全过滤、响应式适配与多格式支持;
- ?️ 所有文件操作必须基于有效 context,切勿硬编码或复用其他模块的上下文;
- ? 开发调试时,可临时启用 debugging(E_ALL, DEBUG_DEVELOPER) 并检查浏览器开发者工具的Network标签,确认图片请求是否返回404或303重定向失败。
通过上述任一方式,即可在自定义页面中完整、安全、响应式地呈现含图片的课程摘要内容。

替换为完整可访问的 pluginfile.php?file=... URL;









