From 7e93539cf624ba9a95308fcfeaf54acc246d42ec Mon Sep 17 00:00:00 2001 From: Jake Dallimore Date: Wed, 22 Aug 2018 16:20:36 +0800 Subject: [PATCH] MDL-36255 core_grade: fix to ensure correct context used for filters Some grade object (outcomes,scales) can be created at site or course context, so this patch just makes sure we use the respective context when applying format_string to the name in the get_name() function. --- grade/edit/scale/index.php | 7 ++++--- lib/datalib.php | 10 ++++++---- lib/grade/grade_category.php | 2 ++ lib/grade/grade_outcome.php | 4 +++- lib/grade/grade_scale.php | 4 +++- 5 files changed, 18 insertions(+), 9 deletions(-) diff --git a/grade/edit/scale/index.php b/grade/edit/scale/index.php index 30b2ef835a7..a16bd9187a6 100644 --- a/grade/edit/scale/index.php +++ b/grade/edit/scale/index.php @@ -92,7 +92,8 @@ switch ($action) { 'sesskey' => sesskey(), 'deleteconfirmed'=> 1)); - echo $OUTPUT->confirm(get_string('scaleconfirmdelete', 'grades', $scale->name), $confirmurl, "index.php?id={$courseid}"); + echo $OUTPUT->confirm(get_string('scaleconfirmdelete', 'grades', $scale->get_name()), $confirmurl, + "index.php?id={$courseid}"); echo $OUTPUT->footer(); die; } else { @@ -115,7 +116,7 @@ if ($courseid and $scales = grade_scale::fetch_all_local($courseid)) { $data = array(); foreach($scales as $scale) { $line = array(); - $line[] = format_string($scale->name).'
'.str_replace(",",", ",$scale->scale).'
'; + $line[] = $scale->get_name() .'
'.str_replace(",", ", ", $scale->scale).'
'; $used = $scale->is_used(); $line[] = $used ? get_string('yes') : get_string('no'); @@ -141,7 +142,7 @@ if ($scales = grade_scale::fetch_all_global()) { $data = array(); foreach($scales as $scale) { $line = array(); - $line[] = format_string($scale->name).'
'.str_replace(",",", ",$scale->scale).'
'; + $line[] = $scale->get_name().'
'.str_replace(",", ", ", $scale->scale).'
'; $used = $scale->is_used(); $line[] = $used ? get_string('yes') : get_string('no'); diff --git a/lib/datalib.php b/lib/datalib.php index 8d8bfae9704..ad64468ad48 100644 --- a/lib/datalib.php +++ b/lib/datalib.php @@ -1172,16 +1172,18 @@ function get_my_remotehosts() { function get_scales_menu($courseid=0) { global $DB; - $sql = "SELECT id, name + $sql = "SELECT id, name, courseid FROM {scale} WHERE courseid = 0 or courseid = ? ORDER BY courseid ASC, name ASC"; $params = array($courseid); $scales = array(); - $results = $DB->get_records_sql_menu($sql, $params); - foreach ($results as $i => $scalename) { - $scales[$i] = format_string($scalename, false, array("context" => context_course::instance($courseid))); + $results = $DB->get_records_sql($sql, $params); + foreach ($results as $index => $record) { + $context = empty($record->courseid) ? context_system::instance() : context_course::instance($record->courseid); + $scales[$index] = format_string($record->name, false, ["context" => $context]); } + // Format: [id => 'scale name']. return $scales; } diff --git a/lib/grade/grade_category.php b/lib/grade/grade_category.php index 9fc1abd7eb6..a668f23be59 100644 --- a/lib/grade/grade_category.php +++ b/lib/grade/grade_category.php @@ -2312,6 +2312,8 @@ class grade_category extends grade_object { return format_string($course->fullname, false, array("context" => context_course::instance($this->courseid))); } else { + // Grade categories can't be set up at system context (unlike scales and outcomes) + // We therefore must have a courseid, and don't need to handle system contexts when filtering. return format_string($this->fullname, false, array("context" => context_course::instance($this->courseid))); } } diff --git a/lib/grade/grade_outcome.php b/lib/grade/grade_outcome.php index 3ba3fab5342..064cdd160cb 100644 --- a/lib/grade/grade_outcome.php +++ b/lib/grade/grade_outcome.php @@ -276,7 +276,9 @@ class grade_outcome extends grade_object { * @return string name */ public function get_name() { - return format_string($this->fullname, false, array("context" => context_course::instance($this->courseid))); + // Grade outcomes can be created at site or course context, so set the filter context appropriately. + $context = empty($this->courseid) ? context_system::instance() : context_course::instance($this->courseid); + return format_string($this->fullname, false, ["context" => $context]); } /** diff --git a/lib/grade/grade_scale.php b/lib/grade/grade_scale.php index 0ad3b0a47c4..6a94d78898f 100644 --- a/lib/grade/grade_scale.php +++ b/lib/grade/grade_scale.php @@ -214,7 +214,9 @@ class grade_scale extends grade_object { * @return string name */ public function get_name() { - return format_string($this->name); + // Grade scales can be created at site or course context, so set the filter context appropriately. + $context = empty($this->courseid) ? context_system::instance() : context_course::instance($this->courseid); + return format_string($this->name, false, ['context' => $context]); } /**