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

开发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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 13:09:30