mirror of
https://github.com/moodle/moodle.git
synced 2025-01-18 22:08:20 +01:00
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:
parent
e65dfd9f28
commit
20180b3167
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user