MDL-42460 mod_feedback: Fix markup validation
[moodle.git] / mod / feedback / complete_guest.php
1 <?php
2 // This file is part of Moodle - http://moodle.org/
3 //
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
17 /**
18  * prints the form so an anonymous user can fill out the feedback on the mainsite
19  *
20  * @author Andreas Grabs
21  * @license http://www.gnu.org/copyleft/gpl.html GNU Public License
22  * @package mod_feedback
23  */
25 require_once("../../config.php");
26 require_once("lib.php");
28 feedback_init_feedback_session();
30 $id = required_param('id', PARAM_INT);
31 $completedid = optional_param('completedid', false, PARAM_INT);
32 $preservevalues  = optional_param('preservevalues', 0,  PARAM_INT);
33 $courseid = optional_param('courseid', false, PARAM_INT);
34 $gopage = optional_param('gopage', -1, PARAM_INT);
35 $lastpage = optional_param('lastpage', false, PARAM_INT);
36 $startitempos = optional_param('startitempos', 0, PARAM_INT);
37 $lastitempos = optional_param('lastitempos', 0, PARAM_INT);
39 $url = new moodle_url('/mod/feedback/complete_guest.php', array('id'=>$id));
40 if ($completedid !== false) {
41     $url->param('completedid', $completedid);
42 }
43 if ($preservevalues !== 0) {
44     $url->param('preservevalues', $preservevalues);
45 }
46 if ($courseid !== false) {
47     $url->param('courseid', $courseid);
48 }
49 if ($gopage !== -1) {
50     $url->param('gopage', $gopage);
51 }
52 if ($lastpage !== false) {
53     $url->param('lastpage', $lastpage);
54 }
55 if ($startitempos !== 0) {
56     $url->param('startitempos', $startitempos);
57 }
58 if ($lastitempos !== 0) {
59     $url->param('lastitempos', $lastitempos);
60 }
61 $PAGE->set_url($url);
63 $highlightrequired = false;
65 if (($formdata = data_submitted()) AND !confirm_sesskey()) {
66     print_error('invalidsesskey');
67 }
69 //if the use hit enter into a textfield so the form should not submit
70 if (isset($formdata->sesskey) AND
71    !isset($formdata->savevalues) AND
72    !isset($formdata->gonextpage) AND
73    !isset($formdata->gopreviouspage)) {
75     $gopage = (int) $formdata->lastpage;
76 }
77 if (isset($formdata->savevalues)) {
78     $savevalues = true;
79 } else {
80     $savevalues = false;
81 }
83 if ($gopage < 0 AND !$savevalues) {
84     if (isset($formdata->gonextpage)) {
85         $gopage = $lastpage + 1;
86         $gonextpage = true;
87         $gopreviouspage = false;
88     } else if (isset($formdata->gopreviouspage)) {
89         $gopage = $lastpage - 1;
90         $gonextpage = false;
91         $gopreviouspage = true;
92     } else {
93         print_error('parameters_missing', 'feedback');
94     }
95 } else {
96     $gonextpage = $gopreviouspage = false;
97 }
99 if (! $cm = get_coursemodule_from_id('feedback', $id)) {
100     print_error('invalidcoursemodule');
103 if (! $course = $DB->get_record("course", array("id"=>$cm->course))) {
104     print_error('coursemisconf');
107 if (! $feedback = $DB->get_record("feedback", array("id"=>$cm->instance))) {
108     print_error('invalidcoursemodule');
111 $context = context_module::instance($cm->id);
113 $feedback_complete_cap = false;
115 if (isset($CFG->feedback_allowfullanonymous)
116             AND $CFG->feedback_allowfullanonymous
117             AND $course->id == SITEID
118             AND (!$courseid OR $courseid == SITEID)
119             AND $feedback->anonymous == FEEDBACK_ANONYMOUS_YES ) {
120     $feedback_complete_cap = true;
123 //check whether the feedback is anonymous
124 if (isset($CFG->feedback_allowfullanonymous)
125                 AND $CFG->feedback_allowfullanonymous
126                 AND $feedback->anonymous == FEEDBACK_ANONYMOUS_YES
127                 AND $course->id == SITEID ) {
128     $feedback_complete_cap = true;
130 if ($feedback->anonymous != FEEDBACK_ANONYMOUS_YES) {
131     print_error('feedback_is_not_for_anonymous', 'feedback');
134 //check whether the user has a session
135 // there used to be a sesskey test - this could not work - sorry
137 //check whether the feedback is located and! started from the mainsite
138 if ($course->id == SITEID AND !$courseid) {
139     $courseid = SITEID;
142 require_course_login($course);
144 if ($courseid AND $courseid != SITEID) {
145     $course2 = $DB->get_record('course', array('id'=>$courseid));
146     require_course_login($course2); //this overwrites the object $course :-(
147     $course = $DB->get_record("course", array("id"=>$cm->course)); // the workaround
150 if (!$feedback_complete_cap) {
151     print_error('error');
155 /// Print the page header
156 $strfeedbacks = get_string("modulenameplural", "feedback");
157 $strfeedback  = get_string("modulename", "feedback");
159 $PAGE->set_cm($cm, $course); // set's up global $COURSE
160 $PAGE->set_pagelayout('incourse');
162 $urlparams = array('id'=>$course->id);
163 $PAGE->navbar->add($strfeedbacks, new moodle_url('/mod/feedback/index.php', $urlparams));
164 $PAGE->navbar->add(format_string($feedback->name));
165 $PAGE->set_heading($course->fullname);
166 $PAGE->set_title($feedback->name);
167 echo $OUTPUT->header();
169 //ishidden check.
170 //hidden feedbacks except feedbacks on mainsite are only accessible with related capabilities
171 if ((empty($cm->visible) AND
172         !has_capability('moodle/course:viewhiddenactivities', $context)) AND
173         $course->id != SITEID) {
174     notice(get_string("activityiscurrentlyhidden"));
177 //check, if the feedback is open (timeopen, timeclose)
178 $checktime = time();
180 $feedback_is_closed = ($feedback->timeopen > $checktime) ||
181                       ($feedback->timeclose < $checktime &&
182                             $feedback->timeclose > 0);
184 if ($feedback_is_closed) {
185     echo $OUTPUT->box_start('generalbox boxaligncenter');
186     echo $OUTPUT->notification(get_string('feedback_is_not_open', 'feedback'));
187     echo $OUTPUT->continue_button($CFG->wwwroot.'/course/view.php?id='.$course->id);
188     echo $OUTPUT->box_end();
189     echo $OUTPUT->footer();
190     exit;
193 //additional check for multiple-submit (prevent browsers back-button).
194 //the main-check is in view.php
195 $feedback_can_submit = true;
196 if ($feedback->multiple_submit == 0 ) {
197     if (feedback_is_already_submitted($feedback->id, $courseid)) {
198         $feedback_can_submit = false;
199     }
201 if ($feedback_can_submit) {
202     //preserving the items
203     if ($preservevalues == 1) {
204         if (!$SESSION->feedback->is_started == true) {
205             print_error('error', 'error', $CFG->wwwroot.'/course/view.php?id='.$course->id);
206         }
207         //check, if all required items have a value
208         if (feedback_check_values($startitempos, $lastitempos)) {
209             $userid = $USER->id; //arb
210             if ($completedid = feedback_save_guest_values(sesskey())) {
211                 //now it can be saved
212                 if (!$gonextpage AND !$gopreviouspage) {
213                     $preservevalues = false;
214                 }
216             } else {
217                 $savereturn = 'failed';
218                 if (isset($lastpage)) {
219                     $gopage = $lastpage;
220                 } else {
221                     print_error('parameters_missing', 'feedback');
222                 }
223             }
224         } else {
225             $savereturn = 'missing';
226             $highlightrequired = true;
227             if (isset($lastpage)) {
228                 $gopage = $lastpage;
229             } else {
230                 print_error('parameters_missing', 'feedback');
231             }
232         }
233     }
235     //saving the items
236     if ($savevalues AND !$preservevalues) {
237         //exists there any pagebreak, so there are values in the feedback_valuetmp
238         //arb changed from 0 to $USER->id
239         //no strict anonymous feedbacks
240         //if it is a guest taking it then I want to know that it was
241         //a guest (at least in the data saved in the feedback tables)
242         $userid = $USER->id;
244         $params = array('id'=>$completedid);
245         $feedbackcompletedtmp = $DB->get_record('feedback_completedtmp', $params);
247         //fake saving for switchrole
248         $is_switchrole = feedback_check_is_switchrole();
249         if ($is_switchrole) {
250             $savereturn = 'saved';
251             feedback_delete_completedtmp($completedid);
252         } else {
253             $new_completed_id = feedback_save_tmp_values($feedbackcompletedtmp, false, $userid);
254             if ($new_completed_id) {
255                 $savereturn = 'saved';
256                 feedback_send_email_anonym($cm, $feedback, $course, $userid);
257                 unset($SESSION->feedback->is_started);
259             } else {
260                 $savereturn = 'failed';
261             }
262         }
263     }
265     if ($allbreaks = feedback_get_all_break_positions($feedback->id)) {
266         if ($gopage <= 0) {
267             $startposition = 0;
268         } else {
269             if (!isset($allbreaks[$gopage - 1])) {
270                 $gopage = count($allbreaks);
271             }
272             $startposition = $allbreaks[$gopage - 1];
273         }
274         $ispagebreak = true;
275     } else {
276         $startposition = 0;
277         $newpage = 0;
278         $ispagebreak = false;
279     }
281     //get the feedbackitems after the last shown pagebreak
282     $select = 'feedback = ? AND position > ?';
283     $params = array($feedback->id, $startposition);
284     $feedbackitems = $DB->get_records_select('feedback_item', $select, $params, 'position');
286     //get the first pagebreak
287     $params = array('feedback'=>$feedback->id, 'typ'=>'pagebreak');
288     if ($pagebreaks = $DB->get_records('feedback_item', $params, 'position')) {
289         $pagebreaks = array_values($pagebreaks);
290         $firstpagebreak = $pagebreaks[0];
291     } else {
292         $firstpagebreak = false;
293     }
294     $maxitemcount = $DB->count_records('feedback_item', array('feedback'=>$feedback->id));
295     $feedbackcompletedtmp = feedback_get_current_completed($feedback->id,
296                                                            true,
297                                                            $courseid,
298                                                            sesskey());
300     // Print the main part of the page.
301     $analysisurl = new moodle_url('/mod/feedback/analysis.php', array('id'=>$id));
302     if ($courseid > 0) {
303         $analysisurl->param('courseid', $courseid);
304     }
305     echo $OUTPUT->heading(format_string($feedback->name));
307     if ( (intval($feedback->publish_stats) == 1) AND
308             ( has_capability('mod/feedback:viewanalysepage', $context)) AND
309             !( has_capability('mod/feedback:viewreports', $context)) ) {
310         echo $OUTPUT->box_start('mdl-align');
311         echo '<a href="'.$analysisurl->out().'">';
312         echo get_string('completed_feedbacks', 'feedback');
313         echo '</a>';
314         echo $OUTPUT->box_end();
315     }
317     if (isset($savereturn) && $savereturn == 'saved') {
318         if ($feedback->page_after_submit) {
319             require_once($CFG->libdir . '/filelib.php');
321             $page_after_submit_output = file_rewrite_pluginfile_urls($feedback->page_after_submit,
322                                                                     'pluginfile.php',
323                                                                     $context->id,
324                                                                     'mod_feedback',
325                                                                     'page_after_submit',
326                                                                     0);
328             echo $OUTPUT->box_start('generalbox boxaligncenter boxwidthwide');
329             echo format_text($page_after_submit_output,
330                              $feedback->page_after_submitformat,
331                              array('overflowdiv' => true));
332             echo $OUTPUT->box_end();
333         } else {
334             echo '<p align="center"><b><font color="green">';
335             echo get_string('entries_saved', 'feedback');
336             echo '</font></b></p>';
337             if ( intval($feedback->publish_stats) == 1) {
338                 echo '<p align="center"><a href="'.$analysisurl->out().'">';
339                 echo get_string('completed_feedbacks', 'feedback').'</a>';
340                 echo '</p>';
341             }
342         }
343         if ($feedback->site_after_submit) {
344             $url = feedback_encode_target_url($feedback->site_after_submit);
345         } else {
346             if ($courseid) {
347                 if ($courseid == SITEID) {
348                     $url = $CFG->wwwroot;
349                 } else {
350                     $url = $CFG->wwwroot.'/course/view.php?id='.$courseid;
351                 }
352             } else {
353                 if ($course->id == SITEID) {
354                     $url = $CFG->wwwroot;
355                 } else {
356                     $url = $CFG->wwwroot.'/course/view.php?id='.$course->id;
357                 }
358             }
359         }
360         echo $OUTPUT->continue_button($url);
361     } else {
362         if (isset($savereturn) && $savereturn == 'failed') {
363             echo $OUTPUT->box_start('mform');
364             echo '<span class="error">'.get_string('saving_failed', 'feedback').'</span>';
365             echo $OUTPUT->box_end();
366         }
368         if (isset($savereturn) && $savereturn == 'missing') {
369             echo $OUTPUT->box_start('mform');
370             echo '<span class="error">'.get_string('saving_failed_because_missing_or_false_values', 'feedback').'</span>';
371             echo $OUTPUT->box_end();
372         }
374         //print the items
375         if (is_array($feedbackitems)) {
376             echo $OUTPUT->box_start('feedback_form');
377             echo '<form action="complete_guest.php" class="mform" method="post" onsubmit=" ">';
378             echo '<fieldset>';
379             echo '<input type="hidden" name="anonymous" value="0" />';
380             $inputvalue = 'value="'.FEEDBACK_ANONYMOUS_YES.'"';
381             echo '<input type="hidden" name="anonymous_response" '.$inputvalue.' />';
382             echo '<input type="hidden" name="sesskey" value="'.sesskey().'" />';
383             //check, if there exists required-elements
384             $params = array('feedback'=>$feedback->id, 'required'=>1);
385             $countreq = $DB->count_records('feedback_item', $params);
386             if ($countreq > 0) {
387                 echo '<div class="fdescription required">';
388                 echo get_string('somefieldsrequired', 'form', '<img alt="'.get_string('requiredelement', 'form').
389                     '" src="'.$OUTPUT->pix_url('req') .'" class="req" />');
390                 echo '</div>';
391             }
392             echo $OUTPUT->box_start('feedback_items');
394             $startitem = null;
395             $select = 'feedback = ? AND hasvalue = 1 AND position < ?';
396             $params = array($feedback->id, $startposition);
397             $itemnr = $DB->count_records_select('feedback_item', $select, $params);
398             $lastbreakposition = 0;
399             $align = right_to_left() ? 'right' : 'left';
401             foreach ($feedbackitems as $feedbackitem) {
402                 if (!isset($startitem)) {
403                     //avoid showing double pagebreaks
404                     if ($feedbackitem->typ == 'pagebreak') {
405                         continue;
406                     }
407                     $startitem = $feedbackitem;
408                 }
410                 if ($feedbackitem->dependitem > 0) {
411                     //chech if the conditions are ok
412                     $fb_compare_value = feedback_compare_item_value($feedbackcompletedtmp->id,
413                                                                     $feedbackitem->dependitem,
414                                                                     $feedbackitem->dependvalue,
415                                                                     true);
416                     if (!isset($feedbackcompletedtmp->id) OR !$fb_compare_value) {
417                         $lastitem = $feedbackitem;
418                         $lastbreakposition = $feedbackitem->position;
419                         continue;
420                     }
421                 }
423                 if ($feedbackitem->dependitem > 0) {
424                     $dependstyle = ' feedback_complete_depend';
425                 } else {
426                     $dependstyle = '';
427                 }
429                 echo $OUTPUT->box_start('feedback_item_box_'.$align.$dependstyle);
430                 $value = '';
431                 //get the value
432                 $frmvaluename = $feedbackitem->typ . '_'. $feedbackitem->id;
433                 if (isset($savereturn)) {
434                     $value = isset($formdata->{$frmvaluename}) ? $formdata->{$frmvaluename} : null;
435                     $value = feedback_clean_input_value($feedbackitem, $value);
436                 } else {
437                     if (isset($feedbackcompletedtmp->id)) {
438                         $value = feedback_get_item_value($feedbackcompletedtmp->id,
439                                                          $feedbackitem->id,
440                                                          sesskey());
441                     }
442                 }
443                 if ($feedbackitem->hasvalue == 1 AND $feedback->autonumbering) {
444                     $itemnr++;
445                     echo $OUTPUT->box_start('feedback_item_number_'.$align);
446                     echo $itemnr;
447                     echo $OUTPUT->box_end();
448                 }
449                 if ($feedbackitem->typ != 'pagebreak') {
450                     echo $OUTPUT->box_start('box generalbox boxalign_'.$align);
451                     feedback_print_item_complete($feedbackitem, $value, $highlightrequired);
452                     echo $OUTPUT->box_end();
453                 }
455                 echo $OUTPUT->box_end();
457                 $lastbreakposition = $feedbackitem->position; //last item-pos (item or pagebreak)
458                 if ($feedbackitem->typ == 'pagebreak') {
459                     break;
460                 } else {
461                     $lastitem = $feedbackitem;
462                 }
463             }
464             echo $OUTPUT->box_end();
465             echo '<input type="hidden" name="id" value="'.$id.'" />';
466             echo '<input type="hidden" name="feedbackid" value="'.$feedback->id.'" />';
467             echo '<input type="hidden" name="lastpage" value="'.$gopage.'" />';
468             if (isset($feedbackcompletedtmp->id)) {
469                 $inputvalue = 'value="'.$feedbackcompletedtmp->id;
470             } else {
471                 $inputvalue = 'value=""';
472             }
473             echo '<input type="hidden" name="completedid" '.$inputvalue.' />';
474             echo '<input type="hidden" name="courseid" value="'. $courseid . '" />';
475             echo '<input type="hidden" name="preservevalues" value="1" />';
476             if (isset($startitem)) {
477                 echo '<input type="hidden" name="startitempos" value="'.$startitem->position.'" />';
478                 echo '<input type="hidden" name="lastitempos" value="'.$lastitem->position.'" />';
479             }
481             if ($ispagebreak AND $lastbreakposition > $firstpagebreak->position) {
482                 $inputvalue = 'value="'.get_string('previous_page', 'feedback').'"';
483                 echo '<input name="gopreviouspage" type="submit" '.$inputvalue.' />';
484             }
485             if ($lastbreakposition < $maxitemcount) {
486                 $inputvalue = 'value="'.get_string('next_page', 'feedback').'"';
487                 echo '<input name="gonextpage" type="submit" '.$inputvalue.' />';
488             }
489             if ($lastbreakposition >= $maxitemcount) { //last page
490                 $inputvalue = 'value="'.get_string('save_entries', 'feedback').'"';
491                 echo '<input name="savevalues" type="submit" '.$inputvalue.' />';
492             }
494             echo '</form>';
495             echo $OUTPUT->box_end();
497             echo $OUTPUT->box_start('feedback_complete_cancel');
498             if ($courseid) {
499                 $action = 'action="'.$CFG->wwwroot.'/course/view.php?id='.$courseid.'"';
500             } else {
501                 if ($course->id == SITEID) {
502                     $action = 'action="'.$CFG->wwwroot.'"';
503                 } else {
504                     $action = 'action="'.$CFG->wwwroot.'/course/view.php?id='.$course->id.'"';
505                 }
506             }
507             echo '<form '.$action.' method="post" onsubmit=" ">';
508             echo '<input type="hidden" name="sesskey" value="'.sesskey().'" />';
509             echo '<input type="hidden" name="courseid" value="'. $courseid . '" />';
510             echo '<button type="submit">'.get_string('cancel').'</button>';
511             echo '</form>';
512             echo $OUTPUT->box_end();
513             $SESSION->feedback->is_started = true;
514         }
515     }
516 } else {
517     echo $OUTPUT->box_start('generalbox boxaligncenter');
518     echo $OUTPUT->notification(get_string('this_feedback_is_already_submitted', 'feedback'));
519     echo $OUTPUT->continue_button($CFG->wwwroot.'/course/view.php?id='.$course->id);
520     echo $OUTPUT->box_end();
522 /// Finish the page
523 ///////////////////////////////////////////////////////////////////////////
524 ///////////////////////////////////////////////////////////////////////////
525 ///////////////////////////////////////////////////////////////////////////
527 echo $OUTPUT->footer();