From 21cadefea35d256ca3ba05c743556aaa7118321b Mon Sep 17 00:00:00 2001 From: Andreas Grabs Date: Sat, 25 Feb 2012 12:26:29 +0100 Subject: [PATCH] MDL-31768 - it is not possible to add a picture to the thanks page in feedback --- .../moodle2/backup_feedback_stepslib.php | 1 + .../moodle2/restore_feedback_stepslib.php | 1 + mod/feedback/complete.php | 14 +- mod/feedback/complete_guest.php | 13 +- mod/feedback/lib.php | 120 +++++++++++++++--- mod/feedback/mod_form.php | 42 ++++-- mod/feedback/view.php | 14 +- 7 files changed, 173 insertions(+), 32 deletions(-) diff --git a/mod/feedback/backup/moodle2/backup_feedback_stepslib.php b/mod/feedback/backup/moodle2/backup_feedback_stepslib.php index 142244a0ad7..38177065f66 100644 --- a/mod/feedback/backup/moodle2/backup_feedback_stepslib.php +++ b/mod/feedback/backup/moodle2/backup_feedback_stepslib.php @@ -133,6 +133,7 @@ class backup_feedback_activity_structure_step extends backup_activity_structure_ // Define file annotations $feedback->annotate_files('mod_feedback', 'intro', null); // This file area hasn't itemid + $feedback->annotate_files('mod_feedback', 'page_after_submit', null); // This file area hasn't itemid $item->annotate_files('mod_feedback', 'item', 'id'); diff --git a/mod/feedback/backup/moodle2/restore_feedback_stepslib.php b/mod/feedback/backup/moodle2/restore_feedback_stepslib.php index fea78c19585..71e164efce0 100644 --- a/mod/feedback/backup/moodle2/restore_feedback_stepslib.php +++ b/mod/feedback/backup/moodle2/restore_feedback_stepslib.php @@ -121,6 +121,7 @@ class restore_feedback_activity_structure_step extends restore_activity_structur protected function after_execute() { // Add feedback related files, no need to match by itemname (just internally handled context) $this->add_related_files('mod_feedback', 'intro', null); + $this->add_related_files('mod_feedback', 'page_after_submit', null); $this->add_related_files('mod_feedback', 'item', 'feedback_item'); } } diff --git a/mod/feedback/complete.php b/mod/feedback/complete.php index 7f81b9b9a04..c4d72b71d67 100644 --- a/mod/feedback/complete.php +++ b/mod/feedback/complete.php @@ -318,8 +318,20 @@ 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($feedback->page_after_submit, $feedback->page_after_submitformat, array('overflowdiv'=>true)); + echo format_text($page_after_submit_output, + $feedback->page_after_submitformat, + array('overflowdiv' => true)); echo $OUTPUT->box_end(); } else { echo '

'.get_string('entries_saved','feedback').'

'; diff --git a/mod/feedback/complete_guest.php b/mod/feedback/complete_guest.php index a25946d2920..99c530f41ce 100644 --- a/mod/feedback/complete_guest.php +++ b/mod/feedback/complete_guest.php @@ -281,8 +281,19 @@ 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($feedback->page_after_submit, $feedback->page_after_submitformat, array('overflowdiv'=>true)); + echo format_text($page_after_submit_output, + $feedback->page_after_submitformat, + array('overflowdiv' => true)); echo $OUTPUT->box_end(); } else { echo '

'.get_string('entries_saved','feedback').'

