Moodle3.11批量同步Cohort到课程的PHP脚本求助(PHP7.4)
Moodle 3.11 批量关联Cohort到课程的PHP脚本修复
原脚本的核心问题是调用了错误的方法:sync_cohort()仅用于同步已关联课程的Cohort用户,而非建立Cohort与课程的关联。要完成关联操作,需先为课程创建Cohort enrolment实例,再绑定Cohort到该实例。以下是修复后的完整脚本:
<?php define('CLI_SCRIPT', true); require_once('/var/www/moodle/config.php'); require_once($CFG->dirroot . '/lib/clilib.php'); require_once($CFG->dirroot . '/cohort/lib.php'); require_once($CFG->dirroot . '/enrol/cohort/lib.php'); require_once($CFG->dirroot . '/enrol/lib.php'); // 配置参数 $courseId = 205; $cohortId = 167; $roleId = 5; // 默认学生角色ID,可根据需求修改 // 验证课程和Cohort是否存在 $course = get_course($courseId); if (!$course) { cli_error("课程ID {$courseId} 不存在"); } $cohort = cohort_get_cohort($cohortId); if (!$cohort) { cli_error("Cohort ID {$cohortId} 不存在"); } $courseContext = context_course::instance($courseId); // 确保课程启用了Cohort enrol插件 $pluginEnabled = enrol_is_enabled('cohort'); if (!$pluginEnabled) { cli_error("Cohort enrolment插件未全局启用"); } $instanceEnabled = enrol_get_instances($courseId, true)['cohort'] ?? false; if (!$instanceEnabled) { // 创建Cohort enrol实例 $enrolPlugin = enrol_get_plugin('cohort'); $enrolPlugin->add_instance($course, [ 'name' => 'Cohort同步', 'status' => ENROL_INSTANCE_ENABLED, ]); } // 获取课程的Cohort enrol实例 $instances = enrol_get_instances($courseId, true); $cohortInstance = null; foreach ($instances as $instance) { if ($instance->enrol == 'cohort') { $cohortInstance = $instance; break; } } if (!$cohortInstance) { cli_error("无法获取或创建课程的Cohort enrol实例"); } // 关联Cohort到课程的enrol实例 $enrolPlugin = enrol_get_plugin('cohort'); try { $enrolPlugin->add_cohort($cohortInstance, $cohort, $roleId); echo "Cohort ID {$cohortId} 已成功关联到课程 ID {$courseId}\n"; // 可选:立即同步Cohort中的用户到课程 $enrolPlugin->sync_cohort($cohortInstance->id, $cohortId); echo "已同步Cohort用户到课程\n"; } catch (Exception $e) { cli_error("关联失败:" . $e->getMessage()); }
关键说明:
- 参数配置:修改
$courseId、$cohortId和$roleId为实际需要的值(角色ID可在Moodle后台“站点管理→用户→角色”中查看)。 - 实例检查:脚本会自动检查课程是否启用了Cohort enrol插件,未启用则创建实例。
- 关联逻辑:通过
add_cohort()方法将Cohort绑定到课程的enrol实例,这才是建立关联的核心操作。 - 同步用户:如果需要立即将Cohort中的用户同步到课程,保留
sync_cohort()调用即可;若仅需建立关联(后续自动同步),可注释掉该部分。
内容的提问来源于stack exchange,提问作者Albert
相关产品推荐
相关产品推荐

