|
Moodle
2.2.1
http://www.collinsharper.com
|
00001 <?php 00002 00003 // This file is part of Moodle - http://moodle.org/ 00004 // 00005 // Moodle is free software: you can redistribute it and/or modify 00006 // it under the terms of the GNU General Public License as published by 00007 // the Free Software Foundation, either version 3 of the License, or 00008 // (at your option) any later version. 00009 // 00010 // Moodle is distributed in the hope that it will be useful, 00011 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00013 // GNU General Public License for more details. 00014 // 00015 // You should have received a copy of the GNU General Public License 00016 // along with Moodle. If not, see <http://www.gnu.org/licenses/>. 00017 00023 require_once($CFG->dirroot . '/grade/report/lib.php'); 00024 require_once($CFG->libdir.'/tablelib.php'); 00025 00026 //showhiddenitems values 00027 define("GRADE_REPORT_USER_HIDE_HIDDEN", 0); 00028 define("GRADE_REPORT_USER_HIDE_UNTIL", 1); 00029 define("GRADE_REPORT_USER_SHOW_HIDDEN", 2); 00030 00036 class grade_report_user extends grade_report { 00037 00042 public $user; 00043 00048 public $table; 00049 00054 public $tableheaders = array(); 00055 00060 public $tablecolumns = array(); 00061 00066 public $tabledata = array(); 00067 00072 public $gtree; 00073 00077 public $gseq; 00078 00082 public $showrank; 00083 00087 public $showpercentage; 00088 00092 public $showrange = true; 00093 00098 public $showgrade = true; 00099 00104 public $decimals = 2; 00105 00110 public $rangedecimals = 0; 00111 00116 public $showfeedback = true; 00117 00122 public $showweight = false; 00123 00128 public $showlettergrade = false; 00129 00134 public $showaverage = false; 00135 00136 public $maxdepth; 00137 public $evenodd; 00138 00139 public $canviewhidden; 00140 00141 public $switch; 00142 00146 public $showhiddenitems; 00147 public $showtotalsifcontainhidden; 00148 00149 public $baseurl; 00150 public $pbarurl; 00151 00159 public function __construct($courseid, $gpr, $context, $userid) { 00160 global $DB, $CFG; 00161 parent::__construct($courseid, $gpr, $context); 00162 00163 $this->showrank = grade_get_setting($this->courseid, 'report_user_showrank', $CFG->grade_report_user_showrank); 00164 $this->showpercentage = grade_get_setting($this->courseid, 'report_user_showpercentage', $CFG->grade_report_user_showpercentage); 00165 $this->showhiddenitems = grade_get_setting($this->courseid, 'report_user_showhiddenitems', $CFG->grade_report_user_showhiddenitems); 00166 $this->showtotalsifcontainhidden = grade_get_setting($this->courseid, 'report_user_showtotalsifcontainhidden', $CFG->grade_report_user_showtotalsifcontainhidden); 00167 00168 $this->showgrade = grade_get_setting($this->courseid, 'report_user_showgrade', !empty($CFG->grade_report_user_showgrade)); 00169 $this->showrange = grade_get_setting($this->courseid, 'report_user_showrange', !empty($CFG->grade_report_user_showrange)); 00170 $this->showfeedback = grade_get_setting($this->courseid, 'report_user_showfeedback', !empty($CFG->grade_report_user_showfeedback)); 00171 $this->showweight = grade_get_setting($this->courseid, 'report_user_showweight', !empty($CFG->grade_report_user_showweight)); 00172 $this->showlettergrade = grade_get_setting($this->courseid, 'report_user_showlettergrade', !empty($CFG->grade_report_user_showlettergrade)); 00173 $this->showaverage = grade_get_setting($this->courseid, 'report_user_showaverage', !empty($CFG->grade_report_user_showaverage)); 00174 00175 // The default grade decimals is 2 00176 $defaultdecimals = 2; 00177 if (property_exists($CFG, 'grade_decimalpoints')) { 00178 $defaultdecimals = $CFG->grade_decimalpoints; 00179 } 00180 $this->decimals = grade_get_setting($this->courseid, 'decimalpoints', $defaultdecimals); 00181 00182 // The default range decimals is 0 00183 $defaultrangedecimals = 0; 00184 if (property_exists($CFG, 'grade_report_user_rangedecimals')) { 00185 $defaultrangedecimals = $CFG->grade_report_user_rangedecimals; 00186 } 00187 $this->rangedecimals = grade_get_setting($this->courseid, 'report_user_rangedecimals', $defaultrangedecimals); 00188 00189 $this->switch = grade_get_setting($this->courseid, 'aggregationposition', $CFG->grade_aggregationposition); 00190 00191 // Grab the grade_tree for this course 00192 $this->gtree = new grade_tree($this->courseid, false, $this->switch, null, !$CFG->enableoutcomes); 00193 00194 // Determine the number of rows and indentation 00195 $this->maxdepth = 1; 00196 $this->inject_rowspans($this->gtree->top_element); 00197 $this->maxdepth++; // Need to account for the lead column that spans all children 00198 for ($i = 1; $i <= $this->maxdepth; $i++) { 00199 $this->evenodd[$i] = 0; 00200 } 00201 00202 $this->tabledata = array(); 00203 00204 $this->canviewhidden = has_capability('moodle/grade:viewhidden', get_context_instance(CONTEXT_COURSE, $this->courseid)); 00205 00206 // get the user (for full name) 00207 $this->user = $DB->get_record('user', array('id' => $userid)); 00208 00209 // base url for sorting by first/last name 00210 $this->baseurl = $CFG->wwwroot.'/grade/report?id='.$courseid.'&userid='.$userid; 00211 $this->pbarurl = $this->baseurl; 00212 00213 // no groups on this report - rank is from all course users 00214 $this->setup_table(); 00215 00216 //optionally calculate grade item averages 00217 $this->calculate_averages(); 00218 } 00219 00220 function inject_rowspans(&$element) { 00221 if ($element['depth'] > $this->maxdepth) { 00222 $this->maxdepth = $element['depth']; 00223 } 00224 if (empty($element['children'])) { 00225 return 1; 00226 } 00227 $count = 1; 00228 foreach ($element['children'] as $key=>$child) { 00229 $count += $this->inject_rowspans($element['children'][$key]); 00230 } 00231 $element['rowspan'] = $count; 00232 return $count; 00233 } 00234 00235 00239 public function setup_table() { 00240 /* 00241 * Table has 1-8 columns 00242 *| All columns except for itemname/description are optional 00243 */ 00244 00245 // setting up table headers 00246 00247 $this->tablecolumns = array('itemname'); 00248 $this->tableheaders = array($this->get_lang_string('gradeitem', 'grades')); 00249 00250 if ($this->showweight) { 00251 $this->tablecolumns[] = 'weight'; 00252 $this->tableheaders[] = $this->get_lang_string('weightuc', 'grades'); 00253 } 00254 00255 if ($this->showgrade) { 00256 $this->tablecolumns[] = 'grade'; 00257 $this->tableheaders[] = $this->get_lang_string('grade', 'grades'); 00258 } 00259 00260 if ($this->showrange) { 00261 $this->tablecolumns[] = 'range'; 00262 $this->tableheaders[] = $this->get_lang_string('range', 'grades'); 00263 } 00264 00265 if ($this->showpercentage) { 00266 $this->tablecolumns[] = 'percentage'; 00267 $this->tableheaders[] = $this->get_lang_string('percentage', 'grades'); 00268 } 00269 00270 if ($this->showlettergrade) { 00271 $this->tablecolumns[] = 'lettergrade'; 00272 $this->tableheaders[] = $this->get_lang_string('lettergrade', 'grades'); 00273 } 00274 00275 if ($this->showrank) { 00276 $this->tablecolumns[] = 'rank'; 00277 $this->tableheaders[] = $this->get_lang_string('rank', 'grades'); 00278 } 00279 00280 if ($this->showaverage) { 00281 $this->tablecolumns[] = 'average'; 00282 $this->tableheaders[] = $this->get_lang_string('average', 'grades'); 00283 } 00284 00285 if ($this->showfeedback) { 00286 $this->tablecolumns[] = 'feedback'; 00287 $this->tableheaders[] = $this->get_lang_string('feedback', 'grades'); 00288 } 00289 } 00290 00291 function fill_table() { 00292 //print "<pre>"; 00293 //print_r($this->gtree->top_element); 00294 $this->fill_table_recursive($this->gtree->top_element); 00295 //print_r($this->tabledata); 00296 //print "</pre>"; 00297 return true; 00298 } 00299 00300 private function fill_table_recursive(&$element) { 00301 global $DB, $CFG; 00302 00303 $type = $element['type']; 00304 $depth = $element['depth']; 00305 $grade_object = $element['object']; 00306 $eid = $grade_object->id; 00307 $element['userid'] = $this->user->id; 00308 $fullname = $this->gtree->get_element_header($element, true, true, true); 00309 $data = array(); 00310 $hidden = ''; 00311 $excluded = ''; 00312 $class = ''; 00313 00314 // If this is a hidden grade category, hide it completely from the user 00315 if ($type == 'category' && $grade_object->is_hidden() && !$this->canviewhidden && ( 00316 $this->showhiddenitems == GRADE_REPORT_USER_HIDE_HIDDEN || 00317 ($this->showhiddenitems == GRADE_REPORT_USER_HIDE_UNTIL && !$grade_object->is_hiddenuntil()))) { 00318 return false; 00319 } 00320 00321 if ($type == 'category') { 00322 $this->evenodd[$depth] = (($this->evenodd[$depth] + 1) % 2); 00323 } 00324 $alter = ($this->evenodd[$depth] == 0) ? 'even' : 'odd'; 00325 00327 if ($type == 'item' or $type == 'categoryitem' or $type == 'courseitem') { 00328 if (! $grade_grade = grade_grade::fetch(array('itemid'=>$grade_object->id,'userid'=>$this->user->id))) { 00329 $grade_grade = new grade_grade(); 00330 $grade_grade->userid = $this->user->id; 00331 $grade_grade->itemid = $grade_object->id; 00332 } 00333 00334 $grade_grade->load_grade_item(); 00335 00337 if ($grade_grade->grade_item->is_hidden()) { 00338 $hidden = ' hidden'; 00339 } 00340 00341 // If this is a hidden grade item, hide it completely from the user. 00342 if ($grade_grade->is_hidden() && !$this->canviewhidden && ( 00343 $this->showhiddenitems == GRADE_REPORT_USER_HIDE_HIDDEN || 00344 ($this->showhiddenitems == GRADE_REPORT_USER_HIDE_UNTIL && !$grade_grade->is_hiddenuntil()))) { 00345 // return false; 00346 } else { 00348 if ($grade_grade->is_excluded()) { 00349 $fullname .= ' ['.get_string('excluded', 'grades').']'; 00350 $excluded = ' excluded'; 00351 } 00352 00354 $class = "$hidden $excluded"; 00355 if ($this->switch) { // alter style based on whether aggregation is first or last 00356 $class .= ($type == 'categoryitem' or $type == 'courseitem') ? " ".$alter."d$depth baggt b2b" : " item b1b"; 00357 } else { 00358 $class .= ($type == 'categoryitem' or $type == 'courseitem') ? " ".$alter."d$depth baggb" : " item b1b"; 00359 } 00360 00362 $data['itemname']['content'] = $fullname; 00363 $data['itemname']['class'] = $class; 00364 $data['itemname']['colspan'] = ($this->maxdepth - $depth); 00365 00367 $gradeval = $grade_grade->finalgrade; 00368 00369 $class .= " itemcenter "; 00370 if ($this->showweight) { 00371 $data['weight']['class'] = $class; 00372 $data['weight']['content'] = '-'; 00373 // has a weight assigned, might be extra credit 00374 if ($grade_object->aggregationcoef > 0 && $type <> 'courseitem') { 00375 $data['weight']['content'] = number_format($grade_object->aggregationcoef,2).'%'; 00376 } 00377 } 00378 00379 if ($this->showgrade) { 00380 if ($grade_grade->grade_item->needsupdate) { 00381 $data['grade']['class'] = $class.' gradingerror'; 00382 $data['grade']['content'] = get_string('error'); 00383 } else if (!empty($CFG->grade_hiddenasdate) and $grade_grade->get_datesubmitted() and !$this->canviewhidden and $grade_grade->is_hidden() 00384 and !$grade_grade->grade_item->is_category_item() and !$grade_grade->grade_item->is_course_item()) { 00385 // the problem here is that we do not have the time when grade value was modified, 'timemodified' is general modification date for grade_grades records 00386 $class .= ' datesubmitted'; 00387 $data['grade']['class'] = $class; 00388 $data['grade']['content'] = get_string('submittedon', 'grades', userdate($grade_grade->get_datesubmitted(), get_string('strftimedatetimeshort'))); 00389 00390 } elseif ($grade_grade->is_hidden()) { 00391 $data['grade']['class'] = $class.' hidden'; 00392 $data['grade']['content'] = '-'; 00393 } else { 00394 $data['grade']['class'] = $class; 00395 $gradeval = $this->blank_hidden_total($this->courseid, $grade_grade->grade_item, $gradeval); 00396 $data['grade']['content'] = grade_format_gradevalue($gradeval, $grade_grade->grade_item, true); 00397 } 00398 } 00399 00400 // Range 00401 if ($this->showrange) { 00402 $data['range']['class'] = $class; 00403 $data['range']['content'] = $grade_grade->grade_item->get_formatted_range(GRADE_DISPLAY_TYPE_REAL, $this->rangedecimals); 00404 } 00405 00406 // Percentage 00407 if ($this->showpercentage) { 00408 if ($grade_grade->grade_item->needsupdate) { 00409 $data['percentage']['class'] = $class.' gradingerror'; 00410 $data['percentage']['content'] = get_string('error'); 00411 } else if ($grade_grade->is_hidden()) { 00412 $data['percentage']['class'] = $class.' hidden'; 00413 $data['percentage']['content'] = '-'; 00414 } else { 00415 $data['percentage']['class'] = $class; 00416 $data['percentage']['content'] = grade_format_gradevalue($gradeval, $grade_grade->grade_item, true, GRADE_DISPLAY_TYPE_PERCENTAGE); 00417 } 00418 } 00419 00420 // Lettergrade 00421 if ($this->showlettergrade) { 00422 if ($grade_grade->grade_item->needsupdate) { 00423 $data['lettergrade']['class'] = $class.' gradingerror'; 00424 $data['lettergrade']['content'] = get_string('error'); 00425 } else if ($grade_grade->is_hidden()) { 00426 $data['lettergrade']['class'] = $class.' hidden'; 00427 if (!$this->canviewhidden) { 00428 $data['lettergrade']['content'] = '-'; 00429 } else { 00430 $data['lettergrade']['content'] = grade_format_gradevalue($gradeval, $grade_grade->grade_item, true, GRADE_DISPLAY_TYPE_LETTER); 00431 } 00432 } else { 00433 $data['lettergrade']['class'] = $class; 00434 $data['lettergrade']['content'] = grade_format_gradevalue($gradeval, $grade_grade->grade_item, true, GRADE_DISPLAY_TYPE_LETTER); 00435 } 00436 } 00437 00438 // Rank 00439 if ($this->showrank) { 00440 if ($grade_grade->grade_item->needsupdate) { 00441 $data['rank']['class'] = $class.' gradingerror'; 00442 $data['rank']['content'] = get_string('error'); 00443 } elseif ($grade_grade->is_hidden()) { 00444 $data['rank']['class'] = $class.' hidden'; 00445 $data['rank']['content'] = '-'; 00446 } else if (is_null($gradeval)) { 00447 // no grade, no rank 00448 $data['rank']['class'] = $class; 00449 $data['rank']['content'] = '-'; 00450 00451 } else { 00453 $sql = "SELECT COUNT(DISTINCT(userid)) 00454 FROM {grade_grades} 00455 WHERE finalgrade > ? 00456 AND itemid = ? 00457 AND hidden = 0"; 00458 $rank = $DB->count_records_sql($sql, array($grade_grade->finalgrade, $grade_grade->grade_item->id)) + 1; 00459 00460 $data['rank']['class'] = $class; 00461 $data['rank']['content'] = "$rank/".$this->get_numusers(false); // total course users 00462 } 00463 } 00464 00465 // Average 00466 if ($this->showaverage) { 00467 $data['average']['class'] = $class; 00468 if (!empty($this->gtree->items[$eid]->avg)) { 00469 $data['average']['content'] = $this->gtree->items[$eid]->avg; 00470 } else { 00471 $data['average']['content'] = '-'; 00472 } 00473 } 00474 00475 // Feedback 00476 if ($this->showfeedback) { 00477 if ($grade_grade->overridden > 0 AND ($type == 'categoryitem' OR $type == 'courseitem')) { 00478 $data['feedback']['class'] = $class.' feedbacktext'; 00479 $data['feedback']['content'] = get_string('overridden', 'grades').': ' . format_text($grade_grade->feedback, $grade_grade->feedbackformat); 00480 } else if (empty($grade_grade->feedback) or (!$this->canviewhidden and $grade_grade->is_hidden())) { 00481 $data['feedback']['class'] = $class.' feedbacktext'; 00482 $data['feedback']['content'] = ' '; 00483 } else { 00484 $data['feedback']['class'] = $class.' feedbacktext'; 00485 $data['feedback']['content'] = format_text($grade_grade->feedback, $grade_grade->feedbackformat); 00486 } 00487 } 00488 } 00489 } 00490 00492 if ($type == 'category') { 00493 $data['leader']['class'] = $class.' '.$alter."d$depth b1t b2b b1l"; 00494 $data['leader']['rowspan'] = $element['rowspan']; 00495 00496 if ($this->switch) { // alter style based on whether aggregation is first or last 00497 $data['itemname']['class'] = $class.' '.$alter."d$depth b1b b1t"; 00498 } else { 00499 $data['itemname']['class'] = $class.' '.$alter."d$depth b2t"; 00500 } 00501 $data['itemname']['colspan'] = ($this->maxdepth - $depth + count($this->tablecolumns) - 1); 00502 $data['itemname']['content'] = $fullname; 00503 } 00504 00506 $this->tabledata[] = $data; 00507 00509 if (isset($element['children'])) { 00510 foreach ($element['children'] as $key=>$child) { 00511 $this->fill_table_recursive($element['children'][$key]); 00512 } 00513 } 00514 } 00515 00521 public function print_table($return=false) { 00522 $maxspan = $this->maxdepth; 00523 00525 $html = " 00526 <table cellspacing='0' cellpadding='0' class='boxaligncenter generaltable user-grade'> 00527 <thead> 00528 <tr> 00529 <th class=\"header\" colspan='$maxspan'>".$this->tableheaders[0]."</th>\n"; 00530 00531 for ($i = 1; $i < count($this->tableheaders); $i++) { 00532 $html .= "<th class=\"header\">".$this->tableheaders[$i]."</th>\n"; 00533 } 00534 00535 $html .= " 00536 </tr> 00537 </thead> 00538 <tbody>\n"; 00539 00541 for ($i = 0; $i < count($this->tabledata); $i++) { 00542 $html .= "<tr>\n"; 00543 if (isset($this->tabledata[$i]['leader'])) { 00544 $rowspan = $this->tabledata[$i]['leader']['rowspan']; 00545 $class = $this->tabledata[$i]['leader']['class']; 00546 $html .= "<td class='$class' rowspan='$rowspan'></td>\n"; 00547 } 00548 for ($j = 0; $j < count($this->tablecolumns); $j++) { 00549 $name = $this->tablecolumns[$j]; 00550 $class = (isset($this->tabledata[$i][$name]['class'])) ? $this->tabledata[$i][$name]['class'] : ''; 00551 $colspan = (isset($this->tabledata[$i][$name]['colspan'])) ? "colspan='".$this->tabledata[$i][$name]['colspan']."'" : ''; 00552 $content = (isset($this->tabledata[$i][$name]['content'])) ? $this->tabledata[$i][$name]['content'] : null; 00553 if (isset($content)) { 00554 $html .= "<td class='$class' $colspan>$content</td>\n"; 00555 } 00556 } 00557 $html .= "</tr>\n"; 00558 } 00559 00560 $html .= "</tbody></table>"; 00561 00562 if ($return) { 00563 return $html; 00564 } else { 00565 echo $html; 00566 } 00567 } 00568 00574 function process_data($data) { 00575 } 00576 function process_action($target, $action) { 00577 } 00578 00583 function calculate_averages() { 00584 global $USER, $DB; 00585 00586 if ($this->showaverage) { 00587 // this settings are actually grader report settings (not user report) 00588 // however we're using them as having two separate but identical settings the 00589 // user would have to keep in sync would be annoying 00590 $averagesdisplaytype = $this->get_pref('averagesdisplaytype'); 00591 $averagesdecimalpoints = $this->get_pref('averagesdecimalpoints'); 00592 $meanselection = $this->get_pref('meanselection'); 00593 $shownumberofgrades = $this->get_pref('shownumberofgrades'); 00594 00595 $avghtml = ''; 00596 $avgcssclass = 'avg'; 00597 00598 $straverage = get_string('overallaverage', 'grades'); 00599 00600 $groupsql = $this->groupsql; 00601 $groupwheresql = $this->groupwheresql; 00602 //$groupwheresqlparams = ; 00603 00604 if ($shownumberofgrades) { 00605 $straverage .= ' (' . get_string('submissions', 'grades') . ') '; 00606 } 00607 00608 $totalcount = $this->get_numusers(false); 00609 00610 //limit to users with a gradeable role ie students 00611 list($gradebookrolessql, $gradebookrolesparams) = $DB->get_in_or_equal(explode(',', $this->gradebookroles), SQL_PARAMS_NAMED, 'grbr0'); 00612 00613 //limit to users with an active enrolment 00614 list($enrolledsql, $enrolledparams) = get_enrolled_sql($this->context); 00615 00616 $params = array_merge($this->groupwheresql_params, $gradebookrolesparams, $enrolledparams); 00617 $params['courseid'] = $this->courseid; 00618 00619 // find sums of all grade items in course 00620 $sql = "SELECT gg.itemid, SUM(gg.finalgrade) AS sum 00621 FROM {grade_items} gi 00622 JOIN {grade_grades} gg ON gg.itemid = gi.id 00623 JOIN {user} u ON u.id = gg.userid 00624 JOIN ($enrolledsql) je ON je.id = gg.userid 00625 JOIN ( 00626 SELECT DISTINCT ra.userid 00627 FROM {role_assignments} ra 00628 WHERE ra.roleid $gradebookrolessql 00629 AND ra.contextid " . get_related_contexts_string($this->context) . " 00630 ) rainner ON rainner.userid = u.id 00631 $groupsql 00632 WHERE gi.courseid = :courseid 00633 AND u.deleted = 0 00634 AND gg.finalgrade IS NOT NULL 00635 AND gg.hidden = 0 00636 $groupwheresql 00637 GROUP BY gg.itemid"; 00638 00639 $sum_array = array(); 00640 $sums = $DB->get_recordset_sql($sql, $params); 00641 foreach ($sums as $itemid => $csum) { 00642 $sum_array[$itemid] = $csum->sum; 00643 } 00644 $sums->close(); 00645 00646 $columncount=0; 00647 00648 // Empty grades must be evaluated as grademin, NOT always 0 00649 // This query returns a count of ungraded grades (NULL finalgrade OR no matching record in grade_grades table) 00650 // No join condition when joining grade_items and user to get a grade item row for every user 00651 // Then left join with grade_grades and look for rows with null final grade (which includes grade items with no grade_grade) 00652 $sql = "SELECT gi.id, COUNT(u.id) AS count 00653 FROM {grade_items} gi 00654 JOIN {user} u ON u.deleted = 0 00655 JOIN ($enrolledsql) je ON je.id = u.id 00656 JOIN ( 00657 SELECT DISTINCT ra.userid 00658 FROM {role_assignments} ra 00659 WHERE ra.roleid $gradebookrolessql 00660 AND ra.contextid " . get_related_contexts_string($this->context) . " 00661 ) rainner ON rainner.userid = u.id 00662 LEFT JOIN {grade_grades} gg 00663 ON (gg.itemid = gi.id AND gg.userid = u.id AND gg.finalgrade IS NOT NULL AND gg.hidden = 0) 00664 $groupsql 00665 WHERE gi.courseid = :courseid 00666 AND gg.finalgrade IS NULL 00667 $groupwheresql 00668 GROUP BY gi.id"; 00669 00670 $ungraded_counts = $DB->get_records_sql($sql, $params); 00671 00672 foreach ($this->gtree->items as $itemid=>$unused) { 00673 if (!empty($this->gtree->items[$itemid]->avg)) { 00674 continue; 00675 } 00676 $item = $this->gtree->items[$itemid]; 00677 00678 if ($item->needsupdate) { 00679 $avghtml .= '<td class="cell c' . $columncount++.'"><span class="gradingerror">'.get_string('error').'</span></td>'; 00680 continue; 00681 } 00682 00683 if (empty($sum_array[$item->id])) { 00684 $sum_array[$item->id] = 0; 00685 } 00686 00687 if (empty($ungraded_counts[$itemid])) { 00688 $ungraded_count = 0; 00689 } else { 00690 $ungraded_count = $ungraded_counts[$itemid]->count; 00691 } 00692 00693 //do they want the averages to include all grade items 00694 if ($meanselection == GRADE_REPORT_MEAN_GRADED) { 00695 $mean_count = $totalcount - $ungraded_count; 00696 } else { // Bump up the sum by the number of ungraded items * grademin 00697 $sum_array[$item->id] += ($ungraded_count * $item->grademin); 00698 $mean_count = $totalcount; 00699 } 00700 00701 $decimalpoints = $item->get_decimals(); 00702 00703 // Determine which display type to use for this average 00704 if (!empty($USER->gradeediting) && $USER->gradeediting[$this->courseid]) { 00705 $displaytype = GRADE_DISPLAY_TYPE_REAL; 00706 00707 } else if ($averagesdisplaytype == GRADE_REPORT_PREFERENCE_INHERIT) { // no ==0 here, please resave the report and user preferences 00708 $displaytype = $item->get_displaytype(); 00709 00710 } else { 00711 $displaytype = $averagesdisplaytype; 00712 } 00713 00714 // Override grade_item setting if a display preference (not inherit) was set for the averages 00715 if ($averagesdecimalpoints == GRADE_REPORT_PREFERENCE_INHERIT) { 00716 $decimalpoints = $item->get_decimals(); 00717 00718 } else { 00719 $decimalpoints = $averagesdecimalpoints; 00720 } 00721 00722 if (empty($sum_array[$item->id]) || $mean_count == 0) { 00723 $this->gtree->items[$itemid]->avg = '-'; 00724 } else { 00725 $sum = $sum_array[$item->id]; 00726 $avgradeval = $sum/$mean_count; 00727 $gradehtml = grade_format_gradevalue($avgradeval, $item, true, $displaytype, $decimalpoints); 00728 00729 $numberofgrades = ''; 00730 if ($shownumberofgrades) { 00731 $numberofgrades = " ($mean_count)"; 00732 } 00733 00734 $this->gtree->items[$itemid]->avg = $gradehtml.$numberofgrades; 00735 } 00736 } 00737 } 00738 } 00739 } 00740 00741 function grade_report_user_settings_definition(&$mform) { 00742 global $CFG; 00743 00744 $options = array(-1 => get_string('default', 'grades'), 00745 0 => get_string('hide'), 00746 1 => get_string('show')); 00747 00748 if (empty($CFG->grade_report_user_showrank)) { 00749 $options[-1] = get_string('defaultprev', 'grades', $options[0]); 00750 } else { 00751 $options[-1] = get_string('defaultprev', 'grades', $options[1]); 00752 } 00753 00754 $mform->addElement('select', 'report_user_showrank', get_string('showrank', 'grades'), $options); 00755 $mform->addHelpButton('report_user_showrank', 'showrank', 'grades'); 00756 00757 if (empty($CFG->grade_report_user_showpercentage)) { 00758 $options[-1] = get_string('defaultprev', 'grades', $options[0]); 00759 } else { 00760 $options[-1] = get_string('defaultprev', 'grades', $options[1]); 00761 } 00762 00763 $mform->addElement('select', 'report_user_showpercentage', get_string('showpercentage', 'grades'), $options); 00764 $mform->addHelpButton('report_user_showpercentage', 'showpercentage', 'grades'); 00765 00766 if (empty($CFG->grade_report_user_showgrade)) { 00767 $options[-1] = get_string('defaultprev', 'grades', $options[0]); 00768 } else { 00769 $options[-1] = get_string('defaultprev', 'grades', $options[1]); 00770 } 00771 00772 $mform->addElement('select', 'report_user_showgrade', get_string('showgrade', 'grades'), $options); 00773 00774 if (empty($CFG->grade_report_user_showfeedback)) { 00775 $options[-1] = get_string('defaultprev', 'grades', $options[0]); 00776 } else { 00777 $options[-1] = get_string('defaultprev', 'grades', $options[1]); 00778 } 00779 00780 $mform->addElement('select', 'report_user_showfeedback', get_string('showfeedback', 'grades'), $options); 00781 00782 if (empty($CFG->grade_report_user_showweight)) { 00783 $options[-1] = get_string('defaultprev', 'grades', $options[0]); 00784 } else { 00785 $options[-1] = get_string('defaultprev', 'grades', $options[1]); 00786 } 00787 00788 $mform->addElement('select', 'report_user_showweight', get_string('showweight', 'grades'), $options); 00789 00790 if (empty($CFG->grade_report_user_showaverage)) { 00791 $options[-1] = get_string('defaultprev', 'grades', $options[0]); 00792 } else { 00793 $options[-1] = get_string('defaultprev', 'grades', $options[1]); 00794 } 00795 00796 $mform->addElement('select', 'report_user_showaverage', get_string('showaverage', 'grades'), $options); 00797 $mform->addHelpButton('report_user_showaverage', 'showaverage', 'grades'); 00798 00799 if (empty($CFG->grade_report_user_showlettergrade)) { 00800 $options[-1] = get_string('defaultprev', 'grades', $options[0]); 00801 } else { 00802 $options[-1] = get_string('defaultprev', 'grades', $options[1]); 00803 } 00804 00805 $mform->addElement('select', 'report_user_showlettergrade', get_string('showlettergrade', 'grades'), $options); 00806 00807 if (empty($CFG->grade_report_user_showrange)) { 00808 $options[-1] = get_string('defaultprev', 'grades', $options[0]); 00809 } else { 00810 $options[-1] = get_string('defaultprev', 'grades', $options[1]); 00811 } 00812 00813 $mform->addElement('select', 'report_user_showrange', get_string('showrange', 'grades'), $options); 00814 00815 $options = array(0=>0, 1=>1, 2=>2, 3=>3, 4=>4, 5=>5); 00816 if (! empty($CFG->grade_report_user_rangedecimals)) { 00817 $options[-1] = $options[$CFG->grade_report_user_rangedecimals]; 00818 } 00819 $mform->addElement('select', 'report_user_rangedecimals', get_string('rangedecimals', 'grades'), $options); 00820 00821 $options = array(-1 => get_string('default', 'grades'), 00822 0 => get_string('shownohidden', 'grades'), 00823 1 => get_string('showhiddenuntilonly', 'grades'), 00824 2 => get_string('showallhidden', 'grades')); 00825 00826 if (empty($CFG->grade_report_user_showhiddenitems)) { 00827 $options[-1] = get_string('defaultprev', 'grades', $options[0]); 00828 } else { 00829 $options[-1] = get_string('defaultprev', 'grades', $options[$CFG->grade_report_user_showhiddenitems]); 00830 } 00831 00832 $mform->addElement('select', 'report_user_showhiddenitems', get_string('showhiddenitems', 'grades'), $options); 00833 $mform->addHelpButton('report_user_showhiddenitems', 'showhiddenitems', 'grades'); 00834 00835 //showtotalsifcontainhidden 00836 $options = array(-1 => get_string('default', 'grades'), 00837 GRADE_REPORT_HIDE_TOTAL_IF_CONTAINS_HIDDEN => get_string('hide'), 00838 GRADE_REPORT_SHOW_TOTAL_IF_CONTAINS_HIDDEN => get_string('hidetotalshowexhiddenitems', 'grades'), 00839 GRADE_REPORT_SHOW_REAL_TOTAL_IF_CONTAINS_HIDDEN => get_string('hidetotalshowinchiddenitems', 'grades') ); 00840 00841 if (empty($CFG->grade_report_user_showtotalsifcontainhidden)) { 00842 $options[-1] = get_string('defaultprev', 'grades', $options[0]); 00843 } else { 00844 $options[-1] = get_string('defaultprev', 'grades', $options[$CFG->grade_report_user_showtotalsifcontainhidden]); 00845 } 00846 00847 $mform->addElement('select', 'report_user_showtotalsifcontainhidden', get_string('hidetotalifhiddenitems', 'grades'), $options); 00848 $mform->addHelpButton('report_user_showtotalsifcontainhidden', 'hidetotalifhiddenitems', 'grades'); 00849 } 00850 00851 function grade_report_user_profilereport($course, $user) { 00852 global $OUTPUT; 00853 if (!empty($course->showgrades)) { 00854 00855 $context = get_context_instance(CONTEXT_COURSE, $course->id); 00856 00857 //first make sure we have proper final grades - this must be done before constructing of the grade tree 00858 grade_regrade_final_grades($course->id); 00859 00861 $gpr = new grade_plugin_return(array('type'=>'report', 'plugin'=>'user', 'courseid'=>$course->id, 'userid'=>$user->id)); 00862 // Create a report instance 00863 $report = new grade_report_user($course->id, $gpr, $context, $user->id); 00864 00865 // print the page 00866 echo '<div class="grade-report-user">'; // css fix to share styles with real report page 00867 echo $OUTPUT->heading(get_string('pluginname', 'gradereport_user'). ' - '.fullname($report->user)); 00868 00869 if ($report->fill_table()) { 00870 echo $report->print_table(true); 00871 } 00872 echo '</div>'; 00873 } 00874 } 00875 00876