Howto moodle (1.8.2) folgende Rollen temporär einnehmen auch als Instruktor _____________________________________________ Problem: Per Standard kann eine Rolle dann keine temp. Rollen-Umschaltungen vornehmen, wenn die Zuweisung von Rollen verboten ist. Grund: moodle hält sich bei der Bestimmung dieser Fähigkeit an die "Assign"-Matrix (Admin-Menu: Users/Perm./Define Roles/Allow Role Assignm.) Wunsch: das temp. Umschalten soll möglich sein min. für Instruktoren zu Student, ohne jedoch die Zuweisung als solche zu erlauben Lösung: Zwei neue Funktionen in "lib/accesslib.php", diese erlauben das temp. Umschalten und zeigen das Menü Zwei angepasste Funtionen in "lib/weblib.php" und "lib/accesslib.php", welche obige aufrufen Das Fehlerpotential ist gering, da Funktionen lediglich in Kopie leicht verändert und Assignments nicht geändert werden. Die Assignment-Matrix wird nun doppelt genutzt; einerseits wie bisher für Zuweisung, neu auch für temp. Umschalten! Voraussetzung ist noch, daß in der Assignment-Matrix ein Haken Instruktor->Student gesetzt wird; das globale Recht zum Zuweisen bleibt unberührt (aus). Details: weblib.php: func. switchroles_form (geändert) statt: Aufruf von "get_assignable_roles" nun "get_switchable_roles" accesslib.php: func. role_switch (geändert) statt: Aufruf von "get_assignable_roles" nun "get_switchable_roles" func. get_switchable_roles (neu) function get_switchable_roles ($context, $field="name") { $options = array(); if ($roles = get_all_roles()) { foreach ($roles as $role) { if (user_can_switch($context, $role->id)) { $options[$role->id] = strip_tags(format_string($role->{$field}, true)); } } } return $options; } func. user_can_switch (neu) function user_can_switch($context, $targetroleid) { // first check if user has switch capability // if not return false; if (!has_capability('moodle/role:switchroles', $context)) { return false; } // pull out all active roles of this user from this context(or above) // "assign"-matrix is cross-used here! if ($userroles = get_user_roles($context)) { foreach ($userroles as $userrole) { // if any in the role_allow_override table, then it's ok if (get_record('role_allow_assign', 'roleid', $userrole->roleid, 'allowassign', $targetroleid)) { return true; } } } return false; } Installation: lib/accesslib.php und lib/weblib.php überschreiben/patchen, Haken in Assign-Matrix setzen