3 // This file is part of Moodle - http://moodle.org/
5 // Moodle is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
10 // Moodle is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
15 // You should have received a copy of the GNU General Public License
16 // along with Moodle. If not, see <http://www.gnu.org/licenses/>.
19 * This file contains the activity completion criteria type class and any
20 * supporting functions it may require.
22 * @package core_completion
23 * @category completion
24 * @copyright 2009 Catalyst IT Ltd
25 * @author Aaron Barnes <aaronb@catalyst.net.nz>
26 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
29 defined('MOODLE_INTERNAL') ||
die();
32 * Course completion critieria - completion on activity completion
34 * @package core_completion
35 * @category completion
36 * @copyright 2009 Catalyst IT Ltd
37 * @author Aaron Barnes <aaronb@catalyst.net.nz>
38 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
40 class completion_criteria_activity
extends completion_criteria
{
42 /* @var int Criteria [COMPLETION_CRITERIA_TYPE_ACTIVITY] */
43 public $criteriatype = COMPLETION_CRITERIA_TYPE_ACTIVITY
;
46 * Finds and returns a data_object instance based on params.
48 * @param array $params associative arrays varname=>value
49 * @return completion_criteria_activity data_object instance or false if none found.
51 public static function fetch($params) {
52 $params['criteriatype'] = COMPLETION_CRITERIA_TYPE_ACTIVITY
;
53 return self
::fetch_helper('course_completion_criteria', __CLASS__
, $params);
57 * Add appropriate form elements to the critieria form
59 * @param moodleform $mform Moodle forms object
60 * @param stdClass $data details of various modules
62 public function config_form_display(&$mform, $data = null) {
63 $modnames = get_module_types_names();
64 $mform->addElement('advcheckbox',
65 'criteria_activity['.$data->id
.']',
66 $modnames[self
::get_mod_name($data->module
)] . ' - ' . format_string($data->name
),
71 $mform->setDefault('criteria_activity['.$data->id
.']', 1);
76 * Update the criteria information stored in the database
78 * @param stdClass $data Form data
80 public function update_config(&$data) {
83 if (!empty($data->criteria_activity
) && is_array($data->criteria_activity
)) {
85 $this->course
= $data->id
;
87 // Data comes from advcheckbox, so contains keys for all activities.
88 // A value of 0 is 'not checked' whereas 1 is 'checked'.
89 foreach ($data->criteria_activity
as $activity => $val) {
90 // Only update those which are checked.
92 $module = $DB->get_record('course_modules', array('id' => $activity));
93 $this->module
= self
::get_mod_name($module->module
);
94 $this->moduleinstance
= $activity;
103 * Get module instance module type
105 * @param int $type Module type id
108 public static function get_mod_name($type) {
111 if (!is_array($types)) {
113 $types = $DB->get_records('modules');
116 return $types[$type]->name
;
120 * Gets the module instance from the database and returns it.
121 * If no module instance exists this function returns false.
123 * @return stdClass|bool
125 public function get_mod_instance() {
128 return $DB->get_record_sql(
136 ON cm.id = {$this->moduleinstance}
137 AND m.id = cm.instance
143 * Review this criteria and decide if the user has completed
145 * @param completion_completion $completion The user's completion record
146 * @param bool $mark Optionally set false to not save changes to database
149 public function review($completion, $mark = true) {
152 $course = $DB->get_record('course', array('id' => $completion->course
));
153 $cm = $DB->get_record('course_modules', array('id' => $this->moduleinstance
));
154 $info = new completion_info($course);
156 $data = $info->get_data($cm, false, $completion->userid
);
158 // If the activity is complete
159 if (in_array($data->completionstate
, array(COMPLETION_COMPLETE
, COMPLETION_COMPLETE_PASS
, COMPLETION_COMPLETE_FAIL
))) {
161 $completion->mark_complete();
171 * Return criteria title for display in reports
175 public function get_title() {
176 return get_string('activitiescompleted', 'completion');
180 * Return a more detailed criteria title for display in reports
184 public function get_title_detailed() {
186 $module = $DB->get_record('course_modules', array('id' => $this->moduleinstance
));
187 $activity = $DB->get_record($this->module
, array('id' => $module->instance
));
189 return shorten_text(format_string($activity->name
, true,
190 array('context' => context_module
::instance($module->id
))));
194 * Return criteria type title for display in reports
198 public function get_type_title() {
199 return get_string('activities', 'completion');
203 * Find users who have completed this criteria and mark them accordingly
205 public function cron() {
208 // Get all users who meet this criteria
214 mc.timemodified AS timecompleted
216 {course_completion_criteria} cr
222 ON con.instanceid = c.id
224 {role_assignments} ra
225 ON ra.contextid = con.id
227 {course_modules_completion} mc
228 ON mc.coursemoduleid = cr.moduleinstance
229 AND mc.userid = ra.userid
231 {course_completion_crit_compl} cc
232 ON cc.criteriaid = cr.id
233 AND cc.userid = ra.userid
235 cr.criteriatype = '.COMPLETION_CRITERIA_TYPE_ACTIVITY
.'
236 AND con.contextlevel = '.CONTEXT_COURSE
.'
237 AND c.enablecompletion = 1
240 mc.completionstate = '.COMPLETION_COMPLETE
.'
241 OR mc.completionstate = '.COMPLETION_COMPLETE_PASS
.'
242 OR mc.completionstate = '.COMPLETION_COMPLETE_FAIL
.'
246 // Loop through completions, and mark as complete
247 $rs = $DB->get_recordset_sql($sql);
248 foreach ($rs as $record) {
249 $completion = new completion_criteria_completion((array) $record, DATA_OBJECT_FETCH_BY_KEY
);
250 $completion->mark_complete($record->timecompleted
);
256 * Return criteria progress details for display in reports
258 * @param completion_completion $completion The user's completion record
259 * @return array An array with the following keys:
260 * type, criteria, requirement, status
262 public function get_details($completion) {
263 // Get completion info
264 $modinfo = get_fast_modinfo($completion->course
);
265 $cm = $modinfo->get_cm($this->moduleinstance
);
268 $details['type'] = $this->get_title();
269 if ($cm->has_view()) {
270 $details['criteria'] = html_writer
::link($cm->url
, $cm->get_formatted_name());
272 $details['criteria'] = $cm->get_formatted_name();
275 // Build requirements
276 $details['requirement'] = array();
278 if ($cm->completion
== COMPLETION_TRACKING_MANUAL
) {
279 $details['requirement'][] = get_string('markingyourselfcomplete', 'completion');
280 } elseif ($cm->completion
== COMPLETION_TRACKING_AUTOMATIC
) {
281 if ($cm->completionview
) {
282 $modulename = core_text
::strtolower(get_string('modulename', $this->module
));
283 $details['requirement'][] = get_string('viewingactivity', 'completion', $modulename);
286 if (!is_null($cm->completiongradeitemnumber
)) {
287 $details['requirement'][] = get_string('achievinggrade', 'completion');
291 $details['requirement'] = implode(', ', $details['requirement']);
293 $details['status'] = '';
299 * Return pix_icon for display in reports.
301 * @param string $alt The alt text to use for the icon
302 * @param array $attributes html attributes
305 public function get_icon($alt, array $attributes = null) {
306 return new pix_icon('icon', $alt, 'mod_'.$this->module
, $attributes);