开发Moodle mod插件时自定义活动完成规则失效,求排查方案
解决Moodle自定义活动完成规则不生效问题
针对你在Moodle 3.11.7开发mod插件时遇到的自定义完成规则方法未执行、activity_information()无输出的问题,按以下步骤排查修复:
1. 确认类文件路径与自动加载
Moodle的自动加载器依赖命名空间对应目录结构,你的\mod_cwr\completion\custom_completion类必须放在:
mod/cwr/classes/completion/custom_completion.php
如果文件路径错误,Moodle无法加载该类,所有自定义规则方法自然不会执行。
2. 验证lib.php的supports配置
确保mod_cwr_supports方法正确返回FEATURE_COMPLETION_HAS_RULES:
function mod_cwr_supports($feature) { switch ($feature) { case FEATURE_GRADE_HAS_GRADE: case FEATURE_COMPLETION_TRACKS_VIEWS: case FEATURE_COMPLETION_HAS_RULES: return true; default: return null; } }
3. 完善mod_form.php的规则配置
在活动表单中添加自定义规则的启用选项,并确保completion_rule_enabled方法正确判断:
表单定义(definition方法内)
// 添加自定义规则复选框 $mform->addElement('advcheckbox', 'completiontest_enabled', get_string('completiontest', 'mod_cwr'), '', null, [0, 1]); $mform->setDefault('completiontest_enabled', 0); // 仅当自动完成开启时才显示该选项 $mform->disabledIf('completiontest_enabled', 'completion', 'neq', COMPLETION_TRACKING_AUTOMATIC);
completion_rule_enabled方法
function mod_cwr_completion_rule_enabled($data) { // 返回规则是否启用的判断 return !empty($data->completiontest_enabled); }
4. 添加语言字符串
在插件的语言文件(如mod/cwr/lang/en/mod_cwr.php)中添加规则相关的文字:
$string['completiontest'] = '完成测试规则'; $string['completiontest_description'] = 'testout';
(注:get_custom_rule_descriptions中的描述可以直接调用语言字符串,更符合Moodle规范)
5. 启用活动实例的自定义规则
创建/编辑活动实例时,必须:
- 在完成追踪选项中选择「自动完成」
- 勾选你定义的「完成测试规则」选项
- 保存活动设置
只有当规则被实例启用后,Moodle才会调用get_state()、get_custom_rule_descriptions()等方法,这和forum插件的逻辑一致——系统只会处理实例中激活的规则。
6. 彻底清理缓存
执行以下操作确保缓存完全刷新:
- 后台→站点管理→开发→清理缓存,勾选所有缓存类型并执行
- 手动删除
moodledata/cache目录下的所有文件(可选)
关于view.php的优化
不需要手动调用$completion->update_state(),Moodle会自动根据规则计算完成状态。保留以下代码即可:
$completion = new completion_info($course); $completion->set_module_viewed($coursemodule); $completiondetails = \core_completion\cm_completion_details::get_instance($coursemodule, $USER->id); $activitydates = \core\activity_dates::get_dates_for_module($coursemodule, $USER->id); echo $OUTPUT->activity_information($coursemodule, $completiondetails, $activitydates);
内容的提问来源于stack exchange,提问作者Aro
相关产品推荐
相关产品推荐

