diff --git a/mod/feedback/analysis.php b/mod/feedback/analysis.php index 6fa61e59342..928ad4362ad 100644 --- a/mod/feedback/analysis.php +++ b/mod/feedback/analysis.php @@ -27,48 +27,19 @@ require_once("lib.php"); $current_tab = 'analysis'; -$id = required_param('id', PARAM_INT); //the POST dominated the GET -$courseid = optional_param('courseid', false, PARAM_INT); +$id = required_param('id', PARAM_INT); // Course module id. $url = new moodle_url('/mod/feedback/analysis.php', array('id'=>$id)); -if ($courseid !== false) { - $url->param('courseid', $courseid); -} $PAGE->set_url($url); -if (! $cm = get_coursemodule_from_id('feedback', $id)) { - print_error('invalidcoursemodule'); -} +list($course, $cm) = get_course_and_cm_from_cmid($id, 'feedback'); +require_course_login($course, true, $cm); -if (! $course = $DB->get_record("course", array("id"=>$cm->course))) { - print_error('coursemisconf'); -} - -if (! $feedback = $DB->get_record("feedback", array("id"=>$cm->instance))) { - print_error('invalidcoursemodule'); -} +$feedback = $PAGE->activityrecord; $context = context_module::instance($cm->id); -if ($course->id == SITEID) { - require_login($course, true); -} else { - require_login($course, true, $cm); -} - -//check whether the given courseid exists -if ($courseid AND $courseid != SITEID) { - if ($course2 = $DB->get_record('course', array('id'=>$courseid))) { - require_course_login($course2); //this overwrites the object $course :-( - $course = $DB->get_record("course", array("id"=>$cm->course)); // the workaround - } else { - print_error('invalidcourseid'); - } -} - -if ( !( ((intval($feedback->publish_stats) == 1) AND - has_capability('mod/feedback:viewanalysepage', $context)) OR - has_capability('mod/feedback:viewreports', $context))) { +if (!feedback_can_view_analysis($feedback, $context)) { print_error('error'); } diff --git a/mod/feedback/complete.php b/mod/feedback/complete.php index 07319070527..c9f6825e93a 100644 --- a/mod/feedback/complete.php +++ b/mod/feedback/complete.php @@ -75,17 +75,8 @@ if ($gopage < 0 AND !$savevalues) { $gonextpage = $gopreviouspage = false; } -if (! $cm = get_coursemodule_from_id('feedback', $id)) { - print_error('invalidcoursemodule'); -} - -if (! $course = $DB->get_record("course", array("id"=>$cm->course))) { - print_error('coursemisconf'); -} - -if (! $feedback = $DB->get_record("feedback", array("id"=>$cm->instance))) { - print_error('invalidcoursemodule'); -} +list($course, $cm) = get_course_and_cm_from_cmid($id, 'feedback'); +$feedback = $DB->get_record("feedback", array("id" => $cm->instance), '*', MUST_EXIST); $context = context_module::instance($cm->id); @@ -95,6 +86,14 @@ if (has_capability('mod/feedback:complete', $context)) { $feedback_complete_cap = true; } +if (!empty($CFG->feedback_allowfullanonymous) + AND $course->id == SITEID + AND $feedback->anonymous == FEEDBACK_ANONYMOUS_YES + AND (!isloggedin() OR isguestuser())) { + // Guests are allowed to complete fully anonymous feedback without having 'mod/feedback:complete' capability. + $feedback_complete_cap = true; +} + //check whether the feedback is located and! started from the mainsite if ($course->id == SITEID AND !$courseid) { $courseid = SITEID; @@ -110,19 +109,8 @@ if ($course->id == SITEID AND !has_capability('mod/feedback:edititems', $context } } -if ($feedback->anonymous != FEEDBACK_ANONYMOUS_YES) { - if ($course->id == SITEID) { - require_login($course, true); - } else { - require_login($course, true, $cm); - } -} else { - if ($course->id == SITEID) { - require_course_login($course, true); - } else { - require_course_login($course, true, $cm); - } -} +require_course_login($course, true, $cm); +$PAGE->set_activity_record($feedback); //check whether the given courseid exists if ($courseid AND $courseid != SITEID) { @@ -140,7 +128,9 @@ if (!$feedback_complete_cap) { // Mark activity viewed for completion-tracking $completion = new completion_info($course); -$completion->set_module_viewed($cm); +if (isloggedin() && !isguestuser()) { + $completion->set_module_viewed($cm); +} /// Print the page header $strfeedbacks = get_string("modulenameplural", "feedback"); @@ -158,22 +148,6 @@ $PAGE->set_heading($course->fullname); $PAGE->set_title($feedback->name); echo $OUTPUT->header(); -//ishidden check. -//feedback in courses -if ((empty($cm->visible) AND - !has_capability('moodle/course:viewhiddenactivities', $context)) AND - $course->id != SITEID) { - notice(get_string("activityiscurrentlyhidden")); -} - -//ishidden check. -//feedback on mainsite -if ((empty($cm->visible) AND - !has_capability('moodle/course:viewhiddenactivities', $context)) AND - $courseid == SITEID) { - notice(get_string("activityiscurrentlyhidden")); -} - //check, if the feedback is open (timeopen, timeclose) $checktime = time(); $feedback_is_closed = ($feedback->timeopen > $checktime) || @@ -207,7 +181,12 @@ if ($feedback_can_submit) { // Check if all required items have a value. if (feedback_check_values($startitempos, $lastitempos)) { $userid = $USER->id; //arb - if ($completedid = feedback_save_values($USER->id, true)) { + if (isloggedin() && !isguestuser()) { + $completedid = feedback_save_values($USER->id, true); + } else { + $completedid = feedback_save_guest_values(sesskey()); + } + if ($completedid) { if (!$gonextpage AND !$gopreviouspage) { $preservevalues = false;// It can be stored. } @@ -260,17 +239,19 @@ if ($feedback_can_submit) { } else { feedback_send_email_anonym($cm, $feedback, $course, $userid); } - //tracking the submit - $tracking = new stdClass(); - $tracking->userid = $USER->id; - $tracking->feedback = $feedback->id; - $tracking->completed = $new_completed_id; - $DB->insert_record('feedback_tracking', $tracking); + if (isloggedin() && !isguestuser()) { + // Tracking the submit. + $tracking = new stdClass(); + $tracking->userid = $USER->id; + $tracking->feedback = $feedback->id; + $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) { + if (isloggedin() && !isguestuser() && $completion->is_enabled($cm) && $feedback->completionsubmit) { $completion->update_state($cm, COMPLETION_COMPLETE); } @@ -326,8 +307,10 @@ if ($feedback_can_submit) { $feedbackcompletedtmp = feedback_set_tmp_values($feedbackcompleted); } } - } else { + } else if (isloggedin() && !isguestuser()) { $feedbackcompletedtmp = feedback_get_current_completed($feedback->id, true, $courseid); + } else { + $feedbackcompletedtmp = feedback_get_current_completed($feedback->id, true, $courseid, sesskey()); } /// Print the main part of the page @@ -340,19 +323,6 @@ if ($feedback_can_submit) { } echo $OUTPUT->heading(format_string($feedback->name)); - if ( (intval($feedback->publish_stats) == 1) AND - ( has_capability('mod/feedback:viewanalysepage', $context)) AND - !( has_capability('mod/feedback:viewreports', $context)) ) { - - $params = array('userid' => $USER->id, 'feedback' => $feedback->id); - if ($multiple_count = $DB->count_records('feedback_tracking', $params)) { - echo $OUTPUT->box_start('mdl-align'); - echo ''; - echo get_string('completed_feedbacks', 'feedback').''; - echo $OUTPUT->box_end(); - } - } - if (isset($savereturn) && $savereturn == 'saved') { if ($feedback->page_after_submit) { @@ -376,11 +346,11 @@ if ($feedback_can_submit) { echo get_string('entries_saved', 'feedback'); echo ''; echo '

