<?php //$Id$
switch ($action) {
- case 'add': $submitlabel = get_string('addrole', 'role'); break;
+ case 'add':
+ $submitlabel = get_string('addrole', 'role');
+ break;
+ case 'view':
+ $submitlabel = get_string('listallroles', 'role');
+ break;
case 'edit':
- default: $submitlabel = get_string('savechanges');
+ default:
+ $submitlabel = get_string('savechanges');
}
?>
+<table cellpadding="9" cellspacing="0" >
+
+<?php
+ if ($action == 'view') { ?>
+ <tr valign="top">
+ <td align="right"><?php print_string('selectrole', 'role') ?>:</td>
+ <td><table><tr>
+ <td><form name="switchrole" action="manage.php" method="get">
+ <input type="hidden" name="action" value="view" />
+ <?php choose_from_menu ($roleoptions, 'roleid', $roleid, get_string('listallroles', 'role').'...', $script='switchrole.submit()') ?>
+ </form></td>
+ <td><form name="editrole" action="manage.php" method="get">
+ <input type="hidden" name="roleid" value="<?php p($roleid) ?>" />
+ <input type="hidden" name="action" value="edit" />
+ <input type="submit" value="<?php print_string('edit') ?>" />
+ </form></td>
+ </tr></table>
+ </td>
+ </tr>
+<?php
+ }
+?>
+
<form name="rolesform" action="manage.php" method="post">
<input type="hidden" name="roleid" value="<?php p($roleid) ?>" />
<input type="hidden" name="sesskey" value="<?php p(sesskey()) ?>" />
-<input type="hidden" name="action" value="<?php p($action) ?>" />
-<input type="hidden" name="contextid" value="<?php p($contextid) ?>" />
+<input type="hidden" name="action" value="<?php if ($action != 'view') { echo p($action); } ?>" />
+
+<tr valign="top">
+ <td align="right"><?php print_string('name') ?>:</td>
+ <td><?php
+ if ($action == 'view') {
+ p($role->name);
+ } else {
+ echo '<input type="text" name="name" maxlength="254" size="50" value="'.s($role->name).'" />';
+ if (isset($errors["name"])) formerr($errors["name"]);
+ } ?></td>
+</tr>
+<tr valign="top">
+ <td align="right"><?php print_string('shortname') ?>:</td>
+ <td><?php
+ if ($action == 'view') {
+ p($role->shortname);
+ } else {
+ echo '<input type="text" name="shortname" maxlength="20" size="15" value="'.s($role->shortname).'" />';
+ if (isset($errors["shortname"])) formerr($errors["shortname"]);
+ } ?></td>
+</tr>
+<tr valign="top">
+ <td align="right"><?php print_string('description') ?>:</td>
+ <td><?php
+ if ($action == 'view') {
+ p($role->description);
+ $usehtmleditor = false;
+ } else {
+ print_textarea($usehtmleditor, 10, 50, 50, 10, 'description', $role->description);
+ } ?></td>
+</tr>
+
+<tr valign="top">
+ <td align="right"><?php print_string('permissions','role') ?> :</td>
+ <td><table>
-<br />
-<?php print_string('rolename', 'role'); ?>: <input type="text" name="name" value="<?php p($role->name) ?>" />
-<?php print_string('roleshortname', 'role'); ?>: <input type="text" name="shortname" value="<?php p($role->shortname) ?>" />
-<br />
-<?php print_string('roledescription', 'role'); ?>:
-<?php print_textarea($usehtmleditor, 10, 50, 50, 10, 'description', $role->description); ?>
-<p>
-<table>
<tr>
<td><?php print_string('capability','role') ?></td>
<td><?php print_string('inherit','role') ?></td>
$contextlevel = $capability->contextlevel;
$component = $capability->component;
- // check the capability override for this cap, this role in this context
- $sitecontext = get_context_instance(CONTEXT_SYSTEM, SITEID);
-
- $localoverride = get_local_override($roleid, $sitecontext->id, $capability->name);
+ if (empty($errors)) {
+ // check the capability override for this cap, this role in this context
+ $sitecontext = get_context_instance(CONTEXT_SYSTEM, SITEID);
+ $localoverride = get_local_override($roleid, $sitecontext->id, $capability->name);
+ } else {
+ $localoverride = new object();
+ $localoverride->permission = $role->{$capability->name};
+ }
?>
<tr>
<td><span title="<?php echo $capability->name ?>"><?php echo get_capability_string($capability->name); ?></span></td>
- <td><input TYPE="radio" name="<?php echo $capability->name; ?>" value="0" <?php if (!isset($localoverride->permission) || $localoverride->permission==0){ echo 'checked="checked"'; }?> /></td>
- <td><input TYPE="radio" name="<?php echo $capability->name; ?>" value="1" <?php if (isset($localoverride->permission) && $localoverride->permission==1){ echo 'checked="checked"'; }?> /></td>
- <td ><input TYPE="radio" name="<?php echo $capability->name; ?>" value="-1" <?php if (isset($localoverride->permission) && $localoverride->permission==-1){ echo 'checked="checked"'; }?> /></td>
- <td ><input TYPE="radio" name="<?php echo $capability->name; ?>" value="-1000" <?php if (isset($localoverride->permission) && $localoverride->permission==-1000){ echo 'checked="checked"'; }?> /></td>
+ <td><input type="radio" name="<?php echo $capability->name; ?>" value="<?php echo CAP_INHERIT ?>" <?php if (!isset($localoverride->permission) || $localoverride->permission==CAP_INHERIT){ echo 'checked="checked"'; }?> /></td>
+ <td><input type="radio" name="<?php echo $capability->name; ?>" value="<?php echo CAP_ALLOW ?>" <?php if (isset($localoverride->permission) && $localoverride->permission==CAP_ALLOW){ echo 'checked="checked"'; }?> /></td>
+ <td ><input type="radio" name="<?php echo $capability->name; ?>" value="<?php echo CAP_PREVENT ?>" <?php if (isset($localoverride->permission) && $localoverride->permission==CAP_PREVENT){ echo 'checked="checked"'; }?> /></td>
+ <td ><input type="radio" name="<?php echo $capability->name; ?>" value="<?php echo CAP_PROHIBIT ?>" <?php if (isset($localoverride->permission) && $localoverride->permission==CAP_PROHIBIT){ echo 'checked="checked"'; }?> /></td>
<td><?php
if (RISK_MANAGETRUST & (int)$capability->riskbitmask) {
echo "T";
</tr>
<?php } ?>
-</table>
-</p>
-<br />
-<input type="submit" value="<?php p($submitlabel); ?>" />
-</form>
+</table></td></tr>
+
+<tr>
+ <td />
+ <td><input type="submit" value="<?php p($submitlabel) ?>" />
+<?php if ($action != 'view') { ?>
+<input type="submit" name="cancel" value="<?php print_string('cancel') ?>" />
+<?php } ?>
+ </form>
+ </td>
+</tr>
+</table>
\ No newline at end of file
$roleid = optional_param('roleid', 0, PARAM_INT); // if set, we are editing a role
$name = optional_param('name', '', PARAM_MULTILANG); // new role name
- $shortname = optional_param('shortname', '', PARAM_SAFEDIR); // new role shortname
+ $shortname = optional_param('shortname', '', PARAM_RAW); // new role shortname, special cleaning before storage
$description = optional_param('description', '', PARAM_CLEAN); // new role desc
$action = optional_param('action', '', PARAM_ALPHA);
$confirm = optional_param('confirm', 0, PARAM_BOOL);
+ $cancel = optional_param('cancel', 0, PARAM_BOOL);
$sitecontext = get_context_instance(CONTEXT_SYSTEM, SITEID);
- $strmanageroles = get_string('manageroles');
- $strdelete = get_string('delete');
-
- if ($roleid && $action!='delete') {
- $role = get_record('role', 'id', $roleid);
- $editingstr = '-> '.get_string('editinga', '', $role->name);
- } else {
- $editingstr ='';
+ if ($cancel) {
+ redirect('manage.php');
}
- admin_externalpage_print_header($adminroot);
+ $errors = array();
+ $newrole = false;
- $currenttab = 'manage';
- include_once('managetabs.php');
+ $roles = get_records('role', '', '', 'sortorder ASC, id ASC');
+ $rolescount = count($roles);
+
+/// fix sort order if needed
+ $rolesort = array();
+ $i = 0;
+ foreach ($roles as $rolex) {
+ $rolesort[] = $rolex->id;
+ if ($rolex->sortorder != $i) {
+ $r = new object();
+ $r->id = $rolex->id;
+ $r->sortorder = $i;
+ update_record('role', $r);
+ $roles[$rolex->id]->sortorder = $i;
+ }
+ $i++;
+ }
- // form processing, editing a role, adding a role or deleting a role
- if ($action && confirm_sesskey()) {
- switch ($action) {
- case 'add':
+/// form processing, editing a role, adding a role, deleting a role etc.
+ switch ($action) {
+ case 'add':
+ if ($data = data_submitted() and confirm_sesskey()) {
+
+ $shortname = moodle_strtolower(clean_param(clean_filename($shortname), PARAM_SAFEDIR)); // only lowercase safe ASCII characters
- $newrole = create_role($name, $shortname, $description);
+ if (empty($name)) {
+ $errors['name'] = get_string('errorbadrolename', 'role');
+ } else if (count_records('role', 'name', $name)) {
+ $errors['name'] = get_string('errorexistsrolename', 'role');
+ }
- $ignore = array('roleid', 'sesskey', 'action', 'name', 'description', 'contextid');
+ if (empty($shortname)) {
+ $errors['shortname'] = get_string('errorbadroleshortname', 'role');
+ } else if (count_records('role', 'shortname', $shortname)) {
+ $errors['shortname'] = get_string('errorexistsroleshortname', 'role');
+ }
- $data = data_submitted();
+ if (empty($errors)) {
+ $newrole = create_role($name, $shortname, $description, '', $rolescount);
+ } else {
+ $newrole = new object();
+ $newrole->name = $name;
+ $newrole->shortname = $shortname;
+ $newrole->description = $description;
+ }
+ $allowed_values = array(CAP_INHERIT, CAP_ALLOW, CAP_PREVENT, CAP_PROHIBIT);
foreach ($data as $capname => $value) {
- if (in_array($capname, $ignore)) {
+ if (!preg_match('|^[a-z_]+/[a-z_]+:[a-z_]+$|', $capname)) {
+ continue;
+ }
+ $value = (int)$value;
+ if (!in_array($value, $allowed_values)) {
continue;
}
- assign_capability($capname, $value, $newrole, $sitecontext->id);
-
+ if (empty($errors)) {
+ assign_capability($capname, $value, $newrole, $sitecontext->id);
+ } else {
+ $newrole->$capname = $value;
+ }
+ }
+ if (empty($errors)) {
+ redirect('manage.php');
}
+ }
+ break;
- break;
+ case 'edit':
+ if ($data = data_submitted() and confirm_sesskey()) {
- case 'edit':
+ $shortname = moodle_strtolower(clean_param(clean_filename($shortname), PARAM_SAFEDIR)); // only lowercase safe ASCII characters
- $ignore = array('roleid', 'sesskey', 'action', 'name', 'description', 'contextid');
+ if (empty($name)) {
+ $errors['name'] = get_string('errorbadrolename', 'role');
+ } else {
+ if ($rs = get_records('role', 'name', $name)) {
+ unset($rs[$roleid]);
+ if (!empty($rs)) {
+ $errors['name'] = get_string('errorexistsrolename', 'role');
+ }
+ }
+ }
- $data = data_submitted();
+ if (empty($shortname)) {
+ $errors['shortname'] = get_string('errorbadroleshortname', 'role');
+ } else {
+ if ($rs = get_records('role', 'shortname', $shortname)) {
+ unset($rs[$roleid]);
+ if (!empty($rs)) {
+ $errors['shortname'] = get_string('errorexistsroleshortname', 'role');
+ }
+ }
+ }
+ if (!empty($errors)) {
+ $newrole = new object();
+ $newrole->name = $name;
+ $newrole->shortname = $shortname;
+ $newrole->description = $description;
+ }
+
+ $allowed_values = array(CAP_INHERIT, CAP_ALLOW, CAP_PREVENT, CAP_PROHIBIT);
foreach ($data as $capname => $value) {
- if (in_array($capname, $ignore)) {
+ if (!preg_match('|^[a-z_]+/[a-z_]+:[a-z_]+$|', $capname)) {
+ continue;
+ }
+ $value = (int)$value;
+ if (!in_array($value, $allowed_values)) {
+ continue;
+ }
+
+ if (!empty($errors)) {
+ $newrole->$capname = $value;
continue;
}
// edit default caps
- $SQL = "select * from {$CFG->prefix}role_capabilities where
- roleid = $roleid and capability = '$capname' and contextid = $sitecontext->id";
+ $SQL = "SELECT * FROM {$CFG->prefix}role_capabilities
+ WHERE roleid = $roleid AND capability = '$capname'
+ AND contextid = $sitecontext->id";
$localoverride = get_record_sql($SQL);
// update normal role settings
- $role->id = $roleid;
- $role->name = $name;
- $role->description = $description;
+ if (empty($errors)) {
+ $role->id = $roleid;
+ $role->name = $name;
+ $role->description = $description;
- if (!update_record('role', $role)) {
- error('Could not update role!');
+ if (!update_record('role', $role)) {
+ error('Could not update role!');
+ }
+ redirect('manage.php');
}
+ }
+ break;
- break;
+ case 'delete':
+ if ($confirm and data_submitted() and confirm_sesskey()) {
- case 'delete':
- if ($confirm) { // deletes a role
+ // first unssign all users
+ if (!role_unassign($roleid)) {
+ error("Error while unassigning all users from role with ID $roleid!");
+ }
- // check for depedencies XXX TODO
+ if (!delete_records('role', 'id', $roleid)) {
+ error("Could not delete role with ID $roleid!");
+ }
- // delete all associated role-assignments? XXX TODO
+ } else if (confirm_sesskey()){
+ // show confirmation
+ admin_externalpage_print_header($adminroot);
+ $optionsyes = new object();
+ $optionsyes->action = 'delete';
+ $optionsyes->roleid = $roleid;
+ $optionsyes->sesskey = sesskey();
+ $optionsyes->confirm = 1;
+ $a = new object();
+ $a->id = $roleid;
+ $a->name = $roles[$roleid]->name;
+ $a->shortname = $roles[$roleid]->shortname;
+ $a->count = (int)count_records('role_assignments', 'roleid', $roleid);
+ notice_yesno(get_string('deleterolesure', 'role', $a), 'manage.php', 'manage.php', $optionsyes, NULL, 'post', 'get');
+ admin_externalpage_print_footer($adminroot);
+ die;
+ }
+
+ redirect('manage.php');
+ break;
+
+ case 'moveup':
+ if (array_key_exists($roleid, $roles) and confirm_sesskey()) {
+ $role = $roles[$roleid];
+ if ($role->sortorder > 0) {
+ $above = $roles[$rolesort[$role->sortorder - 1]];
+ $r = new object();
+
+ $r->id = $role->id;
+ $r->sortorder = $above->sortorder;
+ if (!update_record('role', $r)) {
+ $errors[] = "Can not update role with ID $r->id!";
+ }
- if (!delete_records('role', 'id', $roleid)) {
- error('Could not delete role!');
+ $r->id = $above->id;
+ $r->sortorder = $role->sortorder;
+ if (!update_record('role', $r)) {
+ $errors[] = "Can not update role with ID $r->id!";
}
- } else {
- echo ('<form action="manage.php" method="POST">');
- echo ('<input type="hidden" name="action" value="delete">');
- echo ('<input type="hidden" name="roleid" value="'.$roleid.'">');
- echo ('<input type="hidden" name="sesskey" value="'.sesskey().'">');
- echo ('<input type="hidden" name="confirm" value="1">');
- notice_yesno(get_string('deleterolesure', 'role'),
- 'manage.php?action=delete&roleid='.$roleid.'&sesskey='.sesskey().'&confirm=1', 'manage.php');
- admin_externalpage_print_footer($adminroot);
- exit;
+ if (count($errors)) {
+ $msg = '<p>';
+ foreach ($errors as $e) {
+ $msg .= $e.'<br />';
+ }
+ admin_externalpage_print_header($adminroot);
+ notify($msg);
+ print_continue('manage.php');
+ admin_externalpage_print_footer($adminroot);
+ die;
+ }
}
+ }
+
+ redirect('manage.php');
+ break;
+
+ case 'movedown':
+ if (array_key_exists($roleid, $roles) and confirm_sesskey()) {
+ $role = $roles[$roleid];
+ if ($role->sortorder + 1 < $rolescount) {
+ $bellow = $roles[$rolesort[$role->sortorder + 1]];
+ $r = new object();
+
+ $r->id = $role->id;
+ $r->sortorder = $bellow->sortorder;
+ if (!update_record('role', $r)) {
+ $errors[] = "Can not update role with ID $r->id!";
+ }
- break;
+ $r->id = $bellow->id;
+ $r->sortorder = $role->sortorder;
+ if (!update_record('role', $r)) {
+ $errors[] = "Can not update role with ID $r->id!";
+ }
- /// add possible positioning switch here
+ if (count($errors)) {
+ $msg = '<p>';
+ foreach ($errors as $e) {
+ $msg .= $e.'<br />';
+ }
+ $msg .= '</p>';
+ admin_externalpage_print_header($adminroot);
+ notify($msg);
+ print_continue('manage.php');
+ admin_externalpage_print_footer($adminroot);
+ die;
+ }
+ }
+ }
- default:
- break;
+ redirect('manage.php');
+ break;
- }
+ default:
+ break;
}
- $roles = get_records('role', '', '', 'sortorder ASC, id ASC');
+/// print UI now
+
+ admin_externalpage_print_header($adminroot);
- if (($roleid && $action!='delete') || $action=='new') { // load the role if id is present
+ $currenttab = 'manage';
+ include_once('managetabs.php');
- if ($roleid) {
- $action='edit';
- $role = get_record('role', 'id', $roleid);
+ if (($roleid and ($action == 'view' or $action == 'edit')) or $action == 'add') { // view or edit role details
+
+ if ($action == 'add') {
+ $roleid = 0;
+ if (empty($errors) or empty($newrole)) {
+ $role = new object();
+ $role->name='';
+ $role->shortname='';
+ $role->description='';
+ } else {
+ $role = stripslashes_safe($newrole);
+ }
+ } else if ($action == 'edit' and !empty($errors) and !empty($newrole)) {
+ $role = stripslashes_safe($newrole);
} else {
- $action='add';
- $role->name='';
- $role->shortname='';
- $role->description='';
+ if(!$role = get_record('role', 'id', $roleid)) {
+ error('Incorrect role ID!');
+ }
}
foreach ($roles as $rolex) {
$roleoptions[$rolex->id] = format_string($rolex->name);
}
- // prints a form to swap roles
- print ('<form name="rolesform1" action="manage.php" method="post">');
- print ('<div align="center">'.get_string('selectrole', 'role').': ');
- choose_from_menu ($roleoptions, 'roleid', $roleid, get_string('listallroles', 'role'), $script='rolesform1.submit()');
- print ('</div></form>');
-
// this is the array holding capabilities of this role sorted till this context
$r_caps = role_context_capabilities($roleid, $sitecontext);
$capabilities = fetch_context_capabilities($sitecontext);
$usehtmleditor = can_use_html_editor();
- print_simple_box_start();
+
+ switch ($action) {
+ case 'add':
+ print_heading(get_string('addrole', 'role'));
+ break;
+ case 'view':
+ print_heading(get_string('viewrole', 'role'));
+ break;
+ case 'edit':
+ print_heading(get_string('editrole', 'role'));
+ break;
+ }
+ print_simple_box_start('center');
include_once('manage.html');
print_simple_box_end();
$table = new object;
$table->tablealign = 'center';
- $table->align = array('right', 'left', 'left');
+ $table->align = array('right', 'left', 'middle');
$table->wrap = array('nowrap', '', 'nowrap');
$table->cellpadding = 5;
$table->cellspacing = 0;
$table->width = '90%';
+ $table->data = array();
- $table->head = array(get_string('roles', 'role'),
+ $table->head = array(get_string('name'),
get_string('description'),
- get_string('delete'));
+ get_string('shortname'),
+ get_string('edit'));
/*************************
* List all current roles *
foreach ($roles as $role) {
- $table->data[] = array('<a href="manage.php?roleid='.$role->id.'&sesskey='.sesskey().'">'.format_string($role->name).'</a>', format_text($role->description, FORMAT_HTML), '<a href="manage.php?action=delete&roleid='.$role->id.'&sesskey='.sesskey().'">'.$strdelete.'</a>');
+ $stredit = get_string('edit');
+ $strdelete = get_string('delete');
+ $strmoveup = get_string('moveup');
+ $strmovedown = get_string('movedown');
+
+ $row = array();
+ $row[0] = '<a href="manage.php?roleid='.$role->id.'&action=view">'.format_string($role->name).'</a>';
+ $row[1] = format_text($role->description, FORMAT_HTML);
+ $row[2] = s($role->shortname);
+ $row[3] = '<a title="'.$stredit.'" href="manage.php?action=edit&roleid='.$role->id.'">'.
+ '<img src="'.$CFG->pixpath.'/t/edit.gif" height="11" width="11" border="0" alt="'.$stredit.'" /></a> ';
+ $row[3] .= '<a title="'.$strdelete.'" href="manage.php?action=delete&roleid='.$role->id.'&sesskey='.sesskey().'">'.
+ '<img src="'.$CFG->pixpath.'/t/delete.gif" height="11" width="11" border="0" alt="'.$strdelete.'" /></a> ';
+ if ($role->sortorder != 0) {
+ $row[3] .= '<a title="'.$strmoveup.'" href="manage.php?action=moveup&roleid='.$role->id.'&sesskey='.sesskey().'">'.
+ '<img src="'.$CFG->pixpath.'/t/up.gif" height="11" width="11" border="0" alt="'.$strmoveup.'" /></a> ';
+ } else {
+ $row[3] .= '<img src="'.$CFG->wwwroot.'/pix/spacer.gif" height="11" width="11" border="0" alt="" /> ';
+ }
+ if ($role->sortorder+1 < $rolescount) {
+ $row[3] .= '<a title="'.$strmovedown.'" href="manage.php?action=movedown&roleid='.$role->id.'&sesskey='.sesskey().'">'.
+ '<img src="'.$CFG->pixpath.'/t/down.gif" height="11" width="11" border="0" alt="'.$strmovedown.'" /></a> ';
+ } else {
+ $row[3] .= '<img src="'.$CFG->wwwroot.'/pix/spacer.gif" height="11" width="11" border="0" alt="" /> ';
+ }
+
+ $table->data[] = $row;
}
print_table($table);
- $options = new object;
- $options->sesskey = sesskey();
- $options->action = 'new';
- print_single_button('manage.php', $options, get_string('addrole', 'role'), 'POST');
+ $options = new object();
+ $options->action = 'add';
+ print_single_button('manage.php', $options, get_string('addrole', 'role'), 'get');
}
admin_externalpage_print_footer($adminroot);