From 2ea5b0bb876753d34def2356b9cd0f96490cf17a Mon Sep 17 00:00:00 2001 From: Aaron Barnes <aaronb@catalyst.net.nz> Date: Tue, 21 Aug 2012 13:07:57 +1200 Subject: [PATCH] MDL-30020 blocks/completion: Some criteria do not display complete Also includes a spruce up of the code --- .../block_completionstatus.php | 29 ++- blocks/completionstatus/details.php | 245 ++++++++++-------- .../lang/en/block_completionstatus.php | 1 + 3 files changed, 147 insertions(+), 128 deletions(-) diff --git a/blocks/completionstatus/block_completionstatus.php b/blocks/completionstatus/block_completionstatus.php index 2b598ce767f..b339e9a74cd 100644 --- a/blocks/completionstatus/block_completionstatus.php +++ b/blocks/completionstatus/block_completionstatus.php @@ -19,15 +19,14 @@ * * @package block * @subpackage completion - * @copyright 2009 Catalyst IT Ltd + * @copyright 2009-2012 Catalyst IT Ltd * @author Aaron Barnes <aaronb@catalyst.net.nz> * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') || die(); - -require_once($CFG->libdir.'/completionlib.php'); +require_once("{$CFG->libdir}/completionlib.php"); /** * Course completion status @@ -36,25 +35,28 @@ require_once($CFG->libdir.'/completionlib.php'); class block_completionstatus extends block_base { public function init() { - $this->title = get_string('pluginname', 'block_completionstatus'); + $this->title = get_string('pluginname', 'block_completionstatus'); } public function get_content() { - global $USER, $CFG, $DB, $COURSE; + global $USER; // 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 = new stdClass(); // Can edit settings? - $can_edit = has_capability('moodle/course:update', context_course::instance($this->page->course->id)); + $can_edit = has_capability('moodle/course:update', $context); // Get course completion data - $info = new completion_info($this->page->course); + $info = new completion_info($course); // Don't display if completion isn't enabled! if (!completion_info::is_enabled_for_site()) { @@ -84,9 +86,9 @@ class block_completionstatus extends block_base { // 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', context_course::instance($COURSE->id))) { - $this->content->text = '<a href="'.$CFG->wwwroot.'/report/completion/index.php?course='.$COURSE->id. - '">'.get_string('viewcoursereport', 'completion').'</a>'; + if (has_capability('report/completion:view', $context)) { + $report = new moodle_url('/report/completion/index.php', array('course' => $course->id)); + $this->content->text = '<a href="'.$report->out().'">'.get_string('viewcoursereport', 'completion').'</a>'; return $this->content; } @@ -187,7 +189,7 @@ class block_completionstatus extends block_base { // Load course completion $params = array( 'userid' => $USER->id, - 'course' => $COURSE->id + 'course' => $course->id ); $ccompletion = new completion_completion($params); @@ -221,7 +223,8 @@ class block_completionstatus extends block_base { $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>'; + $details = new moodle_url('/blocks/completionstatus/details.php', array('course' => $course->id)); + $this->content->footer = '<br><a href="'.$details->out().'">'.get_string('moredetails', 'completion').'</a>'; return $this->content; } diff --git a/blocks/completionstatus/details.php b/blocks/completionstatus/details.php index a71da02635a..bb1b051562f 100644 --- a/blocks/completionstatus/details.php +++ b/blocks/completionstatus/details.php @@ -19,27 +19,23 @@ * * @package block * @subpackage completion - * @copyright 2009 Catalyst IT Ltd + * @copyright 2009-2012 Catalyst IT Ltd * @author Aaron Barnes <aaronb@catalyst.net.nz> * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ -require_once('../../config.php'); -require_once($CFG->libdir.'/completionlib.php'); - - -// TODO: Make this page Moodle 2.0 compliant +require_once(dirname(__FILE__).'/../../config.php'); +require_once("{$CFG->libdir}/completionlib.php"); /// /// Load data /// $id = required_param('course', PARAM_INT); -// User id $userid = optional_param('user', 0, PARAM_INT); // Load course -$course = $DB->get_record('course', array('id' => $id)); +$course = $DB->get_record('course', array('id' => $id), '*', MUST_EXIST); // Load user if ($userid) { @@ -76,21 +72,13 @@ if (!$can_view) { // Load completion data $info = new completion_info($course); -$returnurl = "{$CFG->wwwroot}/course/view.php?id={$id}"; +$returnurl = new moodle_url('/course/view.php', array('id' => $id)); // Don't display if completion isn't enabled! if (!$info->is_enabled()) { print_error('completionnotenabled', 'completion', $returnurl); } -// Load criteria to display -$completions = $info->get_completions($user->id); - -// Check if this course has any criteria -if (empty($completions)) { - print_error('nocriteriaset', 'completion', $returnurl); -} - // Check this user is enroled if (!$info->is_tracked_user($user->id)) { if ($USER->id == $user->id) { @@ -104,6 +92,7 @@ if (!$info->is_tracked_user($user->id)) { /// /// Display page /// +$PAGE->set_context(context_course::instance($course->id)); // Print header $page = get_string('completionprogressdetails', 'block_completionstatus'); @@ -111,7 +100,7 @@ $title = format_string($course->fullname) . ': ' . $page; $PAGE->navbar->add($page); $PAGE->set_pagelayout('standard'); -$PAGE->set_url('/blocks/completionstatus/details.php', array('course' => $course->id)); +$PAGE->set_url('/blocks/completionstatus/details.php', array('course' => $course->id, 'user' => $user->id)); $PAGE->set_title(get_string('course') . ': ' . $course->fullname); $PAGE->set_heading($title); echo $OUTPUT->header(); @@ -135,122 +124,148 @@ $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) { +} else if (!$criteriacomplete && !$ccompletion->timestarted) { echo '<i>'.get_string('notyetstarted', 'completion').'</i>'; } else { echo '<i>'.get_string('inprogress','completion').'</i>'; } echo '</td></tr>'; -echo '<tr><td colspan="2"><b>'.get_string('required').':</b> '; -// Get overall aggregation method -$overall = $info->get_aggregation_method(); +// Load criteria to display +$completions = $info->get_completions($user->id); -if ($overall == COMPLETION_AGGREGATION_ALL) { - echo get_string('criteriarequiredall', 'completion'); +// Check if this course has any criteria +if (empty($completions)) { + echo '<tr><td colspan="2"><br />'; + echo $OUTPUT->box(get_string('err_nocriteria', 'completion'), 'noticebox'); + echo '</td></tr></tbody></table>'; } else { - echo get_string('criteriarequiredany', 'completion'); -} + echo '<tr><td colspan="2"><b>'.get_string('required').':</b> '; -echo '</td></tr></tbody></table>'; + // Get overall aggregation method + $overall = $info->get_aggregation_method(); -// Generate markup for criteria statuses -echo '<table class="generalbox boxaligncenter" cellpadding="3"><tbody>'; -echo '<tr class="ccheader">'; -echo '<th class="c0 header" scope="col">'.get_string('criteriagroup', 'block_completionstatus').'</th>'; -echo '<th class="c1 header" scope="col">'.get_string('criteria', 'completion').'</th>'; -echo '<th class="c2 header" scope="col">'.get_string('requirement', 'block_completionstatus').'</th>'; -echo '<th class="c3 header" scope="col">'.get_string('status').'</th>'; -echo '<th class="c4 header" scope="col">'.get_string('complete').'</th>'; -echo '<th class="c5 header" scope="col">'.get_string('completiondate', 'report_completion').'</th>'; -echo '</tr>'; - -// Save row data -$rows = array(); - -global $COMPLETION_CRITERIA_TYPES; - -// Loop through course criteria -foreach ($completions as $completion) { - $criteria = $completion->get_criteria(); - $complete = $completion->is_complete(); - - $row = array(); - $row['type'] = $criteria->criteriatype; - $row['title'] = $criteria->get_title(); - $row['status'] = $completion->get_status(); - $row['timecompleted'] = $completion->timecompleted; - $row['details'] = $criteria->get_details($completion); - $rows[] = $row; -} - -// Print table -$last_type = ''; -$agg_type = false; - -foreach ($rows as $row) { - - // Criteria group - echo '<td class="c0">'; - if ($last_type !== $row['details']['type']) { - $last_type = $row['details']['type']; - echo $last_type; - - // Reset agg type - $agg_type = true; + if ($overall == COMPLETION_AGGREGATION_ALL) { + echo get_string('criteriarequiredall', 'completion'); } else { - // Display aggregation type - if ($agg_type) { - $agg = $info->get_aggregation_method($row['type']); - - echo '(<i>'; - - if ($agg == COMPLETION_AGGREGATION_ALL) { - echo strtolower(get_string('all', 'completion')); - } else { - echo strtolower(get_string('any', 'completion')); - } - - echo '</i> '.strtolower(get_string('required')).')'; - $agg_type = false; - } + echo get_string('criteriarequiredany', 'completion'); } - echo '</td>'; - // Criteria title - echo '<td class="c1">'; - echo $row['details']['criteria']; - echo '</td>'; + echo '</td></tr></tbody></table>'; - // Requirement - echo '<td class="c2">'; - echo $row['details']['requirement']; - echo '</td>'; - - // Status - echo '<td class="c3">'; - echo $row['details']['status']; - echo '</td>'; - - // Is complete - echo '<td class="c4">'; - echo ($row['status'] === get_string('yes')) ? get_string('yes') : get_string('no'); - echo '</td>'; - - // Completion data - echo '<td class="c5">'; - if ($row['timecompleted']) { - echo userdate($row['timecompleted'], '%e %B %G'); - } else { - echo '-'; - } - echo '</td>'; + // Generate markup for criteria statuses + echo '<table class="generalbox logtable boxaligncenter" id="criteriastatus" width="100%"><tbody>'; + echo '<tr class="ccheader">'; + echo '<th class="c0 header" scope="col">'.get_string('criteriagroup', 'block_completionstatus').'</th>'; + echo '<th class="c1 header" scope="col">'.get_string('criteria', 'completion').'</th>'; + echo '<th class="c2 header" scope="col">'.get_string('requirement', 'block_completionstatus').'</th>'; + echo '<th class="c3 header" scope="col">'.get_string('status').'</th>'; + echo '<th class="c4 header" scope="col">'.get_string('complete').'</th>'; + echo '<th class="c5 header" scope="col">'.get_string('completiondate', 'report_completion').'</th>'; echo '</tr>'; + + // Save row data + $rows = array(); + + // Loop through course criteria + foreach ($completions as $completion) { + $criteria = $completion->get_criteria(); + + $row = array(); + $row['type'] = $criteria->criteriatype; + $row['title'] = $criteria->get_title(); + $row['status'] = $completion->get_status(); + $row['complete'] = $completion->is_complete(); + $row['timecompleted'] = $completion->timecompleted; + $row['details'] = $criteria->get_details($completion); + $rows[] = $row; + } + + // Print table + $last_type = ''; + $agg_type = false; + $oddeven = 0; + + foreach ($rows as $row) { + + echo '<tr class="r' . $oddeven . '">'; + + // Criteria group + echo '<td class="cell c0">'; + if ($last_type !== $row['details']['type']) { + $last_type = $row['details']['type']; + echo $last_type; + + // Reset agg type + $agg_type = true; + } else { + // Display aggregation type + if ($agg_type) { + $agg = $info->get_aggregation_method($row['type']); + + echo '(<i>'; + + if ($agg == COMPLETION_AGGREGATION_ALL) { + echo strtolower(get_string('aggregateall', 'completion')); + } else { + echo strtolower(get_string('aggregateany', 'completion')); + } + + echo '</i> '.strtolower(get_string('required')).')'; + $agg_type = false; + } + } + echo '</td>'; + + // Criteria title + echo '<td class="cell c1">'; + echo $row['details']['criteria']; + echo '</td>'; + + // Requirement + echo '<td class="cell c2">'; + echo $row['details']['requirement']; + echo '</td>'; + + // Status + echo '<td class="cell c3">'; + echo $row['details']['status']; + echo '</td>'; + + // Is complete + echo '<td class="cell c4">'; + echo $row['complete'] ? get_string('yes') : get_string('no'); + echo '</td>'; + + // Completion data + echo '<td class="cell c5">'; + if ($row['timecompleted']) { + echo userdate($row['timecompleted'], get_string('strftimedate', 'langconfig')); + } else { + echo '-'; + } + echo '</td>'; + echo '</tr>'; + // for row striping + $oddeven = $oddeven ? 0 : 1; + } + + echo '</tbody></table>'; } -echo '</tbody></table>'; +echo '<div class="buttons">'; +$courseurl = new moodle_url("/course/view.php", array('id' => $course->id)); +echo $OUTPUT->single_button($courseurl, get_string('returntocourse', 'block_completionstatus'), 'get'); +echo '</div>'; echo $OUTPUT->footer(); diff --git a/blocks/completionstatus/lang/en/block_completionstatus.php b/blocks/completionstatus/lang/en/block_completionstatus.php index fcc965ac7fd..6658c17dff4 100644 --- a/blocks/completionstatus/lang/en/block_completionstatus.php +++ b/blocks/completionstatus/lang/en/block_completionstatus.php @@ -5,3 +5,4 @@ $string['criteriagroup'] = 'Criteria group'; $string['firstofsecond'] = '{$a->first} of {$a->second}'; $string['pluginname'] = 'Course completion status'; $string['requirement'] = 'Requirement'; +$string['returntocourse'] = 'Return to course';