mirror of
https://github.com/moodle/moodle.git
synced 2025-04-13 20:42:22 +02:00
MDL-10438 return tracking in grading forms; new grade plugin selector
This commit is contained in:
parent
c35075db50
commit
3af29899bf
@ -1,5 +1,6 @@
|
||||
<?php //$Id$
|
||||
require_once '../../config.php';
|
||||
require_once $CFG->dirroot.'/grade/lib.php';
|
||||
require_once $CFG->libdir.'/gradelib.php';
|
||||
require_once 'calculation_form.php';
|
||||
|
||||
@ -16,8 +17,8 @@ $context = get_context_instance(CONTEXT_COURSE, $course->id);
|
||||
//require_capability() here!!
|
||||
|
||||
// default return url
|
||||
//TODO: add proper return support
|
||||
$returnurl = $CFG->wwwroot.'/grade/report.php?report=grader&id='.$course->id;
|
||||
$gpr = new grade_plugin_return();
|
||||
$returnurl = $gpr->get_return_url($CFG->wwwroot.'/grade/report.php?id='.$course->id);
|
||||
|
||||
if (!$grade_item = grade_item::fetch(array('id'=>$id, 'courseid'=>$course->id))) {
|
||||
error('Incorect item id');
|
||||
@ -28,7 +29,7 @@ if ($grade_item->is_normal_item() or ($grade_item->gradetype != GRADE_TYPE_VALUE
|
||||
redirect($returnurl, get_string('erornocalculationallowed', 'grades')); //TODO: localize
|
||||
}
|
||||
|
||||
$mform = new edit_calculation_form();
|
||||
$mform = new edit_calculation_form(null, array('gpr'=>$gpr));
|
||||
|
||||
if ($mform->is_cancelled()) {
|
||||
redirect($returnurl);
|
||||
|
@ -21,6 +21,10 @@ class edit_calculation_form extends moodleform {
|
||||
$mform->addElement('hidden', 'courseid', 0);
|
||||
$mform->setType('courseid', PARAM_INT);
|
||||
|
||||
/// add return tracking info
|
||||
$gpr = $this->_customdata['gpr'];
|
||||
$gpr->add_mform_elements($mform);
|
||||
|
||||
//-------------------------------------------------------------------------------
|
||||
// buttons
|
||||
$this->add_action_buttons();
|
||||
|
@ -1,6 +1,7 @@
|
||||
<?php //$Id$
|
||||
|
||||
require_once '../../config.php';
|
||||
require_once $CFG->dirroot.'/grade/lib.php';
|
||||
require_once $CFG->libdir.'/gradelib.php';
|
||||
require_once 'category_form.php';
|
||||
|
||||
@ -17,10 +18,11 @@ $context = get_context_instance(CONTEXT_COURSE, $course->id);
|
||||
//require_capability() here!!
|
||||
|
||||
// default return url
|
||||
$returnurl = 'tree.php?id='.$course->id;
|
||||
$gpr = new grade_plugin_return();
|
||||
$returnurl = $gpr->get_return_url('tree.php?id='.$course->id);
|
||||
|
||||
|
||||
$mform = new edit_category_form();
|
||||
$mform = new edit_category_form(null, array('gpr'=>$gpr));
|
||||
if ($category = get_record('grade_categories', 'id', $id, 'courseid', $course->id)) {
|
||||
$mform->set_data($category);
|
||||
} else {
|
||||
|
@ -36,6 +36,10 @@ class edit_category_form extends moodleform {
|
||||
$mform->addElement('hidden', 'courseid', 0);
|
||||
$mform->setType('courseid', PARAM_INT);
|
||||
|
||||
/// add return tracking info
|
||||
$gpr = $this->_customdata['gpr'];
|
||||
$gpr->add_mform_elements($mform);
|
||||
|
||||
//-------------------------------------------------------------------------------
|
||||
// buttons
|
||||
$this->add_action_buttons();
|
||||
|
@ -1,6 +1,7 @@
|
||||
<?php //$Id$
|
||||
|
||||
require_once '../../config.php';
|
||||
require_once $CFG->dirroot.'/grade/lib.php';
|
||||
require_once $CFG->libdir.'/gradelib.php';
|
||||
require_once 'grade_form.php';
|
||||
|
||||
@ -18,15 +19,15 @@ $context = get_context_instance(CONTEXT_COURSE, $course->id);
|
||||
require_capability('gradereport/grader:manage', $context);
|
||||
|
||||
// default return url
|
||||
//TODO: implement proper return support
|
||||
$returnurl = $CFG->wwwroot.'/grade/report.php?report=grader&id='.$course->id;
|
||||
$gpr = new grade_plugin_return();
|
||||
$returnurl = $gpr->get_return_url($CFG->wwwroot.'/grade/report.php?id='.$course->id);
|
||||
|
||||
// TODO: add proper check that grade is editable
|
||||
|
||||
$grade_grades = get_record('grade_grades', 'id', $id);
|
||||
$gradeitem = get_record('grade_items', 'id', $grade_grades->itemid);
|
||||
|
||||
$mform = new edit_grade_form(qualified_me(), array('gradeitem'=>$gradeitem));
|
||||
$mform = new edit_grade_form(null, array('gradeitem'=>$gradeitem, 'gpr'=>$gpr));
|
||||
if ($grade_grades = get_record('grade_grades', 'id', $id)) {
|
||||
if ($grade_text = get_record('grade_grades_text', 'gradeid', $id)) {
|
||||
if (can_use_html_editor()) {
|
||||
@ -64,7 +65,7 @@ if ($mform->is_cancelled()) {
|
||||
// set locktime
|
||||
$grade_grades->set_locktime($data->locktime);
|
||||
|
||||
redirect($returnurl, get_string('feedbacksaved', 'grades'), 1);
|
||||
redirect($returnurl);
|
||||
}
|
||||
|
||||
// Get extra data related to this feedback
|
||||
|
@ -54,6 +54,10 @@ class edit_grade_form extends moodleform {
|
||||
$mform->addElement('hidden', 'courseid', 0);
|
||||
$mform->setType('courseid', PARAM_INT);
|
||||
|
||||
/// add return tracking info
|
||||
$gpr = $this->_customdata['gpr'];
|
||||
$gpr->add_mform_elements($mform);
|
||||
|
||||
//-------------------------------------------------------------------------------
|
||||
// buttons
|
||||
$this->add_action_buttons();
|
||||
|
@ -1,5 +1,6 @@
|
||||
<?php //$Id$
|
||||
require_once '../../config.php';
|
||||
require_once $CFG->dirroot.'/grade/lib.php';
|
||||
require_once $CFG->libdir.'/gradelib.php';
|
||||
require_once 'item_form.php';
|
||||
|
||||
@ -16,9 +17,10 @@ $context = get_context_instance(CONTEXT_COURSE, $course->id);
|
||||
//require_capability() here!!
|
||||
|
||||
// default return url
|
||||
$returnurl = 'tree.php?id='.$course->id;
|
||||
$gpr = new grade_plugin_return();
|
||||
$returnurl = $gpr->get_return_url('tree.php?id='.$course->id);
|
||||
|
||||
$mform = new edit_item_form();
|
||||
$mform = new edit_item_form(null, array('gpr'=>$gpr));
|
||||
if ($item = get_record('grade_items', 'id', $id, 'courseid', $course->id)) {
|
||||
$item->calculation = grade_item::denormalize_formula($item->calculation, $course->id);
|
||||
$mform->set_data($item);
|
||||
|
@ -82,6 +82,10 @@ class edit_item_form extends moodleform {
|
||||
$mform->addElement('hidden', 'itemtype', 0);
|
||||
$mform->setType('itemtype', PARAM_ALPHA);
|
||||
|
||||
/// add return tracking info
|
||||
$gpr = $this->_customdata['gpr'];
|
||||
$gpr->add_mform_elements($mform);
|
||||
|
||||
//-------------------------------------------------------------------------------
|
||||
// buttons
|
||||
$this->add_action_buttons();
|
||||
|
@ -25,6 +25,7 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
require_once '../../config.php';
|
||||
require_once $CFG->dirroot.'/grade/lib.php';
|
||||
require_once $CFG->libdir.'/gradelib.php';
|
||||
|
||||
$courseid = required_param('id', PARAM_INT);
|
||||
@ -169,12 +170,11 @@ switch ($action) {
|
||||
|
||||
print_header_simple($strgrades . ': ' . $strgraderreport, ': ' . $strcategoriesedit, $navigation, '', '', true, '', navmenu($course));
|
||||
|
||||
/// Print the plugin selector at the top
|
||||
print_grade_plugin_selector($courseid, 'edit', 'tree');
|
||||
|
||||
print_heading(get_string('categoriesedit', 'grades'));
|
||||
|
||||
// Add tabs
|
||||
// TODO: implement return support - use tabs from the report plugin
|
||||
/*$currenttab = 'editcategory';
|
||||
include('tabs.php');*/
|
||||
|
||||
print_box_start('gradetreebox generalbox');
|
||||
echo '<ul id="grade_tree">';
|
||||
|
3266
grade/lib.php
3266
grade/lib.php
File diff suppressed because it is too large
Load Diff
@ -23,11 +23,14 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
require_once("../config.php");
|
||||
require_once("../lib/gradelib.php");
|
||||
require_once '../config.php';
|
||||
require_once $CFG->libdir.'/gradelib.php';
|
||||
require_once $CFG->dirroot.'/grade/lib.php';
|
||||
|
||||
$courseid = required_param('id'); // course id
|
||||
$report = optional_param('report', get_user_preferences('grade_defaultreport', 'user'), PARAM_FILE);
|
||||
$report = optional_param('report', get_user_preferences('grade_defaultreport', 'user'), PARAM_SAFEDIR);
|
||||
$userid = optional_param('userid', 0, PARAM_INT); // user detail
|
||||
$page = optional_param('page', 0, PARAM_INT); // active page
|
||||
$edit = optional_param('edit', -1, PARAM_BOOL); // sticky editting mode
|
||||
|
||||
/// Make sure they can even access this course
|
||||
@ -67,26 +70,17 @@
|
||||
set_user_preference('grade_defaultreport', $report);
|
||||
}
|
||||
|
||||
|
||||
/// Create menu of reports
|
||||
|
||||
$reportnames = array();
|
||||
|
||||
if (count($reports) > 1) {
|
||||
foreach ($reports as $plugin) {
|
||||
$reportnames[$plugin] = get_string('modulename', 'gradereport_'.$plugin);
|
||||
}
|
||||
}
|
||||
|
||||
asort($reportnames); // Alphabetical sort
|
||||
|
||||
/// return tracking object
|
||||
$gpr = new grade_plugin_return(array('type'=>'report', 'plugin'=>$report, 'courseid'=>$courseid,
|
||||
'userid'=>$userid, 'page'=>$page));
|
||||
|
||||
/// Build navigation
|
||||
|
||||
$strgrades = get_string('grades');
|
||||
$reportname = get_string('modulename', 'gradereport_'.$report);
|
||||
$navlinks = array();
|
||||
$navlinks[] = array('name' => $strgrades, 'link' => $CFG->wwwroot . '/grade/index.php?id='.$courseid, 'type' => 'misc');
|
||||
$navlinks[] = array('name' => $reportnames[$report], 'link' => '', 'type' => 'misc');
|
||||
$navlinks[] = array('name' => $reportname, 'link' => '', 'type' => 'misc');
|
||||
|
||||
$navigation = build_navigation($navlinks);
|
||||
|
||||
@ -104,9 +98,7 @@
|
||||
}
|
||||
|
||||
// params for the turn editting on
|
||||
$options = array();
|
||||
$options['id'] = $courseid;
|
||||
$options['report'] = $report;
|
||||
$options = $gpr->get_options();
|
||||
|
||||
if ($USER->gradeediting) {
|
||||
$options['edit'] = 0;
|
||||
@ -125,15 +117,11 @@
|
||||
|
||||
/// Print header
|
||||
|
||||
print_header_simple($strgrades.':'.$reportnames[$report], ':'.$strgrades, $navigation,
|
||||
print_header_simple($strgrades.':'.$reportname, ':'.$strgrades, $navigation,
|
||||
'', '', true, $buttons, navmenu($course));
|
||||
|
||||
/// Print the report selector at the top if there is more than one report
|
||||
|
||||
if ($reportnames) {
|
||||
popup_form($CFG->wwwroot.'/grade/report.php?id='.$course->id.'&report=', $reportnames,
|
||||
'choosegradereport', $report, '', '', '', false, 'self', get_string('gradereports', 'grades').':');
|
||||
}
|
||||
/// Print the plugin selector at the top
|
||||
print_grade_plugin_selector($courseid, 'report', $report);
|
||||
|
||||
|
||||
/// Now simply include the report here and we're done
|
||||
|
@ -7,7 +7,6 @@ require_once($CFG->dirroot.'/grade/report/grader/lib.php');
|
||||
$gradeserror = array();
|
||||
|
||||
// get the params ($report, $courseid and $context are already set in grade/report.php)
|
||||
$page = optional_param('page', 0, PARAM_INT);
|
||||
$sortitemid = optional_param('sortitemid', 0, PARAM_ALPHANUM); // sort by which grade item
|
||||
$action = optional_param('action', 0, PARAM_ALPHA);
|
||||
$move = optional_param('move', 0, PARAM_INT);
|
||||
@ -65,11 +64,11 @@ echo $report->get_toggles_html();
|
||||
print_paging_bar($numusers, $report->page, $report->get_pref('studentsperpage'), $report->pbarurl);
|
||||
|
||||
$reporthtml = '<table class="gradestable">';
|
||||
$reporthtml .= $report->get_headerhtml();
|
||||
$reporthtml .= $report->get_scalehtml();
|
||||
$reporthtml .= $report->get_studentshtml();
|
||||
$reporthtml .= $report->get_groupavghtml();
|
||||
$reporthtml .= $report->get_gradeavghtml($numusers);
|
||||
$reporthtml .= $report->get_headerhtml($gpr);
|
||||
$reporthtml .= $report->get_scalehtml($gpr);
|
||||
$reporthtml .= $report->get_studentshtml($gpr);
|
||||
$reporthtml .= $report->get_groupavghtml($gpr);
|
||||
$reporthtml .= $report->get_gradeavghtml($gpr, $numusers); //TODO: numusers not in function definition??
|
||||
$reporthtml .= "</table>";
|
||||
// print submit button
|
||||
if ($USER->gradeediting) {
|
||||
|
@ -441,7 +441,7 @@ class grade_report_grader extends grade_report {
|
||||
* Builds and returns the HTML code for the headers.
|
||||
* @return string $headerhtml
|
||||
*/
|
||||
function get_headerhtml() {
|
||||
function get_headerhtml($gpr) {
|
||||
global $CFG, $USER;
|
||||
|
||||
$strsortasc = $this->get_lang_string('sortasc', 'grades');
|
||||
@ -510,7 +510,7 @@ class grade_report_grader extends grade_report {
|
||||
|
||||
// Print icons
|
||||
if ($USER->gradeediting) {
|
||||
$headerhtml .= $this->get_icons($element);
|
||||
$headerhtml .= $this->get_icons($element, $gpr);
|
||||
}
|
||||
|
||||
$headerhtml .= '</th>';
|
||||
@ -544,7 +544,7 @@ class grade_report_grader extends grade_report {
|
||||
. $element['object']->id .'">'. $element['object']->get_name()
|
||||
. '</a>' . $arrow;
|
||||
|
||||
$headerhtml .= $this->get_icons($element) . '</th>';
|
||||
$headerhtml .= $this->get_icons($element, $gpr) . '</th>';
|
||||
|
||||
$this->items[$element['object']->sortorder] =& $element['object'];
|
||||
}
|
||||
@ -560,7 +560,7 @@ class grade_report_grader extends grade_report {
|
||||
* Builds and return the HTML rows of the table (grades headed by student).
|
||||
* @return string HTML
|
||||
*/
|
||||
function get_studentshtml() {
|
||||
function get_studentshtml($gpr) {
|
||||
global $CFG, $USER;
|
||||
$studentshtml = '';
|
||||
$strfeedback = $this->get_lang_string("feedback");
|
||||
@ -616,7 +616,7 @@ class grade_report_grader extends grade_report {
|
||||
$states = array('is_hidden' => $item->hidden,
|
||||
'is_locked' => $item->locked,
|
||||
'is_editable' => $item->gradetype != GRADE_TYPE_NONE && !$grade->locked && !$item->locked);
|
||||
$studentshtml .= $this->get_icons($element, null, true, $states);
|
||||
$studentshtml .= $this->get_icons($element, $gpr, null, true, $states);
|
||||
}
|
||||
|
||||
// if in editting mode, we need to print either a text box
|
||||
@ -724,7 +724,7 @@ class grade_report_grader extends grade_report {
|
||||
* Builds and return the HTML rows of the table (grades headed by student).
|
||||
* @return string HTML
|
||||
*/
|
||||
function get_groupavghtml() {
|
||||
function get_groupavghtml($gpr) {
|
||||
global $CFG;
|
||||
|
||||
$groupavghtml = '';
|
||||
@ -759,7 +759,7 @@ class grade_report_grader extends grade_report {
|
||||
$groupavghtml .= '<td>-</td>';
|
||||
} else {
|
||||
$sum = $groupsum[$item->id];
|
||||
|
||||
|
||||
if ($item->scaleid) {
|
||||
$gradeitemsum = $groupsum[$item->id];
|
||||
$gradeitemavg = $gradeitemsum/$groupscount[$item->id];
|
||||
@ -769,12 +769,12 @@ class grade_report_grader extends grade_report {
|
||||
$scales_array = get_records_list('scale', 'id', $item->scaleid);
|
||||
$scale = $scales_array[$item->scaleid];
|
||||
$scales = explode(",", $scale->scale);
|
||||
|
||||
|
||||
// this could be a 0 when summed and rounded, e.g, 1, no grade, no grade, no grade
|
||||
if ($scaleval < 1) {
|
||||
$scaleval = 1;
|
||||
$scaleval = 1;
|
||||
}
|
||||
|
||||
|
||||
$gradehtml = $scales[$scaleval-1];
|
||||
} else {
|
||||
$gradeval = $this->get_grade_clean($sum/$groupscount[$item->id]);
|
||||
@ -792,7 +792,7 @@ class grade_report_grader extends grade_report {
|
||||
* Builds and return the HTML row of column totals.
|
||||
* @return string HTML
|
||||
*/
|
||||
function get_gradeavghtml() {
|
||||
function get_gradeavghtml($gpr) {
|
||||
global $CFG;
|
||||
|
||||
$gradeavghtml = '';
|
||||
@ -830,17 +830,17 @@ class grade_report_grader extends grade_report {
|
||||
$scales_array = get_records_list('scale', 'id', $item->scaleid);
|
||||
$scale = $scales_array[$item->scaleid];
|
||||
$scales = explode(",", $scale->scale);
|
||||
|
||||
|
||||
// this could be a 0 when summed and rounded, e.g, 1, no grade, no grade, no grade
|
||||
if ($scaleval < 1) {
|
||||
$scaleval = 1;
|
||||
$scaleval = 1;
|
||||
}
|
||||
|
||||
|
||||
$gradehtml = $scales[$scaleval-1];
|
||||
} else {
|
||||
} else {
|
||||
$gradeval = $this->get_grade_clean($sum/$classcount[$itemid]);
|
||||
$gradehtml = $gradeval;
|
||||
}
|
||||
}
|
||||
$gradeavghtml .= '<td>'.$gradehtml.'</td>';
|
||||
}
|
||||
}
|
||||
@ -853,7 +853,7 @@ class grade_report_grader extends grade_report {
|
||||
* Builds and return the HTML row of scales for each column (i.e. range).
|
||||
* @return string HTML
|
||||
*/
|
||||
function get_scalehtml() {
|
||||
function get_scalehtml($gpr) {
|
||||
$scalehtml = '';
|
||||
if ($this->get_pref('showranges')) {
|
||||
$scalehtml = '<tr><th class="range">'.$this->get_lang_string('range','grades').'</th>';
|
||||
@ -876,7 +876,7 @@ class grade_report_grader extends grade_report {
|
||||
* @param object $states An optional array of states (hidden, locked, editable), shortcuts to increase performance.
|
||||
* @return string HTML
|
||||
*/
|
||||
function get_icons($element, $icons=null, $limit=true, $states=array()) {
|
||||
function get_icons($element, $gpr, $icons=null, $limit=true, $states=array()) {
|
||||
global $CFG;
|
||||
global $USER;
|
||||
|
||||
@ -931,18 +931,21 @@ class grade_report_grader extends grade_report {
|
||||
$edit_icon = '';
|
||||
if ($states['is_editable']) {
|
||||
if ($type == 'category') {
|
||||
$edit_icon = '<a href="'. GRADE_EDIT_URL . '/category.php?courseid='.$object->courseid.'&id='.$object->id.'">'
|
||||
. '<img src="'.$CFG->pixpath.'/t/edit.gif" class="iconsmall" alt="'
|
||||
$url = GRADE_EDIT_URL . '/category.php?courseid='.$object->courseid.'&id='.$object->id;
|
||||
$url = $gpr->add_url_params($url);
|
||||
$edit_icon = '<a href="'.$url.'"><img src="'.$CFG->pixpath.'/t/edit.gif" class="iconsmall" alt="'
|
||||
. $stredit.'" title="'.$stredit.'" /></a>'. "\n";
|
||||
} else if ($type == 'item' or $type == 'categoryitem' or $type == 'courseitem'){
|
||||
$edit_icon = '<a href="'. GRADE_EDIT_URL . '/item.php?courseid='.$object->courseid.'&id='.$object->id.'">'
|
||||
. '<img src="'.$CFG->pixpath.'/t/edit.gif" class="iconsmall" alt="'
|
||||
$url = GRADE_EDIT_URL . '/item.php?courseid='.$object->courseid.'&id='.$object->id;
|
||||
$url = $gpr->add_url_params($url);
|
||||
$edit_icon = '<a href="'.$url.'"><img src="'.$CFG->pixpath.'/t/edit.gif" class="iconsmall" alt="'
|
||||
. $stredit.'" title="'.$stredit.'" /></a>'. "\n";
|
||||
} else if ($type == 'grade' and ($states['is_editable'] or empty($object->id))) {
|
||||
// TODO: change link to use itemid and userid to allow creating of new grade objects
|
||||
$edit_icon = '<a href="'. GRADE_EDIT_URL . '/grade.php?courseid='.$object->courseid.'&id='.$object->id.'">'
|
||||
. '<img ' . $overlib . ' src="'.$CFG->pixpath.'/t/edit.gif"'
|
||||
. 'class="iconsmall" alt="' . $stredit.'" title="'.$stredit.'" /></a>'. "\n";
|
||||
$url = GRADE_EDIT_URL . '/grade.php?courseid='.$object->courseid.'&id='.$object->id;
|
||||
$url = $gpr->add_url_params($url);
|
||||
$edit_icon = '<a href="'.$url.'"><img ' . $overlib . ' src="'.$CFG->pixpath.'/t/edit.gif"'
|
||||
. 'class="iconsmall" alt="' . $stredit.'" title="'.$stredit.'" /></a>'. "\n";
|
||||
}
|
||||
}
|
||||
|
||||
@ -950,8 +953,9 @@ class grade_report_grader extends grade_report {
|
||||
if ($type == 'item' or $type == 'courseitem' or $type == 'categoryitem') {
|
||||
// show calculation icon only when calculation possible
|
||||
if (!$object->is_normal_item() and ($object->gradetype == GRADE_TYPE_SCALE or $object->gradetype == GRADE_TYPE_VALUE)) {
|
||||
$edit_calculation_icon = '<a href="'. GRADE_EDIT_URL . '/calculation.php?courseid='.$object->courseid.'&id='.$object->id.'">'
|
||||
. '<img src="'.$CFG->pixpath.'/t/calc.gif" class="iconsmall" alt="'
|
||||
$url = GRADE_EDIT_URL . '/calculation.php?courseid='.$object->courseid.'&id='.$object->id;
|
||||
$url = $gpr->add_url_params($url);
|
||||
$edit_calculation_icon = '<a href="'. $url.'"><img src="'.$CFG->pixpath.'/t/calc.gif" class="iconsmall" alt="'
|
||||
. $streditcalculation.'" title="'.$streditcalculation.'" /></a>'. "\n";
|
||||
}
|
||||
}
|
||||
|
@ -4,10 +4,6 @@
|
||||
$CFG->wwwroot.'/grade/report.php?id='.$courseid.'&report=grader',
|
||||
get_string('graderreport', 'grades'));
|
||||
|
||||
$row[] = new tabobject('editcategory',
|
||||
$CFG->wwwroot.'/grade/edit/tree.php?id='.$courseid,
|
||||
get_string('categoriesedit', 'grades'));
|
||||
|
||||
$row[] = new tabobject('preferences',
|
||||
$CFG->wwwroot.'/grade/report/grader/preferences.php?id='.$courseid,
|
||||
get_string('preferences'));
|
||||
|
Loading…
x
Reference in New Issue
Block a user