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.
This commit is contained in:
Mark Nelson 2016-01-07 19:34:19 +08:00
parent e65dfd9f28
commit 20180b3167

View File

@ -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);