MDL-29512 Revert "MDL-25937 Forms Library: Added Javascript validation for filepicker...
[moodle.git] / mod / feedback / complete.php
blob7f81b9b9a04919eb918ec05bb7cf81fb0f8479f0
1 <?php
3 /**
4 * prints the form so the user can fill out the feedback
6 * @author Andreas Grabs
7 * @license http://www.gnu.org/copyleft/gpl.html GNU Public License
8 * @package feedback
9 */
11 require_once("../../config.php");
12 require_once("lib.php");
13 require_once($CFG->libdir . '/completionlib.php');
15 feedback_init_feedback_session();
17 $id = required_param('id', PARAM_INT);
18 $completedid = optional_param('completedid', false, PARAM_INT);
19 $preservevalues = optional_param('preservevalues', 0, PARAM_INT);
20 $courseid = optional_param('courseid', false, PARAM_INT);
21 $gopage = optional_param('gopage', -1, PARAM_INT);
22 $lastpage = optional_param('lastpage', false, PARAM_INT);
23 $startitempos = optional_param('startitempos', 0, PARAM_INT);
24 $lastitempos = optional_param('lastitempos', 0, PARAM_INT);
25 $anonymous_response = optional_param('anonymous_response', 0, PARAM_INT); //arb
27 $highlightrequired = false;
29 if(($formdata = data_submitted()) AND !confirm_sesskey()) {
30 print_error('invalidsesskey');
33 //if the use hit enter into a textfield so the form should not submit
34 if(isset($formdata->sesskey) AND !isset($formdata->savevalues) AND !isset($formdata->gonextpage) AND !isset($formdata->gopreviouspage)) {
35 $gopage = $formdata->lastpage;
38 if(isset($formdata->savevalues)) {
39 $savevalues = true;
40 }else {
41 $savevalues = false;
44 if($gopage < 0 AND !$savevalues) {
45 if(isset($formdata->gonextpage)){
46 $gopage = $lastpage + 1;
47 $gonextpage = true;
48 $gopreviouspage = false;
49 }else if(isset($formdata->gopreviouspage)){
50 $gopage = $lastpage - 1;
51 $gonextpage = false;
52 $gopreviouspage = true;
53 }else {
54 print_error('missingparameter');
56 }else {
57 $gonextpage = $gopreviouspage = false;
60 if (! $cm = get_coursemodule_from_id('feedback', $id)) {
61 print_error('invalidcoursemodule');
64 if (! $course = $DB->get_record("course", array("id"=>$cm->course))) {
65 print_error('coursemisconf');
68 if (! $feedback = $DB->get_record("feedback", array("id"=>$cm->instance))) {
69 print_error('invalidcoursemodule');
72 if (!$context = get_context_instance(CONTEXT_MODULE, $cm->id)) {
73 print_error('badcontext');
76 $feedback_complete_cap = false;
78 if(has_capability('mod/feedback:complete', $context)) {
79 $feedback_complete_cap = true;
82 //check whether the feedback is located and! started from the mainsite
83 if($course->id == SITEID AND !$courseid) {
84 $courseid = SITEID;
87 //check whether the feedback is mapped to the given courseid
88 if($course->id == SITEID AND !has_capability('mod/feedback:edititems', $context)) {
89 if($DB->get_records('feedback_sitecourse_map', array('feedbackid'=>$feedback->id))) {
90 if(!$DB->get_record('feedback_sitecourse_map', array('feedbackid'=>$feedback->id, 'courseid'=>$courseid))){
91 print_error('notavailable', 'feedback');
96 if($feedback->anonymous != FEEDBACK_ANONYMOUS_YES) {
97 if($course->id == SITEID) {
98 require_login($course->id, true);
99 }else {
100 require_login($course->id, true, $cm);
102 } else {
103 if($course->id == SITEID) {
104 require_course_login($course, true);
105 }else {
106 require_course_login($course, true, $cm);
110 //check whether the given courseid exists
111 if($courseid AND $courseid != SITEID) {
112 if($course2 = $DB->get_record('course', array('id'=>$courseid))){
113 require_course_login($course2); //this overwrites the object $course :-(
114 $course = $DB->get_record("course", array("id"=>$cm->course)); // the workaround
115 }else {
116 print_error('invalidcourseid');
120 if(!$feedback_complete_cap) {
121 print_error('error');
124 // Mark activity viewed for completion-tracking
125 $completion = new completion_info($course);
126 $completion->set_module_viewed($cm);
128 /// Print the page header
129 $strfeedbacks = get_string("modulenameplural", "feedback");
130 $strfeedback = get_string("modulename", "feedback");
132 if($course->id == SITEID) {
133 $PAGE->set_cm($cm, $course); // set's up global $COURSE
134 $PAGE->set_pagelayout('incourse');
137 $PAGE->navbar->add(get_string('feedback:complete', 'feedback'));
138 $PAGE->set_url('/mod/feedback/complete.php', array('id'=>$cm->id, 'gopage'=>$gopage, 'courseid'=>$course->id));
139 $PAGE->set_heading(format_string($course->fullname));
140 $PAGE->set_title(format_string($feedback->name));
141 echo $OUTPUT->header();
143 //ishidden check.
144 //feedback in courses
145 if ((empty($cm->visible) AND
146 !has_capability('moodle/course:viewhiddenactivities', $context)) AND
147 $course->id != SITEID) {
148 notice(get_string("activityiscurrentlyhidden"));
151 //ishidden check.
152 //feedback on mainsite
153 if ((empty($cm->visible) AND
154 !has_capability('moodle/course:viewhiddenactivities', $context)) AND
155 $courseid == SITEID) {
156 notice(get_string("activityiscurrentlyhidden"));
159 feedback_print_errors();
161 //check, if the feedback is open (timeopen, timeclose)
162 $checktime = time();
163 if(($feedback->timeopen > $checktime) OR ($feedback->timeclose < $checktime AND $feedback->timeclose > 0)) {
164 echo $OUTPUT->box_start('generalbox boxaligncenter');
165 echo '<h2><font color="red">'.get_string('feedback_is_not_open', 'feedback').'</font></h2>';
166 echo $OUTPUT->continue_button($CFG->wwwroot.'/course/view.php?id='.$course->id);
167 echo $OUTPUT->box_end();
168 echo $OUTPUT->footer();
169 exit;
172 //additional check for multiple-submit (prevent browsers back-button). the main-check is in view.php
173 $feedback_can_submit = true;
174 if($feedback->multiple_submit == 0 ) {
175 if(feedback_is_already_submitted($feedback->id, $courseid)) {
176 $feedback_can_submit = false;
179 if($feedback_can_submit) {
180 //preserving the items
181 if($preservevalues == 1){
182 if(!$SESSION->feedback->is_started == true)
183 print_error('error', '', $CFG->wwwroot.'/course/view.php?id='.$course->id);
184 //checken, ob alle required items einen wert haben
185 if(feedback_check_values($startitempos, $lastitempos)) {
186 $userid = $USER->id; //arb
187 if($completedid = feedback_save_values($USER->id, true)){
188 if($userid > 0) {
189 add_to_log($course->id, 'feedback', 'startcomplete', 'view.php?id='.$cm->id, $feedback->id, $cm->id, $userid);
191 if(!$gonextpage AND !$gopreviouspage) $preservevalues = false;//es kann gespeichert werden
193 }else {
194 $savereturn = 'failed';
195 if(isset($lastpage)) {
196 $gopage = $lastpage;
197 }else {
198 print_error('missingparameter');
201 }else {
202 $savereturn = 'missing';
203 $highlightrequired = true;
204 if(isset($lastpage)) {
205 $gopage = $lastpage;
206 }else {
207 print_error('missingparameter');
213 //saving the items
214 if($savevalues AND !$preservevalues){
215 //exists there any pagebreak, so there are values in the feedback_valuetmp
216 $userid = $USER->id; //arb
218 if($feedback->anonymous == FEEDBACK_ANONYMOUS_NO) {
219 $feedbackcompleted = feedback_get_current_completed($feedback->id, false, $courseid);
220 }else{
221 $feedbackcompleted = false;
223 $feedbackcompletedtmp = $DB->get_record('feedback_completedtmp', array('id'=>$completedid));
224 //fake saving for switchrole
225 $is_switchrole = feedback_check_is_switchrole();
226 if($is_switchrole) {
227 $savereturn = 'saved';
228 feedback_delete_completedtmp($completedid);
229 }else if($new_completed_id = feedback_save_tmp_values($feedbackcompletedtmp, $feedbackcompleted, $userid)) {
230 $savereturn = 'saved';
231 if($feedback->anonymous == FEEDBACK_ANONYMOUS_NO) {
232 add_to_log($course->id, 'feedback', 'submit', 'view.php?id='.$cm->id, $feedback->id, $cm->id, $userid);
233 feedback_send_email($cm, $feedback, $course, $userid);
234 }else {
235 feedback_send_email_anonym($cm, $feedback, $course, $userid);
237 //tracking the submit
238 $tracking = new stdClass();
239 $tracking->userid = $USER->id;
240 $tracking->feedback = $feedback->id;
241 $tracking->completed = $new_completed_id;
242 $DB->insert_record('feedback_tracking', $tracking);
243 unset($SESSION->feedback->is_started);
245 // Update completion state
246 $completion = new completion_info($course);
247 if ($completion->is_enabled($cm) && $feedback->completionsubmit) {
248 $completion->update_state($cm, COMPLETION_COMPLETE);
251 }else {
252 $savereturn = 'failed';
258 if($allbreaks = feedback_get_all_break_positions($feedback->id)){
259 if($gopage <= 0) {
260 $startposition = 0;
261 }else {
262 if(!isset($allbreaks[$gopage - 1])) {
263 $gopage = count($allbreaks);
265 $startposition = $allbreaks[$gopage - 1];
267 $ispagebreak = true;
268 }else {
269 $startposition = 0;
270 $newpage = 0;
271 $ispagebreak = false;
274 //get the feedbackitems after the last shown pagebreak
275 $feedbackitems = $DB->get_records_select('feedback_item', 'feedback = ? AND position > ?', array($feedback->id, $startposition), 'position');
277 //get the first pagebreak
278 if($pagebreaks = $DB->get_records('feedback_item', array('feedback'=>$feedback->id, 'typ'=>'pagebreak'), 'position')) {
279 $pagebreaks = array_values($pagebreaks);
280 $firstpagebreak = $pagebreaks[0];
281 }else {
282 $firstpagebreak = false;
284 $maxitemcount = $DB->count_records('feedback_item', array('feedback'=>$feedback->id));
286 //get the values of completeds before done. Anonymous user can not get these values.
287 if((!isset($SESSION->feedback->is_started)) AND (!isset($savereturn)) AND ($feedback->anonymous == FEEDBACK_ANONYMOUS_NO)) {
288 if(!$feedbackcompletedtmp = feedback_get_current_completed($feedback->id, true, $courseid)) {
289 if($feedbackcompleted = feedback_get_current_completed($feedback->id, false, $courseid)) {
290 //copy the values to feedback_valuetmp create a completedtmp
291 $feedbackcompletedtmp = feedback_set_tmp_values($feedbackcompleted);
294 }else {
295 $feedbackcompletedtmp = feedback_get_current_completed($feedback->id, true, $courseid);
298 /// Print the main part of the page
299 ///////////////////////////////////////////////////////////////////////////
300 ///////////////////////////////////////////////////////////////////////////
301 ///////////////////////////////////////////////////////////////////////////
302 $analysisurl = new moodle_url('/mod/feedback/analysis.php', array('id'=>$id));
303 if($courseid > 0) {
304 $analysisurl->param('courseid', $courseid);
306 echo $OUTPUT->heading(format_text($feedback->name));
308 if( (intval($feedback->publish_stats) == 1) AND
309 ( has_capability('mod/feedback:viewanalysepage', $context)) AND
310 !( has_capability('mod/feedback:viewreports', $context)) ) {
311 if($multiple_count = $DB->count_records('feedback_tracking', array('userid'=>$USER->id, 'feedback'=>$feedback->id))) {
312 echo $OUTPUT->box_start('mdl-align');
313 echo '<a href="'.$analysisurl->out().'">';
314 echo get_string('completed_feedbacks', 'feedback').'</a>';
315 echo $OUTPUT->box_end();
319 if(isset($savereturn) && $savereturn == 'saved') {
320 if($feedback->page_after_submit) {
321 echo $OUTPUT->box_start('generalbox boxaligncenter boxwidthwide');
322 echo format_text($feedback->page_after_submit, $feedback->page_after_submitformat, array('overflowdiv'=>true));
323 echo $OUTPUT->box_end();
324 } else {
325 echo '<p align="center"><b><font color="green">'.get_string('entries_saved','feedback').'</font></b></p>';
326 if( intval($feedback->publish_stats) == 1) {
327 echo '<p align="center"><a href="'.$analysisurl->out().'">';
328 echo get_string('completed_feedbacks', 'feedback').'</a>';
329 echo '</p>';
333 if($feedback->site_after_submit) {
334 echo $OUTPUT->continue_button(feedback_encode_target_url($feedback->site_after_submit));
335 }else {
336 if($courseid) {
337 if($courseid == SITEID) {
338 echo $OUTPUT->continue_button($CFG->wwwroot);
339 }else {
340 echo $OUTPUT->continue_button($CFG->wwwroot.'/course/view.php?id='.$courseid);
342 }else {
343 if($course->id == SITEID) {
344 echo $OUTPUT->continue_button($CFG->wwwroot);
345 } else {
346 echo $OUTPUT->continue_button($CFG->wwwroot.'/course/view.php?id='.$course->id);
350 }else {
351 if(isset($savereturn) && $savereturn == 'failed') {
352 echo $OUTPUT->box_start('mform error');
353 echo get_string('saving_failed','feedback');
354 echo $OUTPUT->box_end();
357 if(isset($savereturn) && $savereturn == 'missing') {
358 echo $OUTPUT->box_start('mform error');
359 echo get_string('saving_failed_because_missing_or_false_values','feedback');
360 echo $OUTPUT->box_end();
363 //print the items
364 if(is_array($feedbackitems)){
365 // echo $OUTPUT->box_start('generalbox boxaligncenter boxwidthwide');
366 echo $OUTPUT->box_start('feedback_form');
367 echo '<form action="complete.php" method="post" onsubmit=" ">';
368 echo '<fieldset>';
369 echo '<input type="hidden" name="sesskey" value="'.sesskey().'" />';
370 echo $OUTPUT->box_start('feedback_anonymousinfo');
371 switch ($feedback->anonymous) {
372 case FEEDBACK_ANONYMOUS_YES:
373 echo '<input type="hidden" name="anonymous" value="1" />';
374 echo '<input type="hidden" name="anonymous_response" value="'.FEEDBACK_ANONYMOUS_YES.'" />';
375 echo get_string('mode', 'feedback').': '.get_string('anonymous', 'feedback');
376 break;
377 case FEEDBACK_ANONYMOUS_NO:
378 echo '<input type="hidden" name="anonymous" value="0" />';
379 echo '<input type="hidden" name="anonymous_response" value="'.FEEDBACK_ANONYMOUS_NO.'" />';
380 echo get_string('mode', 'feedback').': '.get_string('non_anonymous', 'feedback');
381 break;
383 echo $OUTPUT->box_end();
384 //check, if there exists required-elements
385 $countreq = $DB->count_records('feedback_item', array('feedback'=>$feedback->id, 'required'=>1));
386 if($countreq > 0) {
387 echo '<span class="feedback_required_mark">(*)' . get_string('items_are_required', 'feedback') . '</span>';
389 echo $OUTPUT->box_start('feedback_items');
391 unset($startitem);
392 $itemnr = $DB->count_records_select('feedback_item', 'feedback = ? AND hasvalue = 1 AND position < ?', array($feedback->id, $startposition));
393 $lastbreakposition = 0;
394 $align = right_to_left() ? 'right' : 'left';
396 foreach($feedbackitems as $feedbackitem){
397 if(!isset($startitem)) {
398 //avoid showing double pagebreaks
399 if($feedbackitem->typ == 'pagebreak') {
400 continue;
402 $startitem = $feedbackitem;
405 if($feedbackitem->dependitem > 0) {
406 //chech if the conditions are ok
407 if(!isset($feedbackcompletedtmp->id) OR !feedback_compare_item_value($feedbackcompletedtmp->id, $feedbackitem->dependitem, $feedbackitem->dependvalue, true)) {
408 $lastitem = $feedbackitem;
409 $lastbreakposition = $feedbackitem->position;
410 continue;
414 if($feedbackitem->dependitem > 0) {
415 $dependstyle = ' feedback_complete_depend';
416 }else {
417 $dependstyle = '';
420 echo $OUTPUT->box_start('feedback_item_box_'.$align.$dependstyle);
421 $value = '';
422 //get the value
423 $frmvaluename = $feedbackitem->typ . '_'. $feedbackitem->id;
424 if(isset($savereturn)) {
425 $value = isset($formdata->{$frmvaluename})?$formdata->{$frmvaluename}:NULL;
426 }else {
427 if(isset($feedbackcompletedtmp->id)) {
428 $value = feedback_get_item_value($feedbackcompletedtmp->id, $feedbackitem->id, true);
431 if($feedbackitem->hasvalue == 1 AND $feedback->autonumbering) {
432 $itemnr++;
433 echo $OUTPUT->box_start('feedback_item_number_'.$align);
434 echo $itemnr;
435 echo $OUTPUT->box_end();
437 if($feedbackitem->typ != 'pagebreak') {
438 echo $OUTPUT->box_start('box generalbox boxalign_'.$align);
439 feedback_print_item_complete($feedbackitem, $value, $highlightrequired);
440 echo $OUTPUT->box_end();
442 echo $OUTPUT->box_end();
444 $lastbreakposition = $feedbackitem->position; //last item-pos (item or pagebreak)
445 if($feedbackitem->typ == 'pagebreak'){
446 break;
447 }else {
448 $lastitem = $feedbackitem;
451 echo $OUTPUT->box_end();
452 echo '<input type="hidden" name="id" value="'.$id.'" />';
453 echo '<input type="hidden" name="feedbackid" value="'.$feedback->id.'" />';
454 echo '<input type="hidden" name="lastpage" value="'.$gopage.'" />';
455 echo '<input type="hidden" name="completedid" value="'.(isset($feedbackcompletedtmp->id)?$feedbackcompletedtmp->id:'').'" />';
456 echo '<input type="hidden" name="courseid" value="'. $courseid . '" />';
457 echo '<input type="hidden" name="preservevalues" value="1" />';
458 if(isset($startitem)) {
459 echo '<input type="hidden" name="startitempos" value="'. $startitem->position . '" />';
460 echo '<input type="hidden" name="lastitempos" value="'. $lastitem->position . '" />';
463 if( $ispagebreak AND $lastbreakposition > $firstpagebreak->position) {
464 echo '<input name="gopreviouspage" type="submit" value="'.get_string('previous_page','feedback').'" />';
466 if($lastbreakposition < $maxitemcount){
467 echo '<input name="gonextpage" type="submit" value="'.get_string('next_page','feedback').'" />';
469 if($lastbreakposition >= $maxitemcount) { //last page
470 echo '<input name="savevalues" type="submit" value="'.get_string('save_entries','feedback').'" />';
473 echo '</fieldset>';
474 echo '</form>';
475 echo $OUTPUT->box_end();
477 echo $OUTPUT->box_start('feedback_complete_cancel');
478 if($courseid) {
479 echo '<form action="'.$CFG->wwwroot.'/course/view.php?id='.$courseid.'" method="post" onsubmit=" ">';
480 }else{
481 if($course->id == SITEID) {
482 echo '<form action="'.$CFG->wwwroot.'" method="post" onsubmit=" ">';
483 } else {
484 echo '<form action="'.$CFG->wwwroot.'/course/view.php?id='.$course->id.'" method="post" onsubmit=" ">';
487 echo '<fieldset>';
488 echo '<input type="hidden" name="sesskey" value="'.sesskey().'" />';
489 echo '<input type="hidden" name="courseid" value="'. $courseid . '" />';
490 echo '<button type="submit">'.get_string('cancel').'</button>';
491 echo '</fieldset>';
492 echo '</form>';
493 echo $OUTPUT->box_end();
494 $SESSION->feedback->is_started = true;
495 // echo $OUTPUT->box_end();
498 }else {
499 echo $OUTPUT->box_start('generalbox boxaligncenter');
500 echo '<h2><font color="red">'.get_string('this_feedback_is_already_submitted', 'feedback').'</font></h2>';
501 echo $OUTPUT->continue_button($CFG->wwwroot.'/course/view.php?id='.$course->id);
502 echo $OUTPUT->box_end();
504 /// Finish the page
505 ///////////////////////////////////////////////////////////////////////////
506 ///////////////////////////////////////////////////////////////////////////
507 ///////////////////////////////////////////////////////////////////////////
509 echo $OUTPUT->footer();