Пример #1
0
    function execute($data, $row, $user, $courseid, $starttime = 0, $endtime = 0) {
        global $DB, $CFG;

        require_once("{$CFG->libdir}/completionlib.php");

        $course = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST);

        $info = new completion_info($course);

        // Is course complete?
        $coursecomplete = $info->is_course_complete($row->id);

        // Load course completion.
        $params = array(
            'userid' => $row->id,
            'course' => $course->id
        );
        $ccompletion = new completion_completion($params);

        // Has this user completed any criteria?
        $criteriacomplete = $info->count_course_user_data($row->id);

        $content = "";
        if ($coursecomplete) {
            $content .= get_string('complete');
        } else if (!$criteriacomplete && !$ccompletion->timestarted) {
            $content .= html_writer::tag('i', get_string('notyetstarted', 'completion'));
        } else {
            $content .= html_writer::tag('i', get_string('inprogress', 'completion'));
        }
        return $content;
    }
Пример #2
0
if ($USER->id != $user->id) {
    echo html_writer::start_tag('tr');
    echo html_writer::start_tag('td', array('colspan' => '2'));
    echo html_writer::tag('b', get_string('showinguser', 'completion'));
    $url = new moodle_url('/user/view.php', array('id' => $user->id, 'course' => $course->id));
    echo html_writer::link($url, fullname($user));
    echo html_writer::end_tag('td');
    echo html_writer::end_tag('tr');
}
echo html_writer::start_tag('tr');
echo html_writer::start_tag('td', array('colspan' => '2'));
echo html_writer::tag('b', get_string('status'));
// Is course complete?
$coursecomplete = $info->is_course_complete($user->id);
// Has this user completed any criteria?
$criteriacomplete = $info->count_course_user_data($user->id);
// Load course completion.
$params = array('userid' => $user->id, 'course' => $course->id);
$ccompletion = new completion_completion($params);
if ($coursecomplete) {
    echo get_string('complete');
} else {
    if (!$criteriacomplete && !$ccompletion->timestarted) {
        echo html_writer::tag('i', get_string('notyetstarted', 'completion'));
    } else {
        echo html_writer::tag('i', get_string('inprogress', 'completion'));
    }
}
echo html_writer::end_tag('td');
echo html_writer::end_tag('tr');
// Load criteria to display.
 public function get_content()
 {
     global $USER, $CFG, $DB, $COURSE;
     // If content is cached
     if ($this->content !== NULL) {
         return $this->content;
     }
     // Create empty content
     $this->content = new stdClass();
     // Can edit settings?
     $can_edit = has_capability('moodle/course:update', get_context_instance(CONTEXT_COURSE, $this->page->course->id));
     // Get course completion data
     $info = new completion_info($this->page->course);
     // Don't display if completion isn't enabled!
     if (!completion_info::is_enabled_for_site()) {
         if ($can_edit) {
             $this->content->text = get_string('completionnotenabledforsite', 'completion');
         }
         return $this->content;
     } else {
         if (!$info->is_enabled()) {
             if ($can_edit) {
                 $this->content->text = get_string('completionnotenabledforcourse', 'completion');
             }
             return $this->content;
         }
     }
     // Load criteria to display
     $completions = $info->get_completions($USER->id);
     // Check if this course has any criteria
     if (empty($completions)) {
         if ($can_edit) {
             $this->content->text = get_string('nocriteriaset', 'completion');
         }
         return $this->content;
     }
     // Check this user is enroled
     if (!$info->is_tracked_user($USER->id)) {
         // If not enrolled, but are can view the report:
         if (has_capability('report/completion:view', get_context_instance(CONTEXT_COURSE, $COURSE->id))) {
             $this->content->text = '<a href="' . $CFG->wwwroot . '/report/completion/index.php?course=' . $COURSE->id . '">' . get_string('viewcoursereport', 'completion') . '</a>';
             return $this->content;
         }
         // Otherwise, show error
         $this->content->text = get_string('notenroled', 'completion');
         return $this->content;
     }
     // Generate markup for criteria statuses
     $shtml = '';
     // For aggregating activity completion
     $activities = array();
     $activities_complete = 0;
     // For aggregating course prerequisites
     $prerequisites = array();
     $prerequisites_complete = 0;
     // Flag to set if current completion data is inconsistent with
     // what is stored in the database
     $pending_update = false;
     // Loop through course criteria
     foreach ($completions as $completion) {
         $criteria = $completion->get_criteria();
         $complete = $completion->is_complete();
         if (!$pending_update && $criteria->is_pending($completion)) {
             $pending_update = true;
         }
         // Activities are a special case, so cache them and leave them till last
         if ($criteria->criteriatype == COMPLETION_CRITERIA_TYPE_ACTIVITY) {
             $activities[$criteria->moduleinstance] = $complete;
             if ($complete) {
                 $activities_complete++;
             }
             continue;
         }
         // Prerequisites are also a special case, so cache them and leave them till last
         if ($criteria->criteriatype == COMPLETION_CRITERIA_TYPE_COURSE) {
             $prerequisites[$criteria->courseinstance] = $complete;
             if ($complete) {
                 $prerequisites_complete++;
             }
             continue;
         }
         $shtml .= '<tr><td>';
         $shtml .= $criteria->get_title();
         $shtml .= '</td><td style="text-align: right">';
         $shtml .= $completion->get_status();
         $shtml .= '</td></tr>';
     }
     // Aggregate activities
     if (!empty($activities)) {
         $shtml .= '<tr><td>';
         $shtml .= get_string('activitiescompleted', 'completion');
         $shtml .= '</td><td style="text-align: right">';
         $a = new stdClass();
         $a->first = $activities_complete;
         $a->second = count($activities);
         $shtml .= get_string('firstofsecond', 'block_completionstatus', $a);
         $shtml .= '</td></tr>';
     }
     // Aggregate prerequisites
     if (!empty($prerequisites)) {
         $phtml = '<tr><td>';
         $phtml .= get_string('prerequisitescompleted', 'completion');
         $phtml .= '</td><td style="text-align: right">';
         $a = new stdClass();
         $a->first = $prerequisites_complete;
         $a->second = count($prerequisites);
         $shtml .= get_string('firstofsecond', 'block_completionstatus', $a);
         $phtml .= '</td></tr>';
         $shtml = $phtml . $shtml;
     }
     // Display completion status
     $this->content->text = '<table width="100%" style="font-size: 90%;"><tbody>';
     $this->content->text .= '<tr><td colspan="2"><b>' . get_string('status') . ':</b> ';
     // Is course complete?
     $coursecomplete = $info->is_course_complete($USER->id);
     // Load course completion
     $params = array('userid' => $USER->id, 'course' => $COURSE->id);
     $ccompletion = new completion_completion($params);
     // Has this user completed any criteria?
     $criteriacomplete = $info->count_course_user_data($USER->id);
     if ($pending_update) {
         $this->content->text .= '<i>' . get_string('pending', 'completion') . '</i>';
     } else {
         if ($coursecomplete) {
             $this->content->text .= get_string('complete');
         } else {
             if (!$criteriacomplete && !$ccompletion->timestarted) {
                 $this->content->text .= '<i>' . get_string('notyetstarted', 'completion') . '</i>';
             } else {
                 $this->content->text .= '<i>' . get_string('inprogress', 'completion') . '</i>';
             }
         }
     }
     $this->content->text .= '</td></tr>';
     $this->content->text .= '<tr><td colspan="2">';
     // Get overall aggregation method
     $overall = $info->get_aggregation_method();
     if ($overall == COMPLETION_AGGREGATION_ALL) {
         $this->content->text .= get_string('criteriarequiredall', 'completion');
     } else {
         $this->content->text .= get_string('criteriarequiredany', 'completion');
     }
     $this->content->text .= ':</td></tr>';
     $this->content->text .= '<tr><td><b>' . get_string('requiredcriteria', 'completion') . '</b></td><td style="text-align: right"><b>' . get_string('status') . '</b></td></tr>';
     $this->content->text .= $shtml . '</tbody></table>';
     // Display link to detailed view
     $this->content->footer = '<br><a href="' . $CFG->wwwroot . '/blocks/completionstatus/details.php?course=' . $COURSE->id . '">' . get_string('moredetails', 'completion') . '</a>';
     return $this->content;
 }
 public function get_content()
 {
     global $USER;
     $rows = array();
     $srows = array();
     $prows = array();
     // If content is cached.
     if ($this->content !== null) {
         return $this->content;
     }
     $course = $this->page->course;
     $context = context_course::instance($course->id);
     // Create empty content.
     $this->content = new stdClass();
     $this->content->text = '';
     $this->content->footer = '';
     // Can edit settings?
     $can_edit = has_capability('moodle/course:update', $context);
     // Get course completion data.
     $info = new completion_info($course);
     // Don't display if completion isn't enabled!
     if (!completion_info::is_enabled_for_site()) {
         if ($can_edit) {
             $this->content->text .= get_string('completionnotenabledforsite', 'completion');
         }
         return $this->content;
     } else {
         if (!$info->is_enabled()) {
             if ($can_edit) {
                 $this->content->text .= get_string('completionnotenabledforcourse', 'completion');
             }
             return $this->content;
         }
     }
     // Load criteria to display.
     $completions = $info->get_completions($USER->id);
     // Check if this course has any criteria.
     if (empty($completions)) {
         if ($can_edit) {
             $this->content->text .= get_string('nocriteriaset', 'completion');
         }
         return $this->content;
     }
     // Check this user is enroled.
     if ($info->is_tracked_user($USER->id)) {
         // Generate markup for criteria statuses.
         $data = '';
         // For aggregating activity completion.
         $activities = array();
         $activities_complete = 0;
         // For aggregating course prerequisites.
         $prerequisites = array();
         $prerequisites_complete = 0;
         // Flag to set if current completion data is inconsistent with what is stored in the database.
         $pending_update = false;
         // Loop through course criteria.
         foreach ($completions as $completion) {
             $criteria = $completion->get_criteria();
             $complete = $completion->is_complete();
             if (!$pending_update && $criteria->is_pending($completion)) {
                 $pending_update = true;
             }
             // Activities are a special case, so cache them and leave them till last.
             if ($criteria->criteriatype == COMPLETION_CRITERIA_TYPE_ACTIVITY) {
                 $activities[$criteria->moduleinstance] = $complete;
                 if ($complete) {
                     $activities_complete++;
                 }
                 continue;
             }
             // Prerequisites are also a special case, so cache them and leave them till last.
             if ($criteria->criteriatype == COMPLETION_CRITERIA_TYPE_COURSE) {
                 $prerequisites[$criteria->courseinstance] = $complete;
                 if ($complete) {
                     $prerequisites_complete++;
                 }
                 continue;
             }
             $row = new html_table_row();
             $row->cells[0] = new html_table_cell($criteria->get_title());
             $row->cells[1] = new html_table_cell($completion->get_status());
             $row->cells[1]->style = 'text-align: right;';
             $srows[] = $row;
         }
         // Aggregate activities.
         if (!empty($activities)) {
             $a = new stdClass();
             $a->first = $activities_complete;
             $a->second = count($activities);
             $row = new html_table_row();
             $row->cells[0] = new html_table_cell(get_string('activitiescompleted', 'completion'));
             $row->cells[1] = new html_table_cell(get_string('firstofsecond', 'block_completionstatus', $a));
             $row->cells[1]->style = 'text-align: right;';
             $srows[] = $row;
         }
         // Aggregate prerequisites.
         if (!empty($prerequisites)) {
             $a = new stdClass();
             $a->first = $prerequisites_complete;
             $a->second = count($prerequisites);
             $row = new html_table_row();
             $row->cells[0] = new html_table_cell(get_string('dependenciescompleted', 'completion'));
             $row->cells[1] = new html_table_cell(get_string('firstofsecond', 'block_completionstatus', $a));
             $row->cells[1]->style = 'text-align: right;';
             $prows[] = $row;
             $srows = array_merge($prows, $srows);
         }
         // Display completion status.
         $table = new html_table();
         $table->width = '100%';
         $table->attributes = array('style' => 'font-size: 90%;', 'class' => '');
         $row = new html_table_row();
         $content = html_writer::tag('b', get_string('status') . ': ');
         // Is course complete?
         $coursecomplete = $info->is_course_complete($USER->id);
         // Load course completion.
         $params = array('userid' => $USER->id, 'course' => $course->id);
         $ccompletion = new completion_completion($params);
         // Has this user completed any criteria?
         $criteriacomplete = $info->count_course_user_data($USER->id);
         if ($pending_update) {
             $content .= html_writer::tag('i', get_string('pending', 'completion'));
         } else {
             if ($coursecomplete) {
                 $content .= get_string('complete');
             } else {
                 if (!$criteriacomplete && !$ccompletion->timestarted) {
                     $content .= html_writer::tag('i', get_string('notyetstarted', 'completion'));
                 } else {
                     $content .= html_writer::tag('i', get_string('inprogress', 'completion'));
                 }
             }
         }
         $row->cells[0] = new html_table_cell($content);
         $row->cells[0]->colspan = '2';
         $rows[] = $row;
         $row = new html_table_row();
         $content = "";
         // Get overall aggregation method.
         $overall = $info->get_aggregation_method();
         if ($overall == COMPLETION_AGGREGATION_ALL) {
             $content .= get_string('criteriarequiredall', 'completion');
         } else {
             $content .= get_string('criteriarequiredany', 'completion');
         }
         $content .= ':';
         $row->cells[0] = new html_table_cell($content);
         $row->cells[0]->colspan = '2';
         $rows[] = $row;
         $row = new html_table_row();
         $row->cells[0] = new html_table_cell(html_writer::tag('b', get_string('requiredcriteria', 'completion')));
         $row->cells[1] = new html_table_cell(html_writer::tag('b', get_string('status')));
         $row->cells[1]->style = 'text-align: right;';
         $rows[] = $row;
         // Array merge $rows and $data here.
         $rows = array_merge($rows, $srows);
         $table->data = $rows;
         $this->content->text .= html_writer::table($table);
         // Display link to detailed view.
         $details = new moodle_url('/blocks/completionstatus/details.php', array('course' => $course->id));
         $this->content->footer .= html_writer::link($details, get_string('moredetails', 'completion'));
     } else {
         // If user is not enrolled, show error.
         $this->content->text = get_string('nottracked', 'completion');
     }
     if (has_capability('report/completion:view', $context)) {
         $report = new moodle_url('/report/completion/index.php', array('course' => $course->id));
         if (empty($this->content->footer)) {
             $this->content->footer = '';
         }
         $this->content->footer .= html_writer::empty_tag('br');
         $this->content->footer .= html_writer::link($report, get_string('viewcoursereport', 'completion'));
     }
     return $this->content;
 }
    public function get_content()
    {
        global $USER, $CFG, $DB, $COURSE;
        if ($this->content !== null) {
            return $this->content;
        }
        $this->content = new stdClass();
        $courses1 = enrol_get_my_courses('', 'visible DESC,sortorder ASC');
        //defined in lib/enrollib.php file
        // Display completion status
        $this->content->text .= '<table cellpadding="0" cellspacing="0" width="178" border="0">';
        $this->content->text .= '<tr>';
        $this->content->text .= '<td width="85" align="right"><b>Total</b>';
        $this->content->text .= '</td><td align="left"><b>Over</b>';
        $this->content->text .= '</td><td align="left"><b>%</b>';
        $this->content->text .= '</td></tr></table>';
        $this->content->text .= '<table cellpadding="0" cellspacing="0" width="178" border="0">';
        foreach ($courses1 as $course1) {
            if ($course1->id == SITEID) {
                continue;
            }
            $userid = optional_param('user', 0, PARAM_INT);
            // Load course
            $course = $DB->get_record('course', array('id' => $course1->id));
            // Load user
            if ($userid) {
                $user = $DB->get_record('user', array('id' => $userid), '*', MUST_EXIST);
            } else {
                $user = $USER;
            }
            $coursecontext = get_context_instance(CONTEXT_COURSE, $course->id);
            $personalcontext = get_context_instance(CONTEXT_USER, $user->id);
            $can_view = false;
            // Can view own report
            if ($USER->id == $user->id) {
                $can_view = true;
            } else {
                if (has_capability('moodle/user:viewuseractivitiesreport', $personalcontext)) {
                    $can_view = true;
                } else {
                    if (has_capability('coursereport/completion:view', $coursecontext)) {
                        $can_view = true;
                    } else {
                        if (has_capability('coursereport/completion:view', $personalcontext)) {
                            $can_view = true;
                        }
                    }
                }
            }
            if (!$can_view) {
                $this->content->text .= print_error('cannotviewreport');
            }
            // Load completion data
            $info = new completion_info($course);
            // Load criteria to display
            $completions = $info->get_completions($user->id);
            // Check this user is enroled
            if (!$info->is_tracked_user($user->id)) {
                if ($USER->id == $user->id) {
                    $this->content->text .= print_error('notenroled', 'completion', $returnurl);
                } else {
                    $this->content->text .= print_error('usernotenroled', 'completion', $returnurl);
                }
            }
            // Is course complete?
            $coursecomplete = $info->is_course_complete($user->id);
            // Has this user completed any criteria?
            $criteriacomplete = $info->count_course_user_data($user->id);
            if ($coursecomplete) {
                $status = get_string('complete');
            } else {
                if (!$criteriacomplete) {
                    $status = '<i>' . get_string('notyetstarted', 'completion') . '</i>';
                } else {
                    $status = '<i>' . get_string('inprogress', 'completion') . '</i>';
                }
            }
            //GET TOTAL NUMBER OF TASKS ASSIGNED TO CURRENT USER
            $conditions = array("course" => $course->id);
            $tot_rec = $DB->count_records('course_completion_criteria', $conditions);
            //GET TOTAL NUMBER OF TASKS ASSIGNED TO CURRENT USER
            $result = $DB->get_records_sql('SELECT mc.coursemoduleid,mc.userid,mc.completionstate,
				m.id,m.course FROM `mdl_course_modules_completion` mc 
				LEFT JOIN 
				mdl_course_modules m
				ON
				mc.coursemoduleid=m.id WHERE mc.userid = ? AND m.course = ?', array($user->id, $course->id));
            $tot_comp = count($result);
            $count1 = $tot_comp / $tot_rec;
            $count2 = $count1 * 100;
            $count = number_format($count2, 0);
            $linkhref = new moodle_url('/course/view.php', array('id' => $course->id));
            $this->content->text .= '<tr><td colspan="4"><b title="Course" style="color:#000066;">';
            $this->content->text .= '<a href="' . $linkhref . '">' . $course1->fullname . '</a>';
            $this->content->text .= '</b></td></tr>';
            $this->content->text .= '<tr><td align="left" width="70" title="Activity completion status">';
            //$this->content->text .=$course1->fullname;
            $this->content->text .= $status;
            $this->content->text .= '</td><td align="left" width="27" title="Total activities">' . $tot_rec;
            $this->content->text .= '</td><td width="27" align="left" title="Total Activities completed">' . $tot_comp;
            $this->content->text .= '</td><td width="26" align="right" title="Activities completed(%)">' . $count . '%';
            $this->content->text .= '</td></tr>';
        }
        $this->content->text .= '</table>';
        //$this->content->footer .= 'Footer here...';
        return $this->content;
    }
 /**
  * Get user information
  *
  * @param string $username EBS username, could be 8-digit int or string.
  * @return array An array describing targets (and metadata) for that user for all leapcore_* courses.
  */
 public static function get_targets_by_username($username)
 {
     global $CFG, $DB;
     $params = self::validate_parameters(self::get_targets_by_username_parameters(), array('username' => $username));
     if ($params['username'] == '') {
         header($_SERVER["SERVER_PROTOCOL"] . ' 422 Unprocessable Entity ($params[\'username\'] empty.)', true, 422);
         exit(1);
     }
     // Require for the course completion code.
     require_once $CFG->libdir . '/completionlib.php';
     // Could do with knowing what this user's {user}.id is.
     $sql = "SELECT id from {user} WHERE username LIKE ?;";
     if (!($user = $DB->get_record_sql($sql, array($params['username'] . '%')))) {
         header($_SERVER["SERVER_PROTOCOL"] . ' 422 Unprocessable Entity ($params[\'username\'] could not be matched against a valid user.)', true, 422);
         exit(1);
     }
     $cores = array('core' => 'leapcore_core', 'english' => 'leapcore_english', 'maths' => 'leapcore_maths', 'ppd' => 'leapcore_ppd', 'test' => 'leapcore_test', 'a2_artdes' => 'leapcore_a2_artdes', 'a2_artdesphoto' => 'leapcore_a2_artdesphoto', 'a2_artdestext' => 'leapcore_a2_artdestext', 'a2_biology' => 'leapcore_a2_biology', 'a2_busstud' => 'leapcore_a2_busstud', 'a2_chemistry' => 'leapcore_a2_chemistry', 'a2_englishlang' => 'leapcore_a2_englishlang', 'a2_englishlit' => 'leapcore_a2_englishlit', 'a2_envsci' => 'leapcore_a2_envsci', 'a2_envstud' => 'leapcore_a2_envstud', 'a2_filmstud' => 'leapcore_a2_filmstud', 'a2_geography' => 'leapcore_a2_geography', 'a2_govpoli' => 'leapcore_a2_govpoli', 'a2_history' => 'leapcore_a2_history', 'a2_humanbiology' => 'leapcore_a2_humanbiology', 'a2_law' => 'leapcore_a2_law', 'a2_maths' => 'leapcore_a2_maths', 'a2_mathsfurther' => 'leapcore_a2_mathsfurther', 'a2_media' => 'leapcore_a2_media', 'a2_philosophy' => 'leapcore_a2_philosophy', 'a2_physics' => 'leapcore_a2_physics', 'a2_psychology' => 'leapcore_a2_psychology', 'a2_sociology' => 'leapcore_a2_sociology', 'btecex_applsci' => 'leapcore_btecex_applsci', 'gcse_english' => 'leapcore_gcse_english', 'gcse_maths' => 'leapcore_gcse_maths');
     // Define the target's names.
     $targets = array('TAG', 'L3VA', 'MAG');
     $courses = array();
     foreach ($cores as $core => $coresql) {
         $courses[$core]['leapcore'] = $core;
         // Checking for user enrolled as student role, manual enrolments only.
         $sql = "SELECT DISTINCT c.id AS courseid, c.shortname AS shortname, c.fullname AS fullname, username\n                FROM mdl_user u\n                    JOIN mdl_user_enrolments ue ON ue.userid = u.id\n                    JOIN mdl_enrol e ON e.id = ue.enrolid\n                        -- AND e.enrol = 'manual'\n                    JOIN mdl_role_assignments ra ON ra.userid = u.id\n                    JOIN mdl_context ct ON ct.id = ra.contextid\n                        AND ct.contextlevel = 50\n                    JOIN mdl_course c ON c.id = ct.instanceid\n                        AND e.courseid = c.id\n                    JOIN mdl_role r ON r.id = ra.roleid\n                        AND r.shortname = 'student'\n                WHERE c.idnumber LIKE '%|" . $coresql . "|%'\n                    AND u.username LIKE '" . $params['username'] . "%'\n                    AND e.status = 0\n                    AND u.suspended = 0\n                    AND u.deleted = 0\n                    AND (\n                        ue.timeend = 0\n                        OR ue.timeend > NOW()\n                    )\n                    AND ue.status = 0;";
         // There is potential here for a user to have more than one 'leapcore_core' course, but it's pretty unlikely.
         // We probably need to handle this better (at the moment the below function expects 0 or 1 results and fails).
         if (!($result = $DB->get_record_sql($sql))) {
             unset($courses[$core]);
             continue;
         } else {
             $courses[$core]['course_shortname'] = $result->shortname;
             $courses[$core]['course_fullname'] = $result->fullname;
             $courses[$core]['course_id'] = $result->courseid;
         }
         // Walk through a fair few objects to get the course's time modified, final grade and named grade.
         $gi = new grade_item();
         // The course item is actually the right one to use, even if it is null.
         $gi_item = $gi::fetch(array('courseid' => $courses[$core]['course_id'], 'itemtype' => 'course'));
         // This may get changed further down the script as we want the most recently changed item's date.
         $courses[$core]['course_total_modified'] = $gi_item->timemodified;
         $gg = new grade_grade();
         $gg_grade = $gg::fetch(array('itemid' => $gi_item->id, 'userid' => $user->id));
         // If the scale is going to be a U (or Refer, or Fail etc) as the L3VA is 0, pass null.
         if ($gg_grade && $gg_grade->finalgrade > 0) {
             $courses[$core]['course_total'] = $gg_grade->finalgrade;
             $gs = new grade_scale();
             $gs_scale = $gs::fetch(array('id' => $gi_item->scaleid));
             if ($gi_item->display != 0) {
                 // Check first for a non-zero 'display' variable, and run with that if found.
                 $courses[$core]['course_total_display'] = grade_format_gradevalue($gg_grade->finalgrade, $gi_item, true, $gi_item->display);
             } else {
                 if ($gs_scale) {
                     // See if we have a scale and use that if found.
                     $courses[$core]['course_total_display'] = $gs_scale->get_nearest_item($gg_grade->finalgrade);
                 } else {
                     if (is_numeric($gg_grade->finalgrade)) {
                         $courses[$core]['course_total_display'] = round($courses[$core]['course_total'], 0, PHP_ROUND_HALF_UP);
                     } else {
                         $courses[$core]['course_total_display'] = $courses[$core]['course_total'];
                     }
                 }
             }
         } else {
             $courses[$core]['course_total'] = 0;
             $courses[$core]['course_total_display'] = null;
         }
         // For each target, same as above.
         foreach ($targets as $target) {
             $gi = new grade_item();
             $gi_item = $gi::fetch(array('courseid' => $courses[$core]['course_id'], 'itemtype' => 'manual', 'itemname' => $target));
             $gg = new grade_grade();
             $gg_grade = $gg::fetch(array('itemid' => $gi_item->id, 'userid' => $user->id));
             $courses[$core][strtolower($target)] = $gg_grade->finalgrade;
             // Get the named result (e.g. 'merit') only for targets which are not L3VA.
             if ($target != 'L3VA') {
                 $gs = new grade_scale();
                 $gs_scale = $gs::fetch(array('id' => $gi_item->scaleid));
                 // Updating the most recently modified date if it's newer.
                 if ($gi_item->timemodified > $courses[$core]['course_total_modified']) {
                     $courses[$core]['course_total_modified'] = $gi_item->timemodified;
                 }
                 // If the scale is going to be a U (or Refer, or Fail etc) as the L3VA is 0, pass null.
                 if ($gg_grade->finalgrade > 0) {
                     // If there's no scale, just pass the data across.
                     if ($gs_scale) {
                         $courses[$core][strtolower($target) . '_display'] = $gs_scale->get_nearest_item($gg_grade->finalgrade);
                     } else {
                         $courses[$core][strtolower($target) . '_display'] = $gg_grade->finalgrade;
                     }
                 } else {
                     $courses[$core][strtolower($target) . '_display'] = null;
                 }
             } else {
                 $courses[$core][strtolower($target) . '_display'] = $courses[$core][strtolower($target)];
             }
             // Rounding.
             if (is_numeric($courses[$core][strtolower($target) . '_display'])) {
                 $courses[$core][strtolower($target) . '_display'] = round($courses[$core][strtolower($target) . '_display'], 2, PHP_ROUND_HALF_UP);
             }
         }
         // Default both of these to null.
         $courses[$core]['course_completion_total'] = null;
         $courses[$core]['course_completion_completed'] = null;
         // We could do with a course object to use.
         $sql = "SELECT id from {course} WHERE id LIKE ?;";
         if (!($thiscourse = $DB->get_record_sql($sql, array($courses[$core]['course_id'])))) {
             exit(1);
         }
         if (completion_info::is_enabled_for_site()) {
             $info = new completion_info($thiscourse);
             $completions = $info->get_completions($user->id);
             // If there's no completions, none have been configured so do nothing.
             if (!empty($completions)) {
                 $courses[$core]['course_completion_total'] = count($completions);
                 $courses[$core]['course_completion_completed'] = $info->count_course_user_data($user->id);
                 // Loop through each timecompleted value, ignore if null, update if more recent.
                 foreach ($completions as $completion) {
                     if (!is_null($completion->timecompleted) && $completion->timecompleted > $courses[$core]['course_total_modified']) {
                         $courses[$core]['course_total_modified'] = $completion->timecompleted;
                     }
                 }
             }
         }
         // END completion info enabled for site check.
         // Stress reduction code.
         $courses[$core]['meaning_of_life'] = '42';
         $courses[$core]['smiley_face'] = ':)';
         // Incomplete course check.
         // TODO: make this better. We scan through all four 'leapcore_' tags (and all the new A2 ones) and get the results,
         // but sometimes there aren't any.  So for the tags with no associated courses, we remove them.
         if (!isset($courses[$core]['course_shortname'])) {
             unset($courses[$core]);
         }
     }
     // END foreach $courses.
     if (!empty($courses)) {
         return $courses;
     }
 }