From 20180b316756416db5c4612f42ddb1f73f729e5d Mon Sep 17 00:00:00 2001 From: Mark Nelson Date: Thu, 7 Jan 2016 19:34:19 +0800 Subject: [PATCH] MDL-52218 gradereport_grader: fixed 'grade:viewhidden' related errors There were two main reasons why there were PHP errors. 1) We were not passing variables as references. 2) When we were restricting the number of items shown in the report we were not collecting all of the dependencies which were required when a user did *not* have the capability 'moodle/grade:viewhidden'. This would cause an undefined offset error due to the index missing in the dependency array. This also meant that a user without the capability 'moodle/grade:viewhidden' could view the course total without hidden items being taken into account if they were not being displayed. To resolve this we now pass all the grades and grade items when the user does not have the capability - which also solves the PHP errors listed above. --- grade/report/grader/lib.php | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/grade/report/grader/lib.php b/grade/report/grader/lib.php index aba460fb9e0..0900392a807 100644 --- a/grade/report/grader/lib.php +++ b/grade/report/grader/lib.php @@ -38,6 +38,13 @@ class grade_report_grader extends grade_report { */ public $grades; + /** + * Contains all the grades for the course - even the ones not displayed in the grade tree. + * + * @var array $allgrades + */ + private $allgrades; + /** * Array of errors for bulk grades updating. * @var array $gradeserror @@ -538,8 +545,10 @@ class grade_report_grader extends grade_report { if ($grades = $DB->get_records_sql($sql, $params)) { foreach ($grades as $graderec) { + $grade = new grade_grade($graderec, false); + $this->allgrades[$graderec->userid][$graderec->itemid] = $grade; if (in_array($graderec->userid, $userids) and array_key_exists($graderec->itemid, $this->gtree->get_items())) { // some items may not be present!! - $this->grades[$graderec->userid][$graderec->itemid] = new grade_grade($graderec, false); + $this->grades[$graderec->userid][$graderec->itemid] = $grade; $this->grades[$graderec->userid][$graderec->itemid]->grade_item = $this->gtree->get_item($graderec->itemid); // db caching } } @@ -553,6 +562,8 @@ class grade_report_grader extends grade_report { $this->grades[$userid][$itemid]->itemid = $itemid; $this->grades[$userid][$itemid]->userid = $userid; $this->grades[$userid][$itemid]->grade_item = $this->gtree->get_item($itemid); // db caching + + $this->allgrades[$userid][$itemid] = $this->grades[$userid][$itemid]; } } } @@ -887,13 +898,23 @@ class grade_report_grader extends grade_report { } $jsscales = $scalesarray; + // Get all the grade items if the user can not view hidden grade items. + // It is possible that the user is simply viewing the 'Course total' by switching to the 'Aggregates only' view + // and that this user does not have the ability to view hidden items. In this case we still need to pass all the + // grade items (in case one has been hidden) as the course total shown needs to be adjusted for this particular + // user. + if (!$this->canviewhidden) { + $allgradeitems = grade_item::fetch_all(array('courseid' => $this->courseid)); + } + foreach ($this->users as $userid => $user) { if ($this->canviewhidden) { $altered = array(); $unknown = array(); } else { - $hidingaffected = grade_grade::get_hiding_affected($this->grades[$userid], $this->gtree->get_items()); + $usergrades = $this->allgrades[$userid]; + $hidingaffected = grade_grade::get_hiding_affected($usergrades, $allgradeitems); $altered = $hidingaffected['altered']; $unknown = $hidingaffected['unknown']; unset($hidingaffected);