'; - if ( intval($feedback->publish_stats) == 1) { - echo '

'; - echo get_string('completed_feedbacks', 'feedback').''; - echo '

'; - } + } + if (feedback_can_view_analysis($feedback, $context, $courseid)) { + echo '

'; + echo get_string('completed_feedbacks', 'feedback').''; + echo '

'; } if ($feedback->site_after_submit) { @@ -419,23 +389,24 @@ if ($feedback_can_submit) { echo $OUTPUT->box_start('feedback_form'); echo '
'; echo ''; - echo $OUTPUT->box_start('feedback_anonymousinfo'); + $anonymousmodeinfo = ''; switch ($feedback->anonymous) { case FEEDBACK_ANONYMOUS_YES: echo ''; $inputvalue = 'value="'.FEEDBACK_ANONYMOUS_YES.'"'; echo ''; - echo get_string('mode', 'feedback').': '.get_string('anonymous', 'feedback'); + $anonymousmodeinfo = get_string('anonymous', 'feedback'); break; case FEEDBACK_ANONYMOUS_NO: echo ''; $inputvalue = 'value="'.FEEDBACK_ANONYMOUS_NO.'"'; echo ''; - echo get_string('mode', 'feedback').': '; - echo get_string('non_anonymous', 'feedback'); + $anonymousmodeinfo = get_string('non_anonymous', 'feedback'); break; } - echo $OUTPUT->box_end(); + if (isloggedin() && !isguestuser()) { + echo $OUTPUT->box(get_string('mode', 'feedback') . ': ' . $anonymousmodeinfo, 'feedback_anonymousinfo'); + } //check, if there exists required-elements $params = array('feedback' => $feedback->id, 'required' => 1); $countreq = $DB->count_records('feedback_item', $params); diff --git a/mod/feedback/complete_guest.php b/mod/feedback/complete_guest.php index 3e15df102ff..819cb766862 100644 --- a/mod/feedback/complete_guest.php +++ b/mod/feedback/complete_guest.php @@ -23,506 +23,10 @@ */ require_once("../../config.php"); -require_once("lib.php"); -feedback_init_feedback_session(); - -$id = required_param('id', PARAM_INT); -$completedid = optional_param('completedid', false, PARAM_INT); -$preservevalues = optional_param('preservevalues', 0, PARAM_INT); -$courseid = optional_param('courseid', false, PARAM_INT); -$gopage = optional_param('gopage', -1, PARAM_INT); -$lastpage = optional_param('lastpage', false, PARAM_INT); -$startitempos = optional_param('startitempos', 0, PARAM_INT); -$lastitempos = optional_param('lastitempos', 0, PARAM_INT); - -$url = new moodle_url('/mod/feedback/complete_guest.php', array('id'=>$id)); -if ($completedid !== false) { - $url->param('completedid', $completedid); +// This file is no longer used, however it will remain here to redirect existing links to complete.php. +$url = new moodle_url('/mod/feedback/complete.php'); +foreach ($_GET as $key => $value) { + $url->param($key, $value); } -if ($preservevalues !== 0) { - $url->param('preservevalues', $preservevalues); -} -if ($courseid !== false) { - $url->param('courseid', $courseid); -} -if ($gopage !== -1) { - $url->param('gopage', $gopage); -} -if ($lastpage !== false) { - $url->param('lastpage', $lastpage); -} -if ($startitempos !== 0) { - $url->param('startitempos', $startitempos); -} -if ($lastitempos !== 0) { - $url->param('lastitempos', $lastitempos); -} -$PAGE->set_url($url); - -$highlightrequired = false; - -if (($formdata = data_submitted()) AND !confirm_sesskey()) { - print_error('invalidsesskey'); -} - -//if the use hit enter into a textfield so the form should not submit -if (isset($formdata->sesskey) AND - !isset($formdata->savevalues) AND - !isset($formdata->gonextpage) AND - !isset($formdata->gopreviouspage)) { - - $gopage = (int) $formdata->lastpage; -} -if (isset($formdata->savevalues)) { - $savevalues = true; -} else { - $savevalues = false; -} - -if ($gopage < 0 AND !$savevalues) { - if (isset($formdata->gonextpage)) { - $gopage = $lastpage + 1; - $gonextpage = true; - $gopreviouspage = false; - } else if (isset($formdata->gopreviouspage)) { - $gopage = $lastpage - 1; - $gonextpage = false; - $gopreviouspage = true; - } else { - print_error('parameters_missing', 'feedback'); - } -} else { - $gonextpage = $gopreviouspage = false; -} - -if (! $cm = get_coursemodule_from_id('feedback', $id)) { - print_error('invalidcoursemodule'); -} - -if (! $course = $DB->get_record("course", array("id"=>$cm->course))) { - print_error('coursemisconf'); -} - -if (! $feedback = $DB->get_record("feedback", array("id"=>$cm->instance))) { - print_error('invalidcoursemodule'); -} - -$context = context_module::instance($cm->id); - -$feedback_complete_cap = false; - -if (isset($CFG->feedback_allowfullanonymous) - AND $CFG->feedback_allowfullanonymous - AND $course->id == SITEID - AND (!$courseid OR $courseid == SITEID) - AND $feedback->anonymous == FEEDBACK_ANONYMOUS_YES ) { - $feedback_complete_cap = true; -} - -//check whether the feedback is anonymous -if (isset($CFG->feedback_allowfullanonymous) - AND $CFG->feedback_allowfullanonymous - AND $feedback->anonymous == FEEDBACK_ANONYMOUS_YES - AND $course->id == SITEID ) { - $feedback_complete_cap = true; -} -if ($feedback->anonymous != FEEDBACK_ANONYMOUS_YES) { - print_error('feedback_is_not_for_anonymous', 'feedback'); -} - -//check whether the user has a session -// there used to be a sesskey test - this could not work - sorry - -//check whether the feedback is located and! started from the mainsite -if ($course->id == SITEID AND !$courseid) { - $courseid = SITEID; -} - -require_course_login($course); - -if ($courseid AND $courseid != SITEID) { - $course2 = $DB->get_record('course', array('id'=>$courseid)); - require_course_login($course2); //this overwrites the object $course :-( - $course = $DB->get_record("course", array("id"=>$cm->course)); // the workaround -} - -if (!$feedback_complete_cap) { - print_error('error'); -} - - -/// Print the page header -$strfeedbacks = get_string("modulenameplural", "feedback"); -$strfeedback = get_string("modulename", "feedback"); - -$PAGE->set_cm($cm, $course); // set's up global $COURSE -$PAGE->set_pagelayout('incourse'); - -$urlparams = array('id'=>$course->id); -$PAGE->navbar->add($strfeedbacks, new moodle_url('/mod/feedback/index.php', $urlparams)); -$PAGE->navbar->add(format_string($feedback->name)); -$PAGE->set_heading($course->fullname); -$PAGE->set_title($feedback->name); -echo $OUTPUT->header(); - -//ishidden check. -//hidden feedbacks except feedbacks on mainsite are only accessible with related capabilities -if ((empty($cm->visible) AND - !has_capability('moodle/course:viewhiddenactivities', $context)) AND - $course->id != SITEID) { - notice(get_string("activityiscurrentlyhidden")); -} - -//check, if the feedback is open (timeopen, timeclose) -$checktime = time(); - -$feedback_is_closed = ($feedback->timeopen > $checktime) || - ($feedback->timeclose < $checktime && - $feedback->timeclose > 0); - -if ($feedback_is_closed) { - echo $OUTPUT->box_start('generalbox boxaligncenter'); - echo $OUTPUT->notification(get_string('feedback_is_not_open', 'feedback')); - echo $OUTPUT->continue_button($CFG->wwwroot.'/course/view.php?id='.$course->id); - echo $OUTPUT->box_end(); - echo $OUTPUT->footer(); - exit; -} - -//additional check for multiple-submit (prevent browsers back-button). -//the main-check is in view.php -$feedback_can_submit = true; -if ($feedback->multiple_submit == 0 ) { - if (feedback_is_already_submitted($feedback->id, $courseid)) { - $feedback_can_submit = false; - } -} -if ($feedback_can_submit) { - //preserving the items - if ($preservevalues == 1) { - if (!$SESSION->feedback->is_started == true) { - print_error('error', 'error', $CFG->wwwroot.'/course/view.php?id='.$course->id); - } - //check, if all required items have a value - if (feedback_check_values($startitempos, $lastitempos)) { - $userid = $USER->id; //arb - if ($completedid = feedback_save_guest_values(sesskey())) { - //now it can be saved - if (!$gonextpage AND !$gopreviouspage) { - $preservevalues = false; - } - - } else { - $savereturn = 'failed'; - if (isset($lastpage)) { - $gopage = $lastpage; - } else { - print_error('parameters_missing', 'feedback'); - } - } - } else { - $savereturn = 'missing'; - $highlightrequired = true; - if (isset($lastpage)) { - $gopage = $lastpage; - } else { - print_error('parameters_missing', 'feedback'); - } - } - } - - //saving the items - if ($savevalues AND !$preservevalues) { - //exists there any pagebreak, so there are values in the feedback_valuetmp - //arb changed from 0 to $USER->id - //no strict anonymous feedbacks - //if it is a guest taking it then I want to know that it was - //a guest (at least in the data saved in the feedback tables) - $userid = $USER->id; - - $params = array('id'=>$completedid); - $feedbackcompletedtmp = $DB->get_record('feedback_completedtmp', $params); - - //fake saving for switchrole - $is_switchrole = feedback_check_is_switchrole(); - if ($is_switchrole) { - $savereturn = 'saved'; - feedback_delete_completedtmp($completedid); - } else { - $new_completed_id = feedback_save_tmp_values($feedbackcompletedtmp, false, $userid); - if ($new_completed_id) { - $savereturn = 'saved'; - feedback_send_email_anonym($cm, $feedback, $course, $userid); - unset($SESSION->feedback->is_started); - - } else { - $savereturn = 'failed'; - } - } - } - - if ($allbreaks = feedback_get_all_break_positions($feedback->id)) { - if ($gopage <= 0) { - $startposition = 0; - } else { - if (!isset($allbreaks[$gopage - 1])) { - $gopage = count($allbreaks); - } - $startposition = $allbreaks[$gopage - 1]; - } - $ispagebreak = true; - } else { - $startposition = 0; - $newpage = 0; - $ispagebreak = false; - } - - //get the feedbackitems after the last shown pagebreak - $select = 'feedback = ? AND position > ?'; - $params = array($feedback->id, $startposition); - $feedbackitems = $DB->get_records_select('feedback_item', $select, $params, 'position'); - - //get the first pagebreak - $params = array('feedback'=>$feedback->id, 'typ'=>'pagebreak'); - if ($pagebreaks = $DB->get_records('feedback_item', $params, 'position')) { - $pagebreaks = array_values($pagebreaks); - $firstpagebreak = $pagebreaks[0]; - } else { - $firstpagebreak = false; - } - $maxitemcount = $DB->count_records('feedback_item', array('feedback'=>$feedback->id)); - $feedbackcompletedtmp = feedback_get_current_completed($feedback->id, - true, - $courseid, - sesskey()); - - // Print the main part of the page. - $analysisurl = new moodle_url('/mod/feedback/analysis.php', array('id'=>$id)); - if ($courseid > 0) { - $analysisurl->param('courseid', $courseid); - } - echo $OUTPUT->heading(format_string($feedback->name)); - - if ( (intval($feedback->publish_stats) == 1) AND - ( has_capability('mod/feedback:viewanalysepage', $context)) AND - !( has_capability('mod/feedback:viewreports', $context)) ) { - echo $OUTPUT->box_start('mdl-align'); - echo ''; - echo get_string('completed_feedbacks', 'feedback'); - echo ''; - echo $OUTPUT->box_end(); - } - - if (isset($savereturn) && $savereturn == 'saved') { - if ($feedback->page_after_submit) { - require_once($CFG->libdir . '/filelib.php'); - - $page_after_submit_output = file_rewrite_pluginfile_urls($feedback->page_after_submit, - 'pluginfile.php', - $context->id, - 'mod_feedback', - 'page_after_submit', - 0); - - echo $OUTPUT->box_start('generalbox boxaligncenter boxwidthwide'); - echo format_text($page_after_submit_output, - $feedback->page_after_submitformat, - array('overflowdiv' => true)); - echo $OUTPUT->box_end(); - } else { - echo '

