diff --git a/mod/feedback/backup/moodle2/backup_feedback_stepslib.php b/mod/feedback/backup/moodle2/backup_feedback_stepslib.php index 49fadfd363a..142244a0ad7 100644 --- a/mod/feedback/backup/moodle2/backup_feedback_stepslib.php +++ b/mod/feedback/backup/moodle2/backup_feedback_stepslib.php @@ -51,7 +51,8 @@ class backup_feedback_activity_structure_step extends backup_activity_structure_ 'publish_stats', 'timeopen', 'timeclose', - 'timemodified')); + 'timemodified', + 'completionsubmit')); $completeds = new backup_nested_element('completeds'); diff --git a/mod/feedback/complete.php b/mod/feedback/complete.php index 15931092a6d..0de24fba21c 100644 --- a/mod/feedback/complete.php +++ b/mod/feedback/complete.php @@ -237,6 +237,12 @@ $tracking->completed = $new_completed_id; $DB->insert_record('feedback_tracking', $tracking); unset($SESSION->feedback->is_started); + + // Update completion state + $completion = new completion_info($course); + if ($completion->is_enabled($cm) && $feedback->completionsubmit) { + $completion->update_state($cm, COMPLETION_COMPLETE); + } }else { $savereturn = 'failed'; @@ -320,10 +326,6 @@ } } - // Mark activity viewed for completion-tracking - $completion=new completion_info($course); - $completion->set_module_viewed($cm); - if($feedback->site_after_submit) { echo $OUTPUT->continue_button(feedback_encode_target_url($feedback->site_after_submit)); }else { @@ -500,5 +502,9 @@ /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// + // Mark activity viewed for completion-tracking + $completion=new completion_info($course); + $completion->set_module_viewed($cm); + echo $OUTPUT->footer(); diff --git a/mod/feedback/db/install.xml b/mod/feedback/db/install.xml index 3220a68d74c..97d31b3f360 100644 --- a/mod/feedback/db/install.xml +++ b/mod/feedback/db/install.xml @@ -21,7 +21,8 @@ - + + diff --git a/mod/feedback/db/upgrade.php b/mod/feedback/db/upgrade.php index d353ef0fd79..1f3ecbc445e 100644 --- a/mod/feedback/db/upgrade.php +++ b/mod/feedback/db/upgrade.php @@ -289,6 +289,21 @@ function xmldb_feedback_upgrade($oldversion) { upgrade_mod_savepoint(true, 2010051601, 'feedback'); } + if ($oldversion < 2010102300) { + + // Define field completionsubmit to be added to feedback + $table = new xmldb_table('feedback'); + $field = new xmldb_field('completionsubmit', XMLDB_TYPE_INTEGER, '1', null, XMLDB_NOTNULL, null, '0', 'timemodified'); + + // Conditionally launch add field completionsubmit + if (!$dbman->field_exists($table, $field)) { + $dbman->add_field($table, $field); + } + + // feedback savepoint reached + upgrade_mod_savepoint(true, 2010102300, 'feedback'); + } + return true; } diff --git a/mod/feedback/lang/en/feedback.php b/mod/feedback/lang/en/feedback.php index 68d286f124c..09dc2fe1acf 100644 --- a/mod/feedback/lang/en/feedback.php +++ b/mod/feedback/lang/en/feedback.php @@ -48,6 +48,7 @@ $string['captchanotset'] = 'Captcha hasn\'t been set.'; $string['completed'] = 'completed'; $string['completed_feedbacks'] = 'Submitted answers'; $string['complete_the_form'] = 'Answer the questions...'; +$string['completionsubmit'] = 'View as completed if the feedback is submitted'; $string['configallowfullanonymous'] = 'If this option is set yes so the feedback can be completed without any preceding logon. It only affects feedbacks on the homepage.'; $string['confirmdeleteentry'] = 'Are you sure you want to delete this entry?'; $string['confirmdeleteitem'] = 'Are you sure you want to delete this element?'; diff --git a/mod/feedback/lib.php b/mod/feedback/lib.php index 6fcf870dc53..0a76beee04d 100644 --- a/mod/feedback/lib.php +++ b/mod/feedback/lib.php @@ -28,6 +28,8 @@ require_once($CFG->libdir.'/eventslib.php'); /** Include calendar/lib.php */ require_once($CFG->dirroot.'/calendar/lib.php'); +/** Include completionlib.php */ +require_once($CFG->libdir . '/completionlib.php'); define('FEEDBACK_ANONYMOUS_YES', 1); @@ -58,6 +60,7 @@ function feedback_supports($feature) { case FEATURE_GROUPMEMBERSONLY: return true; case FEATURE_MOD_INTRO: return true; case FEATURE_COMPLETION_TRACKS_VIEWS: return true; + case FEATURE_COMPLETION_HAS_RULES: return true; case FEATURE_GRADE_HAS_GRADE: return false; case FEATURE_GRADE_OUTCOMES: return false; case FEATURE_BACKUP_MOODLE2: return true; @@ -419,6 +422,31 @@ function feedback_print_recent_mod_activity($activity, $courseid, $detail, $modn return; } +/** + * Obtains the automatic completion state for this feedback based on the condition + * in feedback settings. + * + * @param object $course Course + * @param object $cm Course-module + * @param int $userid User ID + * @param bool $type Type of comparison (or/and; can be used as return value if no conditions) + * @return bool True if completed, false if not, $type if conditions not set. + */ +function feedback_get_completion_state($course, $cm, $userid, $type) { + global $CFG, $DB; + + // Get feedback details + $feedback = $DB->get_record('feedback', array('id'=>$cm->instance), '*', MUST_EXIST); + + // If completion option is enabled, evaluate it and return true/false + if($feedback->completionsubmit) { + return $DB->record_exists('feedback_tracking', array('userid'=>$userid, 'feedback'=>$feedback->id)); + } else { + // Completion option is not enabled so just return $type + return $type; + } +} + /** * Print a detailed representation of what a user has done with @@ -1037,6 +1065,7 @@ function feedback_items_from_template($feedback, $templateid, $deleteold = false //files in the template_item are in the context of the current course //files in the feedback_item are in the feedback_context of the feedback $c_context = get_context_instance(CONTEXT_COURSE, $feedback->course); + $course = $DB->get_record('course', array('id'=>$feedback->course)); $cm = get_coursemodule_from_instance('feedback', $feedback->id); $f_context = get_context_instance(CONTEXT_MODULE, $cm->id); @@ -1050,7 +1079,17 @@ function feedback_items_from_template($feedback, $templateid, $deleteold = false } //delete tracking-data $DB->delete_records('feedback_tracking', array('feedback'=>$feedback->id)); - $DB->delete_records('feedback_completed', array('feedback'=>$feedback->id)); + + if($completeds = $DB->get_records('feedback_completed', array('feedback'=>$feedback->id))) { + $completion = new completion_info($course); + foreach($completeds as $completed) { + // Update completion state + if ($completion->is_enabled($cm) && $feedback->completionsubmit) { + $completion->update_state($cm, COMPLETION_INCOMPLETE, $completed->userid); + } + $DB->delete_records('feedback_completed', array('id'=>$completed->id)); + } + } $DB->delete_records('feedback_completedtmp', array('feedback'=>$feedback->id)); } $positionoffset = 0; @@ -1331,14 +1370,38 @@ function feedback_delete_item($itemid, $renumber = true){ function feedback_delete_all_items($feedbackid){ global $DB; + if(!$feedback = $DB->get_record('feedback', array('id'=>$feedbackid))) { + return false; + } + + if (!$cm = get_coursemodule_from_instance('feedback', $feedback->id)) { + return false; + } + + if(!$course = $DB->get_record('course', array('id'=>$feedback->course))) { + return false; + } + if(!$items = $DB->get_records('feedback_item', array('feedback'=>$feedbackid))) { return; } foreach($items as $item) { feedback_delete_item($item->id, false); } + // $DB->delete_records('feedback_completed', array('feedback'=>$feedbackid)); + if($completeds = $DB->get_records('feedback_completed', array('feedback'=>$feedback->id))) { + $completion = new completion_info($course); + foreach($completeds as $completed) { + // Update completion state + if ($completion->is_enabled($cm) && $feedback->completionsubmit) { + $completion->update_state($cm, COMPLETION_INCOMPLETE, $completed->userid); + } + $DB->delete_records('feedback_completed', array('id'=>$completed->id)); + } + } + $DB->delete_records('feedback_completedtmp', array('feedback'=>$feedbackid)); - $DB->delete_records('feedback_completed', array('feedback'=>$feedbackid)); + } /** @@ -2275,6 +2338,19 @@ function feedback_delete_completed($completedid) { if (!$completed = $DB->get_record('feedback_completed', array('id'=>$completedid))) { return false; } + + if (!$feedback = $DB->get_record('feedback', array('id'=>$completed->feedback))) { + return false; + } + + if (!$course = $DB->get_record('course', array('id'=>$feedback->course))) { + return false; + } + + if (!$cm = get_coursemodule_from_instance('feedback', $feedback->id)) { + return false; + } + //first we delete all related values $DB->delete_records('feedback_value', array('completed'=>$completed->id)); @@ -2283,6 +2359,11 @@ function feedback_delete_completed($completedid) { $DB->delete_records('feedback_tracking', array('completed'=>$completed->id)); } + // Update completion state + $completion = new completion_info($course); + if ($completion->is_enabled($cm) && $feedback->completionsubmit) { + $completion->update_state($cm, COMPLETION_INCOMPLETE, $completed->userid); + } //last we delete the completed-record return $DB->delete_records('feedback_completed', array('id'=>$completed->id)); } diff --git a/mod/feedback/mod_form.php b/mod/feedback/mod_form.php index 00f1315a91d..fe3c4d7763e 100644 --- a/mod/feedback/mod_form.php +++ b/mod/feedback/mod_form.php @@ -119,7 +119,17 @@ class mod_feedback_mod_form extends moodleform_mod { if ($data) { $data->page_after_submitformat = $data->page_after_submit['format']; $data->page_after_submit = $data->page_after_submit['text']; + + // Turn off completion settings if the checkboxes aren't ticked + $autocompletion = !empty($data->completion) && $data->completion==COMPLETION_TRACKING_AUTOMATIC; + if(empty($data->completion) || !$autocompletion) { + $data->completionsubmit=0; + } + if(empty($data->completionsubmit)) { + $data->completionsubmit=0; + } } + return $data; } @@ -128,4 +138,14 @@ class mod_feedback_mod_form extends moodleform_mod { return $errors; } + function add_completion_rules() { + $mform =& $this->_form; + + $mform->addElement('checkbox', 'completionsubmit', '', get_string('completionsubmit', 'feedback')); + return array('completionsubmit'); + } + + function completion_rule_enabled($data) { + return !empty($data['completionsubmit']); + } } diff --git a/mod/feedback/version.php b/mod/feedback/version.php index 29c52c6524c..17aa99081fc 100644 --- a/mod/feedback/version.php +++ b/mod/feedback/version.php @@ -9,7 +9,7 @@ */ - $module->version = 2010080300; // The current module version (Date: YYYYMMDDXX) + $module->version = 2010102300; // The current module version (Date: YYYYMMDDXX) $module->requires = 2010080300; // Requires this Moodle version $feedback_version_intern = 1; //this version is used for restore older backups $module->cron = 0; // Period for cron to check this module (secs)