Permalink
Browse files

MDL-38559 Reorganise course completion settings form

This is a result of a pretty intensive effort to make the form less
sucky, given the completion strings mess around. It partially solves
MDL-39419 too as it clarifies the course completion link in the course
administration block.

I must admit and record here that I'm pretty desperate by the current
state of the core_completion and how strings from it are inconsistently
used at various places with different meanings. For example the 'Completion
tracking' may mean the mode of how activities are tracked within the
course as well as the overall feature of course and activities tracking.
While a same phrase can be used in English for both this meanings, not
all languages have such luck and translating it is a pain in the ass.

Finally, let me give the credit for wording and UI design suggestions to
Helen Foster and all others who helped with this. This has been one of
the most ugliest forms in Moodle and we believe we made it better
(although we know it's far from perfect).
  • Loading branch information...
1 parent b3b13e9 commit 6e5a473c479bfcd5f3b2cde9a965a812e5da9320 @mudrd8mz mudrd8mz committed May 6, 2013
@@ -59,7 +59,8 @@ public static function fetch($params) {
*/
public function config_form_display(&$mform, $data = null) {
$mform->addElement('checkbox', 'criteria_date', get_string('enable'));
- $mform->addElement('date_selector', 'criteria_date_value', get_string('afterspecifieddate', 'completion'));
+ $mform->addElement('date_selector', 'criteria_date_value', get_string('completionondatevalue', 'core_completion'));
+ $mform->disabledIf('criteria_date_value', 'criteria_date');
// If instance of criteria exists
if ($this->id) {
@@ -61,12 +61,32 @@ public function config_form_display(&$mform, $data = null) {
$mform->addElement('checkbox', 'criteria_duration', get_string('enable'));
- $thresholdmenu=array();
- for ($i=1; $i<=30; $i++) {
- $seconds = $i * 86400;
- $thresholdmenu[$seconds] = get_string('numdays', '', $i);
+ // Populate the duration length drop down.
+ $thresholdmenu = array(
+ // We have strings for 1 - 6 days in the core.
+ 86400 => get_string('secondstotime86400', 'core'),
+ 172800 => get_string('secondstotime172800', 'core'),
+ 259200 => get_string('secondstotime259200', 'core'),
+ 345600 => get_string('secondstotime345600', 'core'),
+ 432000 => get_string('secondstotime432000', 'core'),
+ 518400 => get_string('secondstotime518400', 'core'),
+ 518400 => get_string('secondstotime518400', 'core'),
+ );
+ // Append strings for 7 - 30 days (step by 1 day).
+ for ($i = 7; $i <= 30; $i++) {
+ $seconds = $i * DAYSECS;
+ $thresholdmenu[$seconds] = get_string('numdays', 'core', $i);
}
- $mform->addElement('select', 'criteria_duration_days', get_string('daysafterenrolment', 'completion'), $thresholdmenu);
+ // Append strings for 40 - 180 days (step by 10 days).
+ for ($i = 40; $i <= 180; $i = $i + 10) {
+ $seconds = $i * DAYSECS;
+ $thresholdmenu[$seconds] = get_string('numdays', 'core', $i);
+ }
+ // Append string for 1 year.
+ $thresholdmenu[365 * DAYSECS] = get_string('numdays', 'core', 365);
+
+ $mform->addElement('select', 'criteria_duration_days', get_string('enrolmentdurationlength', 'core_completion'), $thresholdmenu);
+ $mform->disabledIf('criteria_duration_days', 'criteria_duration');
if ($this->id) {
$mform->setDefault('criteria_duration', 1);
@@ -63,9 +63,9 @@ public static function fetch($params) {
public function config_form_display(&$mform, $data = null) {
$mform->addElement('checkbox', 'criteria_grade', get_string('enable'));
$mform->addElement('text', 'criteria_grade_value', get_string('graderequired', 'completion'));
+ $mform->disabledIf('criteria_grade_value', 'criteria_grade');
$mform->setType('criteria_grade_value', PARAM_RAW); // Uses unformat_float.
$mform->setDefault('criteria_grade_value', format_float($data));
- $mform->addElement('static', 'criteria_grade_value_note', '', get_string('criteriagradenote', 'completion'));
if ($this->id) {
$mform->setDefault('criteria_grade', 1);
@@ -58,7 +58,7 @@ public static function fetch($params) {
* @param stdClass $data Form data
*/
public function config_form_display(&$mform, $data = null) {
- $mform->addElement('checkbox', 'criteria_unenrol', get_string('completiononunenrolment','completion'));
+ $mform->addElement('checkbox', 'criteria_unenrol', get_string('enable'));
if ($this->id) {
$mform->setDefault('criteria_unenrol', 1);
View
@@ -61,12 +61,68 @@ public function definition() {
$aggregation_methods = $completion->get_aggregation_methods();
// Overall criteria aggregation.
- $mform->addElement('header', 'overallcriteria', get_string('overallcriteriaaggregation', 'completion'));
- $mform->addElement('select', 'overall_aggregation', get_string('aggregationmethod', 'completion'), $aggregation_methods);
+ $mform->addElement('header', 'overallcriteria', get_string('general', 'core_form'));
+ // Map aggregation methods to context-sensitive human readable dropdown menu.
+ $overallaggregationmenu = array();
+ foreach ($aggregation_methods as $methodcode => $methodname) {
+ if ($methodcode === COMPLETION_AGGREGATION_ALL) {
+ $overallaggregationmenu[COMPLETION_AGGREGATION_ALL] = get_string('overallaggregation_all', 'core_completion');
+ } else if ($methodcode === COMPLETION_AGGREGATION_ANY) {
+ $overallaggregationmenu[COMPLETION_AGGREGATION_ANY] = get_string('overallaggregation_any', 'core_completion');
+ } else {
+ $overallaggregationmenu[$methodcode] = $methodname;
+ }
+ }
+ $mform->addElement('select', 'overall_aggregation', get_string('overallaggregation', 'core_completion'), $overallaggregationmenu);
$mform->setDefault('overall_aggregation', $completion->get_aggregation_method());
+ // Activity completion criteria
+ $label = get_string('coursecompletioncondition', 'core_completion', get_string('activitiescompleted', 'core_completion'));
+ $mform->addElement('header', 'activitiescompleted', $label);
+ // Get the list of currently specified conditions and expand the section if some are found.
+ $current = $completion->get_criteria(COMPLETION_CRITERIA_TYPE_ACTIVITY);
+ if (!empty($current)) {
+ $mform->setExpanded('activitiescompleted');
+ }
+
+ $activities = $completion->get_activities();
+ if (!empty($activities)) {
+
+ foreach ($activities as $activity) {
+ $params_a = array('moduleinstance' => $activity->id);
+ $criteria = new completion_criteria_activity(array_merge($params, $params_a));
+ $criteria->config_form_display($mform, $activity);
+ }
+ $mform->addElement('static', 'criteria_role_note', '', get_string('activitiescompletednote', 'core_completion'));
+
+ if (count($activities) > 1) {
+ // Map aggregation methods to context-sensitive human readable dropdown menu.
+ $activityaggregationmenu = array();
+ foreach ($aggregation_methods as $methodcode => $methodname) {
+ if ($methodcode === COMPLETION_AGGREGATION_ALL) {
+ $activityaggregationmenu[COMPLETION_AGGREGATION_ALL] = get_string('activityaggregation_all', 'core_completion');
+ } else if ($methodcode === COMPLETION_AGGREGATION_ANY) {
+ $activityaggregationmenu[COMPLETION_AGGREGATION_ANY] = get_string('activityaggregation_any', 'core_completion');
+ } else {
+ $activityaggregationmenu[$methodcode] = $methodname;
+ }
+ }
+ $mform->addElement('select', 'activity_aggregation', get_string('activityaggregation', 'core_completion'), $activityaggregationmenu);
+ $mform->setDefault('activity_aggregation', $completion->get_aggregation_method(COMPLETION_CRITERIA_TYPE_ACTIVITY));
+ }
+
+ } else {
+ $mform->addElement('static', 'noactivities', '', get_string('err_noactivities', 'completion'));
+ }
+
// Course prerequisite completion criteria.
- $mform->addElement('header', 'courseprerequisites', get_string('completiondependencies', 'completion'));
+ $label = get_string('coursecompletioncondition', 'core_completion', get_string('dependenciescompleted', 'core_completion'));
+ $mform->addElement('header', 'courseprerequisites', $label);
+ // Get the list of currently specified conditions and expand the section if some are found.
+ $current = $completion->get_criteria(COMPLETION_CRITERIA_TYPE_COURSE);
+ if (!empty($current)) {
+ $mform->setExpanded('courseprerequisites');
+ }
// Get applicable courses (prerequisites).
$courses = $DB->get_records_sql("
@@ -78,11 +134,6 @@ public function definition() {
AND c.id <> {$course->id}");
if (!empty($courses)) {
- if (count($courses) > 1) {
- $mform->addElement('select', 'course_aggregation', get_string('aggregationmethod', 'completion'), $aggregation_methods);
- $mform->setDefault('course_aggregation', $completion->get_aggregation_method(COMPLETION_CRITERIA_TYPE_COURSE));
- }
-
// Get category list.
require_once($CFG->libdir. '/coursecatlib.php');
$list = coursecat::make_categories_list();
@@ -110,77 +161,120 @@ public function definition() {
// Explain list.
$mform->addElement('static', 'criteria_courses_explaination', '', get_string('coursesavailableexplaination', 'completion'));
- } else {
- $mform->addElement('static', 'nocourses', '', get_string('err_nocourses', 'completion'));
- }
-
- // Manual self completion
- $mform->addElement('header', 'manualselfcompletion', get_string('manualselfcompletion', 'completion'));
- $criteria = new completion_criteria_self($params);
- $criteria->config_form_display($mform);
-
- // Role completion criteria
- $mform->addElement('header', 'roles', get_string('manualcompletionby', 'completion'));
-
- $roles = get_roles_with_capability('moodle/course:markcomplete', CAP_ALLOW, context_course::instance($course->id, IGNORE_MISSING));
-
- if (!empty($roles)) {
- $mform->addElement('select', 'role_aggregation', get_string('aggregationmethod', 'completion'), $aggregation_methods);
- $mform->setDefault('role_aggregation', $completion->get_aggregation_method(COMPLETION_CRITERIA_TYPE_ROLE));
-
- foreach ($roles as $role) {
- $params_a = array('role' => $role->id);
- $criteria = new completion_criteria_role(array_merge($params, $params_a));
- $criteria->config_form_display($mform, $role);
- }
- } else {
- $mform->addElement('static', 'noroles', '', get_string('err_noroles', 'completion'));
- }
-
- // Activity completion criteria
- $mform->addElement('header', 'activitiescompleted', get_string('activitiescompleted', 'completion'));
-
- $activities = $completion->get_activities();
- if (!empty($activities)) {
- if (count($activities) > 1) {
- $mform->addElement('select', 'activity_aggregation', get_string('aggregationmethod', 'completion'), $aggregation_methods);
- $mform->setDefault('activity_aggregation', $completion->get_aggregation_method(COMPLETION_CRITERIA_TYPE_ACTIVITY));
+ if (count($courses) > 1) {
+ // Map aggregation methods to context-sensitive human readable dropdown menu.
+ $courseaggregationmenu = array();
+ foreach ($aggregation_methods as $methodcode => $methodname) {
+ if ($methodcode === COMPLETION_AGGREGATION_ALL) {
+ $courseaggregationmenu[COMPLETION_AGGREGATION_ALL] = get_string('courseaggregation_all', 'core_completion');
+ } else if ($methodcode === COMPLETION_AGGREGATION_ANY) {
+ $courseaggregationmenu[COMPLETION_AGGREGATION_ANY] = get_string('courseaggregation_any', 'core_completion');
+ } else {
+ $courseaggregationmenu[$methodcode] = $methodname;
+ }
+ }
+ $mform->addElement('select', 'course_aggregation', get_string('courseaggregation', 'core_completion'), $courseaggregationmenu);
+ $mform->setDefault('course_aggregation', $completion->get_aggregation_method(COMPLETION_CRITERIA_TYPE_COURSE));
}
- foreach ($activities as $activity) {
- $params_a = array('moduleinstance' => $activity->id);
- $criteria = new completion_criteria_activity(array_merge($params, $params_a));
- $criteria->config_form_display($mform, $activity);
- }
} else {
- $mform->addElement('static', 'noactivities', '', get_string('err_noactivities', 'completion'));
+ $mform->addElement('static', 'nocourses', '', get_string('err_nocourses', 'completion'));
}
// Completion on date
- $mform->addElement('header', 'date', get_string('date'));
+ $label = get_string('coursecompletioncondition', 'core_completion', get_string('completionondate', 'core_completion'));
+ $mform->addElement('header', 'date', $label);
+ // Expand the condition section if it is currently enabled.
+ $current = $completion->get_criteria(COMPLETION_CRITERIA_TYPE_DATE);
+ if (!empty($current)) {
+ $mform->setExpanded('date');
+ }
$criteria = new completion_criteria_date($params);
$criteria->config_form_display($mform);
// Completion after enrolment duration
- $mform->addElement('header', 'duration', get_string('durationafterenrolment', 'completion'));
+ $label = get_string('coursecompletioncondition', 'core_completion', get_string('enrolmentduration', 'core_completion'));
+ $mform->addElement('header', 'duration', $label);
+ // Expand the condition section if it is currently enabled.
+ $current = $completion->get_criteria(COMPLETION_CRITERIA_TYPE_DURATION);
+ if (!empty($current)) {
+ $mform->setExpanded('duration');
+ }
$criteria = new completion_criteria_duration($params);
$criteria->config_form_display($mform);
- // Completion on course grade
- $mform->addElement('header', 'grade', get_string('coursegrade', 'completion'));
+ // Completion on unenrolment
+ $label = get_string('coursecompletioncondition', 'core_completion', get_string('unenrolment', 'core_completion'));
+ $mform->addElement('header', 'unenrolment', $label);
+ // Expand the condition section if it is currently enabled.
+ $current = $completion->get_criteria(COMPLETION_CRITERIA_TYPE_UNENROL);
+ if (!empty($current)) {
+ $mform->setExpanded('unenrolment');
+ }
+ $criteria = new completion_criteria_unenrol($params);
+ $criteria->config_form_display($mform);
- // Grade enable and passing grade
+ // Completion on course grade
+ $label = get_string('coursecompletioncondition', 'core_completion', get_string('coursegrade', 'core_completion'));
+ $mform->addElement('header', 'grade', $label);
+ // Expand the condition section if it is currently enabled.
+ $current = $completion->get_criteria(COMPLETION_CRITERIA_TYPE_GRADE);
+ if (!empty($current)) {
+ $mform->setExpanded('grade');
+ }
$course_grade = $DB->get_field('grade_items', 'gradepass', array('courseid' => $course->id, 'itemtype' => 'course'));
if (!$course_grade) {
$course_grade = '0.00000';
}
$criteria = new completion_criteria_grade($params);
$criteria->config_form_display($mform, $course_grade);
- // Completion on unenrolment
- $mform->addElement('header', 'unenrolment', get_string('unenrolment', 'completion'));
- $criteria = new completion_criteria_unenrol($params);
+ // Manual self completion
+ $label = get_string('coursecompletioncondition', 'core_completion', get_string('manualselfcompletion', 'core_completion'));
+ $mform->addElement('header', 'manualselfcompletion', $label);
+ // Expand the condition section if it is currently enabled.
+ $current = $completion->get_criteria(COMPLETION_CRITERIA_TYPE_SELF);
+ if (!empty($current)) {
+ $mform->setExpanded('manualselfcompletion');
+ }
+ $criteria = new completion_criteria_self($params);
$criteria->config_form_display($mform);
+ $mform->addElement('static', 'criteria_self_note', '', get_string('manualselfcompletionnote', 'core_completion'));
+
+ // Role completion criteria
+ $label = get_string('coursecompletioncondition', 'core_completion', get_string('manualcompletionby', 'core_completion'));
+ $mform->addElement('header', 'roles', $label);
+ // Expand the condition section if it is currently enabled.
+ $current = $completion->get_criteria(COMPLETION_CRITERIA_TYPE_ROLE);
+ if (!empty($current)) {
+ $mform->setExpanded('roles');
+ }
+ $roles = get_roles_with_capability('moodle/course:markcomplete', CAP_ALLOW, context_course::instance($course->id, IGNORE_MISSING));
+
+ if (!empty($roles)) {
+ foreach ($roles as $role) {
+ $params_a = array('role' => $role->id);
+ $criteria = new completion_criteria_role(array_merge($params, $params_a));
+ $criteria->config_form_display($mform, $role);
+ }
+ $mform->addElement('static', 'criteria_role_note', '', get_string('manualcompletionbynote', 'core_completion'));
+ // Map aggregation methods to context-sensitive human readable dropdown menu.
+ $roleaggregationmenu = array();
+ foreach ($aggregation_methods as $methodcode => $methodname) {
+ if ($methodcode === COMPLETION_AGGREGATION_ALL) {
+ $roleaggregationmenu[COMPLETION_AGGREGATION_ALL] = get_string('roleaggregation_all', 'core_completion');
+ } else if ($methodcode === COMPLETION_AGGREGATION_ANY) {
+ $roleaggregationmenu[COMPLETION_AGGREGATION_ANY] = get_string('roleaggregation_any', 'core_completion');
+ } else {
+ $roleaggregationmenu[$methodcode] = $methodname;
+ }
+ }
+ $mform->addElement('select', 'role_aggregation', get_string('roleaggregation', 'core_completion'), $roleaggregationmenu);
+ $mform->setDefault('role_aggregation', $completion->get_aggregation_method(COMPLETION_CRITERIA_TYPE_ROLE));
+
+ } else {
+ $mform->addElement('static', 'noroles', '', get_string('err_noroles', 'completion'));
+ }
// Add common action buttons.
$this->add_action_buttons();
Oops, something went wrong.

0 comments on commit 6e5a473

Please sign in to comment.