'; - echo get_string('entries_saved', 'feedback'); - echo '

'; - if ( intval($feedback->publish_stats) == 1) { - echo '

'; - echo get_string('completed_feedbacks', 'feedback').''; - echo '

'; - } - } - if ($feedback->site_after_submit) { - $url = feedback_encode_target_url($feedback->site_after_submit); - } else { - if ($courseid) { - if ($courseid == SITEID) { - $url = $CFG->wwwroot; - } else { - $url = $CFG->wwwroot.'/course/view.php?id='.$courseid; - } - } else { - if ($course->id == SITEID) { - $url = $CFG->wwwroot; - } else { - $url = $CFG->wwwroot.'/course/view.php?id='.$course->id; - } - } - } - echo $OUTPUT->continue_button($url); - } else { - if (isset($savereturn) && $savereturn == 'failed') { - echo $OUTPUT->box_start('mform'); - echo ''.get_string('saving_failed', 'feedback').''; - echo $OUTPUT->box_end(); - } - - if (isset($savereturn) && $savereturn == 'missing') { - echo $OUTPUT->box_start('mform'); - echo ''.get_string('saving_failed_because_missing_or_false_values', 'feedback').''; - echo $OUTPUT->box_end(); - } - - //print the items - if (is_array($feedbackitems)) { - echo $OUTPUT->box_start('feedback_form'); - echo ''; - echo '
'; - echo ''; - $inputvalue = 'value="'.FEEDBACK_ANONYMOUS_YES.'"'; - echo ''; - echo ''; - //check, if there exists required-elements - $params = array('feedback'=>$feedback->id, 'required'=>1); - $countreq = $DB->count_records('feedback_item', $params); - if ($countreq > 0) { - echo '
'; - echo get_string('somefieldsrequired', 'form', ''.get_string('requiredelement', 'form').
-                    ''); - echo '
'; - } - echo $OUTPUT->box_start('feedback_items'); - - $startitem = null; - $select = 'feedback = ? AND hasvalue = 1 AND position < ?'; - $params = array($feedback->id, $startposition); - $itemnr = $DB->count_records_select('feedback_item', $select, $params); - $lastbreakposition = 0; - $align = right_to_left() ? 'right' : 'left'; - - foreach ($feedbackitems as $feedbackitem) { - if (!isset($startitem)) { - //avoid showing double pagebreaks - if ($feedbackitem->typ == 'pagebreak') { - continue; - } - $startitem = $feedbackitem; - } - - if ($feedbackitem->dependitem > 0) { - //chech if the conditions are ok - $fb_compare_value = feedback_compare_item_value($feedbackcompletedtmp->id, - $feedbackitem->dependitem, - $feedbackitem->dependvalue, - true); - if (!isset($feedbackcompletedtmp->id) OR !$fb_compare_value) { - $lastitem = $feedbackitem; - $lastbreakposition = $feedbackitem->position; - continue; - } - } - - if ($feedbackitem->dependitem > 0) { - $dependstyle = ' feedback_complete_depend'; - } else { - $dependstyle = ''; - } - - echo $OUTPUT->box_start('feedback_item_box_'.$align.$dependstyle); - $value = ''; - //get the value - $frmvaluename = $feedbackitem->typ . '_'. $feedbackitem->id; - if (isset($savereturn)) { - $value = isset($formdata->{$frmvaluename}) ? $formdata->{$frmvaluename} : null; - $value = feedback_clean_input_value($feedbackitem, $value); - } else { - if (isset($feedbackcompletedtmp->id)) { - $value = feedback_get_item_value($feedbackcompletedtmp->id, - $feedbackitem->id, - sesskey()); - } - } - if ($feedbackitem->hasvalue == 1 AND $feedback->autonumbering) { - $itemnr++; - echo $OUTPUT->box_start('feedback_item_number_'.$align); - echo $itemnr; - echo $OUTPUT->box_end(); - } - if ($feedbackitem->typ != 'pagebreak') { - echo $OUTPUT->box_start('box generalbox boxalign_'.$align); - feedback_print_item_complete($feedbackitem, $value, $highlightrequired); - echo $OUTPUT->box_end(); - } - - echo $OUTPUT->box_end(); - - $lastbreakposition = $feedbackitem->position; //last item-pos (item or pagebreak) - if ($feedbackitem->typ == 'pagebreak') { - break; - } else { - $lastitem = $feedbackitem; - } - } - echo $OUTPUT->box_end(); - echo ''; - echo ''; - echo ''; - if (isset($feedbackcompletedtmp->id)) { - $inputvalue = 'value="'.$feedbackcompletedtmp->id; - } else { - $inputvalue = 'value=""'; - } - echo ''; - echo ''; - echo ''; - if (isset($startitem)) { - echo ''; - echo ''; - } - - if ($ispagebreak AND $lastbreakposition > $firstpagebreak->position) { - $inputvalue = 'value="'.get_string('previous_page', 'feedback').'"'; - echo ''; - } - if ($lastbreakposition < $maxitemcount) { - $inputvalue = 'value="'.get_string('next_page', 'feedback').'"'; - echo ''; - } - if ($lastbreakposition >= $maxitemcount) { //last page - $inputvalue = 'value="'.get_string('save_entries', 'feedback').'"'; - echo ''; - } - - echo ''; - echo $OUTPUT->box_end(); - - echo $OUTPUT->box_start('feedback_complete_cancel'); - if ($courseid) { - $action = 'action="'.$CFG->wwwroot.'/course/view.php?id='.$courseid.'"'; - } else { - if ($course->id == SITEID) { - $action = 'action="'.$CFG->wwwroot.'"'; - } else { - $action = 'action="'.$CFG->wwwroot.'/course/view.php?id='.$course->id.'"'; - } - } - echo '
'; - echo ''; - echo ''; - echo ''; - echo '
'; - echo $OUTPUT->box_end(); - $SESSION->feedback->is_started = true; - } - } -} else { - echo $OUTPUT->box_start('generalbox boxaligncenter'); - echo $OUTPUT->notification(get_string('this_feedback_is_already_submitted', 'feedback')); - echo $OUTPUT->continue_button($CFG->wwwroot.'/course/view.php?id='.$course->id); - echo $OUTPUT->box_end(); -} -/// Finish the page -/////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////// - -echo $OUTPUT->footer(); - +redirect($url); diff --git a/mod/feedback/lib.php b/mod/feedback/lib.php index a81a54ad756..f28d769bb13 100644 --- a/mod/feedback/lib.php +++ b/mod/feedback/lib.php @@ -3220,3 +3220,29 @@ function feedback_ajax_saveitemorder($itemlist, $feedback) { } return $result; } + +/** + * Checks if current user is able to view feedback on this course. + * + * @param stdClass $feedback + * @param context_module $context + * @param int $courseid + * @return bool + */ +function feedback_can_view_analysis($feedback, $context, $courseid = false) { + if (has_capability('mod/feedback:viewreports', $context)) { + return true; + } + + if (intval($feedback->publish_stats) != 1 || + !has_capability('mod/feedback:viewanalysepage', $context)) { + return false; + } + + if (!isloggedin() || isguestuser()) { + // There is no tracking for the guests, assume that they can view analysis if condition above is satisfied. + return $feedback->course == SITEID; + } + + return feedback_is_already_submitted($feedback->id, $courseid); +} diff --git a/mod/feedback/print.php b/mod/feedback/print.php index d5dfd817913..9a79dcfb3e7 100644 --- a/mod/feedback/print.php +++ b/mod/feedback/print.php @@ -26,26 +26,15 @@ require_once("../../config.php"); require_once("lib.php"); $id = required_param('id', PARAM_INT); +$courseid = optional_param('courseid', false, PARAM_INT); // Course where this feedback is mapped to - used for return link. $PAGE->set_url('/mod/feedback/print.php', array('id'=>$id)); -if (! $cm = get_coursemodule_from_id('feedback', $id)) { - print_error('invalidcoursemodule'); -} +list($course, $cm) = get_course_and_cm_from_cmid($id, 'feedback'); +require_course_login($course, true, $cm); -if (! $course = $DB->get_record("course", array("id"=>$cm->course))) { - print_error('coursemisconf'); -} +$feedback = $PAGE->activityrecord; -if (! $feedback = $DB->get_record("feedback", array("id"=>$cm->instance))) { - print_error('invalidcoursemodule'); -} - -$context = context_module::instance($cm->id); - -require_login($course, true, $cm); - -require_capability('mod/feedback:view', $context); $PAGE->set_pagelayout('embedded'); /// Print the page header @@ -66,9 +55,14 @@ echo $OUTPUT->header(); /////////////////////////////////////////////////////////////////////////// echo $OUTPUT->heading(format_text($feedback->name)); +$continueurl = new moodle_url('/mod/feedback/view.php', array('id' => $id)); +if ($courseid) { + $continueurl->param('courseid', $courseid); +} + $feedbackitems = $DB->get_records('feedback_item', array('feedback'=>$feedback->id), 'position'); echo $OUTPUT->box_start('generalbox boxaligncenter boxwidthwide'); -echo $OUTPUT->continue_button('view.php?id='.$id); +echo $OUTPUT->continue_button($continueurl); if (is_array($feedbackitems)) { $itemnr = 0; $align = right_to_left() ? 'right' : 'left'; @@ -111,7 +105,7 @@ if (is_array($feedbackitems)) { echo $OUTPUT->box(get_string('no_items_available_yet', 'feedback'), 'generalbox boxaligncenter boxwidthwide'); } -echo $OUTPUT->continue_button('view.php?id='.$id); +echo $OUTPUT->continue_button($continueurl); echo $OUTPUT->box_end(); /// Finish the page /////////////////////////////////////////////////////////////////////////// diff --git a/mod/feedback/show_entries.php b/mod/feedback/show_entries.php index c31bddf7b31..ee1a6b69664 100644 --- a/mod/feedback/show_entries.php +++ b/mod/feedback/show_entries.php @@ -277,7 +277,7 @@ if ($do_show == 'showentries') { $feedback_completeds_count = $DB->count_records('feedback_completed', $params); print_string('anonymous_entries', 'feedback'); - echo ' ('.$feedback_completeds_count.')'; + echo ' ('.$feedback_completeds_count.')'; ?> diff --git a/mod/feedback/tests/behat/anonymous.feature b/mod/feedback/tests/behat/anonymous.feature new file mode 100644 index 00000000000..2fcbcb1f169 --- /dev/null +++ b/mod/feedback/tests/behat/anonymous.feature @@ -0,0 +1,245 @@ +@mod @mod_feedback +Feature: Anonymous feedback + In order to collect feedbacks + As an admin + I need to be able to allow anonymous feedbacks + + Background: + Given the following "users" exist: + | username | firstname | lastname | + | user1 | Username | 1 | + | user2 | Username | 2 | + | teacher | Teacher | 3 | + | manager | Manager | 4 | + And the following "courses" exist: + | fullname | shortname | + | Course 1 | C1 | + And the following "course enrolments" exist: + | user | course | role | + | user1 | C1 | student | + | user2 | C1 | student | + | teacher | C1 | editingteacher | + And the following "system role assigns" exist: + | user | course | role | + | manager | Acceptance test site | manager | + And I log in as "admin" + And I navigate to "Manage activities" node in "Site administration > Plugins > Activity modules" + And I click on "Show" "link" in the "Feedback" "table_row" + And I log out + And the following "activities" exist: + | activity | name | course | idnumber | anonymous | publish_stats | + | feedback | Site feedback | Acceptance test site | feedback0 | 1 | 1 | + | feedback | Course feedback | C1 | feedback1 | 1 | 1 | + When I log in as "manager" + And I am on site homepage + And I follow "Site feedback" + And I follow "Edit questions" + And I add a "Multiple choice" question to the feedback with: + | Question | Do you like our site? | + | Label | multichoice2 | + | Multiple choice type | Multiple choice - single answer | + | Hide the "Not selected" option | Yes | + | Multiple choice values | Yes\nNo\nI don't know | + And I log out + + Scenario: Guests can see anonymous feedback on front page but can not complete + When I follow "Site feedback" + Then I should not see "Answer the questions..." + And I follow "Preview" + And I should see "Do you like our site?" + And I press "Continue" + + Scenario: Complete anonymous feedback on the front page as an authenticated user + And I log in as "admin" + And I set the following system permissions of "Authenticated user" role: + | capability | permission | + | mod/feedback:view | Allow | + | mod/feedback:complete | Allow | + And I log out + And I log in as "user1" + And I am on site homepage + When I follow "Site feedback" + And I follow "Preview" + And I should see "Do you like our site?" + And I press "Continue" + And I follow "Answer the questions..." + And I should see "Do you like our site?" + And I set the following fields to these values: + | Yes | 1 | + And I press "Submit your answers" + And I should not see "Submitted answers" + And I press "Continue" + + Scenario: Complete anonymous feedback and view analysis on the front page as an authenticated user + And I log in as "admin" + And I set the following system permissions of "Authenticated user on frontpage" role: + | capability | permission | + | mod/feedback:view | Allow | + | mod/feedback:complete | Allow | + | mod/feedback:viewanalysepage | Allow | + And I log out + And I log in as "user1" + And I am on site homepage + When I follow "Site feedback" + And I follow "Preview" + And I should see "Do you like our site?" + And I press "Continue" + And I follow "Answer the questions..." + And I should see "Do you like our site?" + And I set the following fields to these values: + | Yes | 1 | + And I press "Submit your answers" + And I log out + And I log in as "user2" + And I am on site homepage + When I follow "Site feedback" + And I follow "Preview" + And I should see "Do you like our site?" + And I press "Continue" + And I follow "Answer the questions..." + And I set the following fields to these values: + | No | 1 | + And I press "Submit your answers" + And I follow "Submitted answers" + And I should see "Submitted answers: 2" + And I should see "Questions: 1" + # And I should not see "multichoice2" # TODO MDL-29303 do not show labels to users who can not edit feedback + And I should see "Do you like our site?" + And I should see "1 (50.00 %)" in the "Yes:" "table_row" + And I should see "1 (50.00 %)" in the "No:" "table_row" + And I log out + And I log in as "manager" + And I am on site homepage + And I follow "Site feedback" + And I follow "Show responses" + And I should not see "Username" + And I should see "Anonymous entries (2)" + And I press "Show responses" + And I should not see "Username" + And I click on "Show response" "link" in the "Response number: 1" "table_row" + And I should not see "Username" + And I should see "Response number: 1 (Anonymous)" + And I log out + + Scenario: Complete fully anonymous feedback on the front page as a guest + And I log in as "admin" + And I set the following administration settings values: + | feedback_allowfullanonymous | 1 | + And I log out + When I follow "Site feedback" + And I follow "Preview" + And I should see "Do you like our site?" + And I press "Continue" + And I follow "Answer the questions..." + And I should see "Do you like our site?" + And I set the following fields to these values: + | Yes | 1 | + And I press "Submit your answers" + And I should not see "Submitted answers" + And I press "Continue" + + Scenario: Complete fully anonymous feedback and view analyze on the front page as a guest + And I log in as "admin" + And I set the following administration settings values: + | feedback_allowfullanonymous | 1 | + And I set the following system permissions of "Guest" role: + | capability | permission | + | mod/feedback:viewanalysepage | Allow | + And I log out + When I follow "Site feedback" + And I follow "Preview" + And I should see "Do you like our site?" + And I press "Continue" + And I follow "Answer the questions..." + And I should see "Do you like our site?" + And I set the following fields to these values: + | Yes | 1 | + And I press "Submit your answers" + And I press "Continue" + # Starting new feedback + When I follow "Site feedback" + And I follow "Preview" + And I should see "Do you like our site?" + And I press "Continue" + And I follow "Answer the questions..." + And I should see "Do you like our site?" + And I set the following fields to these values: + | No | 1 | + And I press "Submit your answers" + And I follow "Submitted answers" + And I should see "Submitted answers: 2" + And I should see "Questions: 1" + # And I should not see "multichoice2" # TODO MDL-29303 + And I should see "Do you like our site?" + And I should see "1 (50.00 %)" in the "Yes:" "table_row" + And I should see "1 (50.00 %)" in the "No:" "table_row" + And I log in as "manager" + And I am on site homepage + And I follow "Site feedback" + And I follow "Show responses" + And I should see "Anonymous entries (2)" + And I press "Show responses" + And I click on "Show response" "link" in the "Response number: 1" "table_row" + And I should see "Response number: 1 (Anonymous)" + And I log out + + Scenario: Anonymous feedback in a course + # Teacher can not + When I log in as "teacher" + And I follow "Course 1" + And I follow "Course feedback" + And I follow "Edit questions" + And I add a "Multiple choice" question to the feedback with: + | Question | Do you like this course? | + | Label | multichoice1 | + | Multiple choice type | Multiple choice - single answer | + | Hide the "Not selected" option | Yes | + | Multiple choice values | Yes\nNo\nI don't know | + And I log out + And I log in as "user1" + And I follow "Course 1" + And I follow "Course feedback" + And I follow "Preview" + Then I should see "Do you like this course?" + And I press "Continue" + And I follow "Answer the questions..." + And I should see "Do you like this course?" + And I set the following fields to these values: + | Yes | 1 | + And I press "Submit your answers" + And I log out + And I log in as "user2" + And I follow "Course 1" + And I follow "Course feedback" + And I follow "Preview" + And I should see "Do you like this course?" + And I press "Continue" + And I follow "Answer the questions..." + And I should see "Do you like this course?" + And I set the following fields to these values: + | No | 1 | + And I press "Submit your answers" + And I follow "Submitted answers" + And I should see "Submitted answers: 2" + And I should see "Questions: 1" + # And I should not see "multichoice2" # TODO MDL-29303 + And I should see "Do you like this course?" + And I should see "1 (50.00 %)" in the "Yes:" "table_row" + And I should see "1 (50.00 %)" in the "No:" "table_row" + And I log out + And I log in as "teacher" + And I follow "Course 1" + And I follow "Course feedback" + And I follow "Preview" + And I should see "Do you like this course?" + And I press "Continue" + And I should not see "Answer the questions..." + And I follow "Show responses" + And I should not see "Username" + And I should see "Anonymous entries (2)" + And I press "Show responses" + And I should not see "Username" + And I click on "Show response" "link" in the "Response number: 1" "table_row" + And I should not see "Username" + And I should see "Response number: 1 (Anonymous)" + And I log out \ No newline at end of file diff --git a/mod/feedback/view.php b/mod/feedback/view.php index 52a5df7a270..0819c750fd3 100644 --- a/mod/feedback/view.php +++ b/mod/feedback/view.php @@ -62,19 +62,7 @@ if ($course->id == SITEID AND !$courseid) { $courseid = SITEID; } -if ($feedback->anonymous != FEEDBACK_ANONYMOUS_YES) { - if ($course->id == SITEID) { - require_login($course, true); - } else { - require_login($course, true, $cm); - } -} else { - if ($course->id == SITEID) { - require_course_login($course, true); - } else { - require_course_login($course, true, $cm); - } -} +require_course_login($course, true, $cm); if ($course->id == SITEID) { $PAGE->set_context($context); @@ -131,19 +119,6 @@ $strfeedbacks = get_string("modulenameplural", "feedback"); $strfeedback = get_string("modulename", "feedback"); echo $OUTPUT->header(); -//ishidden check. -//feedback in courses -$cap_viewhiddenactivities = has_capability('moodle/course:viewhiddenactivities', $context); -if ((empty($cm->visible) and !$cap_viewhiddenactivities) AND $course->id != SITEID) { - notice(get_string("activityiscurrentlyhidden")); -} - -//ishidden check. -//feedback on mainsite -if ((empty($cm->visible) and !$cap_viewhiddenactivities) AND $courseid == SITEID) { - notice(get_string("activityiscurrentlyhidden")); -} - /// Print the main part of the page /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// @@ -151,6 +126,9 @@ if ((empty($cm->visible) and !$cap_viewhiddenactivities) AND $courseid == SITEID $previewimg = $OUTPUT->pix_icon('t/preview', get_string('preview')); $previewlnk = new moodle_url('/mod/feedback/print.php', array('id' => $id)); +if ($courseid) { + $previewlnk->param('courseid', $courseid); +} $preview = html_writer::link($previewlnk, $previewimg); echo $OUTPUT->heading(format_string($feedback->name) . $preview); @@ -296,14 +274,12 @@ if ($feedback_complete_cap) { if ($feedback_can_submit) { //if the user is not known so we cannot save the values temporarly if (!isloggedin() or isguestuser()) { - $completefile = 'complete_guest.php'; $guestid = sesskey(); } else { - $completefile = 'complete.php'; $guestid = false; } $url_params = array('id'=>$id, 'courseid'=>$courseid, 'gopage'=>0); - $completeurl = new moodle_url('/mod/feedback/'.$completefile, $url_params); + $completeurl = new moodle_url('/mod/feedback/complete.php', $url_params); $feedbackcompletedtmp = feedback_get_current_completed($feedback->id, true, $courseid, $guestid); if ($feedbackcompletedtmp) {