Moodle,如何在通过数据库更新用户角色后更新$USER内容

Moodle, how to update $USER content after updating user role through data base

用户登录服务器,当前用户在课程上下文中的角色是编辑教师。我想将角色更改为学生,并在课程上下文中测试用户是否存在尝试能力?

为了在给定上下文中将用户角色更改为学生,我手动将 role_assignment table 的角色列从编辑教师角色更新为学生。除非用户注销并重新登录,否则直接完成的更改不会生效。

为了测试用户的能力,我使用了 $USER 全局变量。

即使手动将用户角色更改为学生 $USER 也不会更新:$USER 仅在用户注销并再次登录后才会显示更改。

我认为问题与浏览器缓存、会话有关。 如何在更改角色后立即更新 $USER?

用于更改用户角色的代码:

$index = $context->depth-1;
$array = explode("/",$context->path);
$context_id = $array[$index];

// get logged in user id
$userId = $USER->id;

$user = $DB->get_record('role_assignments', array('contextid'=>$array[$index], 'userid'=> $userId));

$user->roleid = 5;
$roles = get_user_roles($context, $userId);
$user->timemodified = time();
$DB->update_record('role_assignments', $user, $bulk=false);

我认为您想要的代码看起来更像这样:

$coursecontext = $context->get_course_context();
$teacherroleid = $DB->get_field('role', 'id', ['shortname' => 'editingteacher']);
$studentroleid = $DB->get_field('role', 'id', ['shortname' => 'student']);
role_assign($studentroleid, $USER->id, $coursecontext->id);
role_unassign($teacherroleid, $USER->id, $coursecontext->id);

我不太确定您通过分解上下文路径试图做什么,所以我假设您正在尝试获取课程上下文(我在上面已经完成了)。如果你只是想要当前上下文的 id,那么 $context->id 就可以了。

硬编码 roleid 不是一个好主意,5 是大多数全新安装中的学生角色,但查找它更可靠。

对 assign/unassign 角色使用适当的 Moodle 函数比手动修改数据库条目要可靠得多(如果你愿意,你可以看看 lib/accesslib.php并准确了解这些功能在内部执行的操作)。