/** * Process the role comparision. * @throws Commmand_Exception. */ private function _process() { global $CFG, $DB, $OUTPUT; // Checking if command has been runned. if (!$this->isRunned()) { throw new Command_Exception('commandnotrun'); } // Getting table name. $table = $this->getParameter('table')->getValue(); // Getting hosts. $hosts = array_keys($this->capabilities); $host_labels = get_available_platforms(); // Getting local roles. $roles = $DB->get_records('role', null, '', 'sortorder'); /* * processing results */ // Creating header. $this->report = '<h3>' . get_string('allowcompare', 'vmoodleadminset_roles', vmoodle_get_string($table . 'table', 'vmoodleadminset_roles')) . help_button_vml('rolelib', 'allowcompare', 'vmoodleadminset_roles') . '</h3>'; // Adding edit role link $this->report .= '<center><p>' . $OUTPUT->single_button(new moodle_url($CFG->wwwroot . '/admin/roles/allow.php?mode=' . $table, array('roleid' => $role->id, 'action' => 'edit')), vmoodle_get_string('editallowtable', 'vmoodleadminset_roles'), 'get') . '</p></center>'; // Creation form. $this->report .= '<form action="' . $CFG->wwwroot . '/local/vmoodle/plugins/roles/controller.rolelib.sadmin.php?what=syncallow" method="post" onsubmit="return validate_syncrole()">'; $this->report .= '<input id="target" type="hidden" name="target" value=""/>'; $this->report .= '<input id="role" type="hidden" name="role" value=""/>'; $this->report .= '<input id="source_platform" type="hidden" name="source_platform" value=""/>'; // Creating table. $this->report .= '<table id="allowcompare" cellspacing="1" cellpadding="5" class="generaltable boxaligncenter" style="min-width: 75%;"><tbody>'; // Creating header. $this->report .= '<tr><th scope="col" class="header c0" style="vertical-align: bottom; text-align: left;"> </th>'; $col = 1; foreach ($hosts as $host) { $this->report .= '<th id="cap_' . $col . '" scope="col" class="header c' . $col . '" style="vertical-align: bottom; text-align: center;"><label for="platform_' . $col . '"><img src="' . $CFG->wwwroot . '/local/vmoodle/plugins/roles/draw_platformname.php?caption=' . urlencode($host_labels[$host]) . '" alt="' . $host_labels[$host] . '"/></label><br/><input id="platform_' . $col . '" type="checkbox" name="platforms[]" value="' . $host . '" disabled="disabled"/></th>'; $col++; } $this->report .= '</tr>'; // Initializing variables. $row = 0; // Creating table data. foreach ($allroles as $rolename => $role) { $localrole = $DB->get_field('role', 'name', array('shortname' => $rolename)); $displayrole = $localrole ? $localrole : '--' . $rolename . '--'; $this->report .= "<tr valign='top'>{$displayrole}</td>"; $row++; } // Closing table. $this->report .= '</tboby></table><br/>'; $this->report .= '<center><input type="submit" value="' . vmoodle_get_string('synchronize', 'vmoodleadminset_roles') . '"/><div id="allowcompare_validation_message"></div></center></form><br/><br/>'; }
/** * Process the role comparison. * @throws Commmand_Exception. */ private function _process() { global $CFG, $DB, $OUTPUT; // Checking if command has been runned. if (!$this->isRunned()) { throw new Command_Exception('commandnotrun'); } // Defining capabilities values. $cap_permissions = array(CAP_ALLOW => array('count' => 0, 'label' => 1, 'name' => 'allow'), CAP_PREVENT => array('count' => 0, 'label' => 2, 'name' => 'prevent'), CAP_PROHIBIT => array('count' => 0, 'label' => 3, 'name' => 'prohibit')); // Defining capabilities context. $cap_contexts = array(CONTEXT_BLOCK => array('count' => 0, 'label' => 'B', 'name' => 'block'), CONTEXT_COURSE => array('count' => 0, 'label' => 'C', 'name' => 'course'), CONTEXT_COURSECAT => array('count' => 0, 'label' => 'CC', 'name' => 'coursecat'), CONTEXT_MODULE => array('count' => 0, 'label' => 'M', 'name' => 'module'), CONTEXT_SYSTEM => array('count' => 0, 'label' => 'S', 'name' => 'system'), CONTEXT_USER => array('count' => 0, 'label' => 'U', 'name' => 'user')); // Getting role name. $role = $this->getParameter('role')->getValue(); $role = $DB->get_record('role', array('shortname' => $role)); // Getting hosts. $hosts = array_keys($this->capabilities); $host_labels = get_available_platforms(); // Getting capabilities. $records_capabilities = $DB->get_records('capabilities', null, '', 'name,contextlevel,component'); // Getting lang. $lang = str_replace('_utf8', '', current_language()); $strcapabilities = s(get_string('capabilities', 'role')); // 'Capabilities' MDL-11687 // Getting all capabilities names. $capability_names = array(); foreach ($this->capabilities as $platform_capabilities) { $platform_capabilities = array_keys((array) $platform_capabilities); $capability_names = array_merge($capability_names, $platform_capabilities); } $capability_names = array_unique($capability_names); // Getting problematic component name $problematic_component_name = get_string('problematiccomponent', 'vmoodleadminset_roles'); // Creating normalized capabilities. $capabilities = array(); foreach ($capability_names as $capability_name) { // Creating capability. $capability = new \StdClass(); $capability->name = $capability_name; // Initializing counters. $cap_permissions[CAP_ALLOW]['count'] = $cap_permissions[CAP_PREVENT]['count'] = $cap_permissions[CAP_PROHIBIT]['count'] = 0; $cap_contexts[CONTEXT_BLOCK]['count'] = $cap_contexts[CONTEXT_COURSE]['count'] = $cap_contexts[CONTEXT_COURSECAT]['count'] = $cap_contexts[CONTEXT_MODULE]['count'] = $cap_contexts[CONTEXT_SYSTEM]['count'] = $cap_contexts[CONTEXT_USER]['count'] = 0; // Counting. foreach ($this->capabilities as $platform_capabilities) { if (!property_exists($platform_capabilities, $capability_name) || is_null($platform_capabilities->{$capability_name})) { continue; } $platform_capability = $platform_capabilities->{$capability_name}; $cap_permissions[$platform_capability->permission]['count']++; $cap_contexts[$platform_capability->contextlevel]['count']++; } // Getting major values. $nbr_value_max = max(array_map(array($this, '_getCounterValue'), $cap_permissions)); $nbr_context_max = max(array_map(array($this, '_getCounterValue'), $cap_contexts)); // Setting major permission. foreach ($cap_permissions as $permission => $cap_permission) { if ($cap_permission['count'] == $nbr_value_max) { $capability->major_permission = $permission; break; } } // Setting major contexlevel. foreach ($cap_contexts as $contextlevel => $cap_context) { if ($cap_context['count'] == $nbr_context_max) { $capability->major_contextlevel = $contextlevel; break; } } // Setting component. $capability->component = isset($records_capabilities[$capability_name]) ? $records_capabilities[$capability_name]->component : $problematic_component_name; // Setting capability contextlevel. $capability->contextlevel = isset($records_capabilities[$capability_name]) ? $records_capabilities[$capability_name]->contextlevel : CONTEXT_SYSTEM; // Adding capability. $capabilities[$capability_name] = $capability; } // Sort capabilities on contextlevel, component and name. uasort($capabilities, array($this, '_orderCapability')); /* * Creating html report. */ // Creating header. $this->report = '<h3>' . get_string('comparerole', 'vmoodleadminset_roles', $role->name) . help_button_vml('rolelib', 'rolecompare', 'rolecompare') . '</h3>'; // Adding edit role link. $this->report .= '<center><p>' . $OUTPUT->single_button(new moodle_url('/admin/roles/define.php', array('roleid' => $role->id, 'action' => 'edit')), get_string('editrole', 'vmoodleadminset_roles'), 'get') . '</p></center>'; // Adding a capability client side filter. $this->report .= get_string('capfilter', 'local_vmoodle') . ': ' . '<input type="text" name="capfilter" value="" onchange="filtercapabilitytable(this)" />'; // Creation form. $rolecapsyncurl = new moodle_url('/local/vmoodle/plugins/roles/controller.rolelib.sadmin.php', array('what' => 'syncrole')); $this->report .= '<form action="' . $rolecapsyncurl . '" method="post" onsubmit="return validate_syncrole()">'; $this->report .= '<input id="capability" type="hidden" name="capability" value="" />'; $this->report .= '<input id="source_platform" type="hidden" name="source_platform" value="" />'; // Creating table. $this->report .= '<table id="rolecompare" cellspacing="1" cellpadding="5" class="generaltable boxaligncenter" style="min-width: 75%;"><tbody>'; // Creating header. $this->report .= '<tr><th scope="col" class="header c0" style="vertical-align: bottom; text-align: left;"> </th>'; $col = 1; foreach ($hosts as $host) { $this->report .= '<th id="cap_' . $col . '" scope="col" class="header c' . $col . '" style="vertical-align: bottom; text-align: center;"><label for="platform_' . $col . '"><img src="' . $CFG->wwwroot . '/local/vmoodle/plugins/roles/draw_platformname.php?caption=' . urlencode($host_labels[$host]) . '" alt="' . $host_labels[$host] . '"/></label><br/><input id="platform_' . $col . '" type="checkbox" name="platforms[]" value="' . $host . '" disabled="disabled"/></th>'; $col++; } $this->report .= '</tr>'; // Initializing variables. $row = 0; $contextlevel = 0; $component = ''; $rowtitleids = array(); // Creating table data. foreach ($capabilities as $capability) { $col = 1; $componentlevelchanged = component_level_changed($capability, $component, $contextlevel); // Recording context. $contextlevel = $capability->contextlevel; $component = $capability->component; $rowtitleids[] = $capability->name; $rowcontent = '<tr class="r' . $row % 2 . ' capabilityrow" id="' . $capability->name . '">'; $rowcontent .= '<td id="cap_0_' . $row . '" class="cell c0" style="vertical-align: middle; text-align: left;"><a onclick="this.target=\'docspopup\'" href="' . $CFG->docroot . '/' . $lang . '/' . $strcapabilities . '/' . $capability->name . '">' . get_capability_string($capability->name) . '</a><br/>' . $capability->name . '</td>'; foreach ($hosts as $host) { $extra_class = false; $title = get_capability_string($capability->name) . ' | ' . $host_labels[$host]; if (array_key_exists($host, $this->capabilities) && property_exists($this->capabilities[$host], $capability->name)) { $platform_capability = $this->capabilities[$host]->{$capability->name}; if (is_null($platform_capability)) { $cell = '<img src="' . $CFG->wwwroot . '/local/vmoodle/plugins/roles/pix/norolecapability.png" alt="No role capability" title="' . $title . '" onclick="setCapability(' . $col . ',' . $row . ',\'' . $capability->name . '\',\'' . $host . '\');"/>'; } else { $cell = '<img src="' . $CFG->wwwroot . '/local/vmoodle/plugins/roles/pix/compare' . $cap_permissions[$platform_capability->permission]['label'] . $cap_contexts[$platform_capability->contextlevel]['label'] . '.png" alt="Permission: ' . $cap_permissions[$platform_capability->permission]['name'] . ' | Context: ' . $cap_contexts[$platform_capability->contextlevel]['name'] . '" title="' . $title . '" onclick="setCapability(' . $col . ',' . $row . ',\'' . $capability->name . '\',\'' . $host . '\');"/>'; if ($platform_capability->permission != $capabilities[$platform_capability->capability]->major_permission) { $extra_class = 'wrongvalue'; } elseif ($platform_capability->contextlevel != $capabilities[$platform_capability->capability]->major_contextlevel) { $extra_class = 'wrongcontext'; } } } else { $cell = '<img src="' . $CFG->wwwroot . '/local/vmoodle/plugins/roles/pix/nocapability.png" alt="No capability" title="' . $title . '"/>'; } $rowcontent .= '<td id="cap_' . $col . '_' . $row . '" class="cell c' . $col . ($extra_class ? ' ' . $extra_class : '') . '" style="vertical-align: middle; text-align: center;" onmouseout="cellOut(' . $col . ',' . $row . ');" onmouseover="cellOver(' . $col . ',' . $row . ');">' . $cell . '</td>'; $col++; } // Adding contextual heading. if ($componentlevelchanged) { $rowhead = '<tr class="capabilityrow" id="' . implode(',', $rowtitleids) . '"><td colspan="' . (count($hosts) + 1) . '" class="header"><strong>' . ($capability->component == $problematic_component_name ? $problematic_component_name : get_component_string($capability->component, $capability->contextlevel)) . '</strong></td></tr>'; $rowtitleids = array(); } $this->report .= $rowhead . $rowcontent . '</tr>'; $row++; } // Closing table. $this->report .= '</tboby></table><br/><center><input type="submit" value="' . get_string('synchronize', 'vmoodleadminset_roles') . '"/><div id="rolecompare_validation_message"></div></center></form><br/><br/>'; }