用户登录到服务器,用户在课程上下文中的当前角色是编辑教师。我想把角色改成学生。并在课程上下文中测试用户是否存在尝试能力?
要为给定的上下文更改用户对学生的角色,我会手动将role_assignment表的角色列从edittingteacher角色更新为student。直接做出的更改没有效果,除非用户退出并再次进入。
为了测试用户的能力,我使用$ USER全局变量。 即使手动将用户的角色更改为学生$ USER也不会更新。只有在用户退出并再次进入后,$ USER才会显示更改。
我认为问题与浏览器缓存,会话有关。 我如何在更改角色后直接更新$ USER。
用于更改用户角色的代码。
$ index = $ context-> depth-1; $ array = explode(" /",$ context-> path);
$ context_id = $ array [$ index];
//登录用户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);
答案 0 :(得分:1)
我认为你想要的代码看起来有点像这样:
$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就可以了。
硬编码角色不是一个好主意,5是大多数干净安装中的学生角色,但查找起来更可靠。
使用正确的Moodle函数来分配/取消分配角色比手动搞乱数据库条目要可靠得多(如果需要,您可以查看lib / accesslib.php并查看这些函数内部正在执行的操作)