From acdc8e8a9c66b3ddb0cb6735963e94044abdbe72 Mon Sep 17 00:00:00 2001 From: nicolasconnault Date: Tue, 24 Jul 2007 14:26:05 +0000 Subject: [PATCH] MDL-10550 Refactoring, fixing a few bugs in edit/item_form.php and more work into the outcome report --- grade/edit/item_form.php | 13 ++++++---- grade/report/grader/lib.php | 12 ++-------- grade/report/outcomes/index.php | 42 ++++++++++++++++++++------------- lang/en_utf8/grades.php | 2 ++ lib/grade/grade_outcome.php | 15 +++++++++++- lib/grade/grade_scale.php | 22 +++++++++++++++++ 6 files changed, 74 insertions(+), 32 deletions(-) diff --git a/grade/edit/item_form.php b/grade/edit/item_form.php index 9a588353d9..057b14f331 100644 --- a/grade/edit/item_form.php +++ b/grade/edit/item_form.php @@ -17,17 +17,20 @@ class edit_item_form extends moodleform { // allow setting of outcomes on module items too $options = array(0=>get_string('usenooutcome', 'grades')); - if ($outcomes = grade_outcome::fetch_all(array('courseid'=>$COURSE->id))) { + + if ($outcomes = grade_outcome::fetch_all(array('courseid'=>$COURSE->id), true)) { foreach ($outcomes as $outcome) { - $options[$scale->id] = $outcome->get_name(); + $options[$outcome->id] = $outcome->get_name(); } } + $mform->addElement('select', 'outcomeid', get_string('outcome', 'grades'), $options); $options = array(GRADE_TYPE_NONE=>get_string('typenone', 'grades'), - GRADE_TYPE_VALUE=>get_string('typevalue', 'grades'), - GRADE_TYPE_SCALE=>get_string('typescale', 'grades'), - GRADE_TYPE_TEXT=>get_string('typetext', 'grades')); + GRADE_TYPE_VALUE=>get_string('typevalue', 'grades'), + GRADE_TYPE_SCALE=>get_string('typescale', 'grades'), + GRADE_TYPE_TEXT=>get_string('typetext', 'grades')); + $mform->addElement('select', 'gradetype', get_string('gradetype', 'grades'), $options); $mform->setDefault('gradetype', GRADE_TYPE_VALUE); diff --git a/grade/report/grader/lib.php b/grade/report/grader/lib.php index 64f58b05d9..b3d6cfb93c 100644 --- a/grade/report/grader/lib.php +++ b/grade/report/grader/lib.php @@ -783,16 +783,8 @@ class grade_report_grader extends grade_report { } $scaleval = round($this->get_grade_clean($finalavg, $decimalpoints)); - $scales_array = get_records_list('scale', 'id', $item->scaleid); - $scale = $scales_array[$item->scaleid]; - $scales = explode(",", $scale->scale); - - // this could be a 0 when summed and rounded, e.g, 1, no grade, no grade, no grade - if ($scaleval < 1) { - $scaleval = 1; - } - - $gradehtml = $scales[$scaleval-1]; + $scale_object = new grade_scale(array('id' => $item->scaleid), false); + $gradehtml = $scale_object->get_nearest_item($scaleval); $rawvalue = $scaleval; } else { $gradeval = $this->get_grade_clean($sum/$count_array[$item->id], $decimalpoints); diff --git a/grade/report/outcomes/index.php b/grade/report/outcomes/index.php index d662ecbbb5..17c0d86ef3 100644 --- a/grade/report/outcomes/index.php +++ b/grade/report/outcomes/index.php @@ -74,6 +74,7 @@ foreach ($outcomes as $outcomeid => $outcome) { $html = '' . "\n"; $html .= ''; +$html .= ''; $html .= ''; $html .= ''; $html .= ''; @@ -81,46 +82,55 @@ $html .= '' . "\n"; foreach ($report_info as $outcomeid => $outcomedata) { $rowspan = count($outcomedata['items']); - $html .= '\n"; + $shortname_html = '\n"; $sitewide = get_string('no'); if (empty($outcomedata['outcome']->courseid)) { $sitewide = get_string('yes'); } - $html .= '\n"; + $sitewide_html = '\n"; + + $outcomedata['outcome']->sum = 0; + $scale = new grade_scale(array('id' => $outcomedata['outcome']->scaleid), false); $print_tr = false; + $items_html = ''; + if (is_array($outcomedata['items'])) { foreach ($outcomedata['items'] as $itemid => $item) { if ($print_tr) { - $html .= ''; + $items_html .= "\n"; } $cm = get_coursemodule_from_instance($item->itemmodule, $item->iteminstance, $item->courseid); $itemname = ''.$item->itemname.''; - // Obtain nearest scale item from average - $scales_array = get_records_list('scale', 'id', $outcomedata['outcome']->scaleid); - $scale = $scales_array[$outcomedata['outcome']->scaleid]; - $scales = explode(",", $scale->scale); - - // this could be a 0 when summed and rounded, e.g, 1, no grade, no grade, no grade - if ($item->avg < 1) { - $item->avg = 1; - } - - $gradehtml = $scales[$item->avg-1]; + $outcomedata['outcome']->sum += $item->avg; + $gradehtml = $scale->get_nearest_item($item->avg); - $html .= "\n"; + $items_html .= "\n"; $print_tr = true; } } else { - $html .= ""; + $items_html .= "\n"; + } + + // Calculate outcome average + if (is_array($outcomedata['items'])) { + $avg = $outcomedata['outcome']->sum / count($outcomedata['items']); + $avg_html = $scale->get_nearest_item($avg) . " (" . round($avg, 2) . ")\n"; + } else { + $avg_html = ' - '; } + + $outcomeavg_html = '\n"; + + $html .= $shortname_html . $outcomeavg_html . $sitewide_html . $items_html; } + $html .= '
' . get_string('outcomename', 'grades') . '' . get_string('overallavg', 'grades') . '' . get_string('sitewide', 'grades') . '' . get_string('activities', 'grades') . '' . get_string('average', 'grades') . '' . get_string('numberofgrades', 'grades') . '
' . $outcomedata['outcome']->shortname . "
' . $outcomedata['outcome']->shortname . "' . $sitewide . "' . $sitewide . "
$itemname$gradehtml ($item->avg)$item->count
$itemname$gradehtml ($item->avg)$item->count
- - 0 - - 0
' . $avg_html . "
'; echo $html; print_footer($course); diff --git a/lang/en_utf8/grades.php b/lang/en_utf8/grades.php index c0afb32281..5d20f62fbd 100644 --- a/lang/en_utf8/grades.php +++ b/lang/en_utf8/grades.php @@ -217,10 +217,12 @@ $string['numberofgrades'] = 'Number of grades'; $string['onascaleof'] = ' on a scale of $a->grademin to $a->grademax'; $string['operations'] = 'Operations'; $string['outcome'] = 'Outcome'; +$string['outcomes'] = 'Outcomes'; $string['outcomename'] = 'Outcome name'; $string['outcomereport'] = 'Outcome report'; $string['outcomes'] = 'Outcomes'; $string['overridden'] = 'Overridden'; +$string['overallavg'] = 'Overall average'; $string['pctoftotalgrade'] = '%% of total grade'; $string['percent'] = 'Percent'; $string['percentage'] = 'Percentage'; diff --git a/lib/grade/grade_outcome.php b/lib/grade/grade_outcome.php index b49cea09fa..b18b24e996 100644 --- a/lib/grade/grade_outcome.php +++ b/lib/grade/grade_outcome.php @@ -103,10 +103,23 @@ class grade_outcome extends grade_object { * @static * * @param array $params associative arrays varname=>value + * @param bool $fetch_sitewide_outcomes Whether or not to also fetch all sitewide outcomes (with no courseid) * @return array array of grade_outcome insatnces or false if none found. */ - function fetch_all($params) { + function fetch_all($params, $fetch_sitewide_outcomes=false) { + global $CFG; + if ($outcomes = grade_object::fetch_all_helper('grade_outcomes', 'grade_outcome', $params)) { + // Fetch sitewide outcomes if requested + if ($fetch_sitewide_outcomes) { + $sitewide_outcomes = array(); + $records = get_records_sql("SELECT * FROM {$CFG->prefix}grade_outcomes WHERE courseid IS NULL"); + foreach ($records as $outcomeid => $outcome) { + $sitewide_outcomes[$outcomeid] = new grade_outcome($outcome, false); + } + $outcomes = array_merge($sitewide_outcomes, $outcomes); + } + foreach ($outcomes as $key=>$value) { if (!empty($outcomes[$key]->scaleid)) { $outcomes[$key]->scale = new grade_scale(array('id'=>$outcomes[$key]->scaleid)); diff --git a/lib/grade/grade_scale.php b/lib/grade/grade_scale.php index e21a4f0fed..51ee8ca760 100644 --- a/lib/grade/grade_scale.php +++ b/lib/grade/grade_scale.php @@ -147,5 +147,27 @@ class grade_scale extends grade_object { return $this->scale; } + + /** + * When called on a loaded scale object (with a valid id) and given a float grade between + * the grademin and grademax, this method returns the scale item that falls closest to the + * float given (which is usually an average of several grades on a scale). If the float falls + * below 1 but above 0, it will be rounded up to 1. + * @param float $grade + * @return string + */ + function get_nearest_item($grade) { + // Obtain nearest scale item from average + $scales_array = get_records_list('scale', 'id', $this->id); + $scale = $scales_array[$this->id]; + $scales = explode(",", $scale->scale); + + // this could be a 0 when summed and rounded, e.g, 1, no grade, no grade, no grade + if ($grade < 1) { + $grade = 1; + } + + return $scales[$grade-1]; + } } ?> -- 2.39.5