'; diff --git a/mod/feedback/lib.php b/mod/feedback/lib.php index f818fea6047..5ecf3d0ac6c 100644 --- a/mod/feedback/lib.php +++ b/mod/feedback/lib.php @@ -98,6 +98,22 @@ function feedback_add_instance($feedback) { feedback_set_events($feedback); + if (!isset($feedback->coursemodule)) { + $cm = get_coursemodule_from_id('feedback', $feedback->id); + $feedback->coursemodule = $cm->id; + } + $context = get_context_instance(CONTEXT_MODULE, $feedback->coursemodule); + + $editoroptions = feedback_get_editor_options(); + + // process the custom wysiwyg editor in page_after_submit + if ($draftitemid = $feedback->page_after_submit_editor['itemid']) { + $feedback->page_after_submit = file_save_draft_area_files($draftitemid, $context->id, 'mod_feedback', 'page_after_submit', + 0, $editoroptions, $feedback->page_after_submit_editor['text']); + $feedback->page_after_submitformat = $feedback->page_after_submit_editor['format']; + } + $DB->update_record('feedback', $feedback); + return $feedbackid; } @@ -131,6 +147,18 @@ function feedback_update_instance($feedback) { //create or update the new events feedback_set_events($feedback); + $context = get_context_instance(CONTEXT_MODULE, $feedback->coursemodule); + + $editoroptions = feedback_get_editor_options(); + + // process the custom wysiwyg editor in page_after_submit + if ($draftitemid = $feedback->page_after_submit_editor['itemid']) { + $feedback->page_after_submit = file_save_draft_area_files($draftitemid, $context->id, 'mod_feedback', 'page_after_submit', + 0, $editoroptions, $feedback->page_after_submit_editor['text']); + $feedback->page_after_submitformat = $feedback->page_after_submit_editor['format']; + } + $DB->update_record('feedback', $feedback); + return true; } @@ -148,42 +176,87 @@ function feedback_update_instance($feedback) { function feedback_pluginfile($course, $cm, $context, $filearea, $args, $forcedownload) { global $CFG, $DB; - require_login($course, false, $cm); - - $itemid = (int)array_shift($args); - - require_course_login($course, true, $cm); - - if (!$item = $DB->get_record('feedback_item', array('id'=>$itemid))) { - return false; + if ($filearea === 'item' or $filearea === 'template') { + $itemid = (int)array_shift($args); + //get the item what includes the file + if (!$item = $DB->get_record('feedback_item', array('id'=>$itemid))) { + return false; + } + $feedbackid = $item->feedback; + $templateid = $item->template; } - if (!has_capability('mod/feedback:view', $context)) { + if ($filearea === 'page_after_submit' or $filearea === 'item') { + if (! $feedback = $DB->get_record("feedback", array("id"=>$cm->instance))) { + return false; + } + + $feedbackid = $feedback->id; + + //if the filearea is "item" so we check the permissions like view/complete the feedback + $canload = false; + //first check whether the user has the complete capability + if (has_capability('mod/feedback:complete', $context)) { + $canload = true; + } + + //now we check whether the user has the view capability + if (has_capability('mod/feedback:view', $context)) { + $canload = true; + } + + //if the feedback is on frontpage and anonymous and the fullanonymous is allowed + //so the file can be loaded too. + if (isset($CFG->feedback_allowfullanonymous) + AND $CFG->feedback_allowfullanonymous + AND $course->id == SITEID + AND $feedback->anonymous == FEEDBACK_ANONYMOUS_YES ) { + $canload = true; + } + + if (!$canload) { + return false; + } + } else if ($filearea === 'template') { //now we check files in templates + if (!$template = $DB->get_record('feedback_template', array('id'=>$templateid))) { + return false; + } + + //if the file is not public so the capability edititems has to be there + if (!$template->ispublic) { + if (!has_capability('mod/feedback:edititems', $context)) { + return false; + } + } else { //on public templates, at least the user has to be logged in + if (!isloggedin()) { + return false; + } + } + } else { return false; } if ($context->contextlevel == CONTEXT_MODULE) { - if ($filearea !== 'item') { - return false; - } - - if ($item->feedback == $cm->instance) { - $filecontext = $context; - } else { + if ($filearea !== 'item' and $filearea !== 'page_after_submit') { return false; } } - if ($context->contextlevel == CONTEXT_COURSE) { + if ($context->contextlevel == CONTEXT_COURSE || $context->contextlevel == CONTEXT_SYSTEM) { if ($filearea !== 'template') { return false; } } $relativepath = implode('/', $args); - $fullpath = "/$context->id/mod_feedback/$filearea/$itemid/$relativepath"; + if ($filearea === 'page_after_submit') { + $fullpath = "/{$context->id}/mod_feedback/$filearea/$relativepath"; + } else { + $fullpath = "/{$context->id}/mod_feedback/$filearea/{$item->id}/$relativepath"; + } $fs = get_file_storage(); + if (!$file = $fs->get_file_by_hash(sha1($fullpath)) or $file->is_directory()) { return false; } @@ -194,7 +267,6 @@ function feedback_pluginfile($course, $cm, $context, $filearea, $args, $forcedow return false; } - /** * this will delete a given instance. * all referenced data also will be deleted @@ -635,6 +707,16 @@ function feedback_reset_course_form($course) { } } +/** + * This gets an array with default options for the editor + * + * @return array the options + */ +function feedback_get_editor_options() { + return array('maxfiles' => EDITOR_UNLIMITED_FILES, + 'trusttext'=>true); +} + /** * This creates new events given as timeopen and closeopen by $feedback. * diff --git a/mod/feedback/mod_form.php b/mod/feedback/mod_form.php index fe3c4d7763e..28903326a98 100644 --- a/mod/feedback/mod_form.php +++ b/mod/feedback/mod_form.php @@ -18,6 +18,8 @@ class mod_feedback_mod_form extends moodleform_mod { function definition() { global $CFG, $DB; + $editoroptions = feedback_get_editor_options(); + $mform =& $this->_form; //------------------------------------------------------------------------------- @@ -81,8 +83,13 @@ class mod_feedback_mod_form extends moodleform_mod { //------------------------------------------------------------------------------- $mform->addElement('header', 'aftersubmithdr', get_string('after_submit', 'feedback')); - $mform->addElement('editor', 'page_after_submit', get_string("page_after_submit", "feedback"), null, null); - $mform->setType('page_after_submit', PARAM_RAW); + $mform->addElement('editor', + 'page_after_submit_editor', + get_string("page_after_submit", "feedback"), + null, + $editoroptions); + + $mform->setType('page_after_submit_editor', PARAM_RAW); $mform->addElement('text', 'site_after_submit', get_string('url_for_continue_button', 'feedback'), array('size'=>'64','maxlength'=>'255')); $mform->setType('site_after_submit', PARAM_TEXT); @@ -105,20 +112,35 @@ class mod_feedback_mod_form extends moodleform_mod { } else { $default_values['closeenable'] = 1; } - if (!isset($default_values['page_after_submitformat'])) { - $default_values['page_after_submitformat'] = FORMAT_HTML; + + $editoroptions = feedback_get_editor_options(); + + if ($this->current->instance) { + // editing an existing feedback - let us prepare the added editor elements (intro done automatically) + $draftitemid = file_get_submitted_draft_itemid('page_after_submit'); + $default_values['page_after_submit_editor']['text'] = + file_prepare_draft_area($draftitemid, $this->context->id, + 'mod_feedback', 'page_after_submit', false, + $editoroptions, + $default_values['page_after_submit']); + + $default_values['page_after_submit_editor']['format'] = $default_values['page_after_submitformat']; + $default_values['page_after_submit_editor']['itemid'] = $draftitemid; + } else { + // adding a new feedback instance + $draftitemid = file_get_submitted_draft_itemid('page_after_submit_editor'); + file_prepare_draft_area($draftitemid, null, 'mod_feedback', 'page_after_submit', false); // no context yet, itemid not used + $default_values['page_after_submit_editor']['text'] = ''; + $default_values['page_after_submit_editor']['format'] = editors_get_preferred_format(); + $default_values['page_after_submit_editor']['itemid'] = $draftitemid; } - if (!isset($default_values['page_after_submit'])) { - $default_values['page_after_submit'] = ''; - } - $default_values['page_after_submit'] = array('text'=>$default_values['page_after_submit'],'format'=>$default_values['page_after_submitformat']); } function get_data() { $data = parent::get_data(); if ($data) { - $data->page_after_submitformat = $data->page_after_submit['format']; - $data->page_after_submit = $data->page_after_submit['text']; + $data->page_after_submitformat = $data->page_after_submit_editor['format']; + $data->page_after_submit = $data->page_after_submit_editor['text']; // Turn off completion settings if the checkboxes aren't ticked $autocompletion = !empty($data->completion) && $data->completion==COMPLETION_TRACKING_AUTOMATIC; diff --git a/mod/feedback/view.php b/mod/feedback/view.php index ac4fc9d4fad..667839fd227 100644 --- a/mod/feedback/view.php +++ b/mod/feedback/view.php @@ -166,9 +166,21 @@ echo format_module_intro('feedback', $feedback, $cm->id); echo $OUTPUT->box_end(); if(has_capability('mod/feedback:edititems', $context)) { + 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->heading(get_string("page_after_submit", "feedback"), 4); echo $OUTPUT->box_start('generalbox boxaligncenter boxwidthwide'); - echo format_text($feedback->page_after_submit, $feedback->page_after_submitformat, array('overflowdiv'=>true)); + echo format_text($page_after_submit_output, + $feedback->page_after_submitformat, + array('overflowdiv'=>true)); + echo $OUTPUT->box_end(); }