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)