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

时间:2016-11-07 19:44:02

标签: moodle

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

要为给定的上下文更改用户对学生的角色,我会手动将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);

1 个答案:

答案 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并查看这些函数内部正在执行的操作)