]> git.mjollnir.org Git - moodle.git/commitdiff
MDL-18910 full support for module intro editor with embedded images
authorskodak <skodak>
Tue, 21 Apr 2009 21:17:21 +0000 (21:17 +0000)
committerskodak <skodak>
Tue, 21 Apr 2009 21:17:21 +0000 (21:17 +0000)
23 files changed:
course/modedit.php
course/moodleform_mod.php
lang/en_utf8/moodle.php
lib/moodlelib.php
lib/weblib.php
mod/assignment/lib.php
mod/assignment/mod_form.php
mod/chat/lib.php
mod/choice/lib.php
mod/data/lib.php
mod/feedback/lib.php
mod/forum/lib.php
mod/forum/post_form.php
mod/glossary/edit_form.php
mod/glossary/lib.php
mod/label/lib.php
mod/lesson/lib.php
mod/quiz/lib.php
mod/resource/lib.php
mod/scorm/lib.php
mod/survey/lib.php
mod/wiki/lib.php
pluginfile.php

index 304d66bd6dcf477160083a84c2809b8ae267c167..54a514117499d23eede99119f1707c46b3254b6f 100644 (file)
         $form->add              = $add;
         $form->return           = 0; //must be false if this is an add, go back to course view on cancel
 
+        if (plugin_supports('mod', $form->modulename, FEATURE_MOD_INTRO, true)) {
+            $draftid_editor = file_get_submitted_draft_itemid('introeditor');
+            file_prepare_draft_area($draftid_editor, null, null, null);
+            $form->introeditor = array('text'=>'', 'format'=>FORMAT_HTML, 'itemid'=>$draftid_editor); // TODO: add better default
+        }
+
         // Turn off default grouping for modules that don't provide group mode
         if ($add=='resource' || $add=='glossary' || $add=='label') {
             $form->groupingid = 0;
             $form->showavailability   = $cm->showavailability;
         }
 
+        if (plugin_supports('mod', $form->modulename, FEATURE_MOD_INTRO, true)) {
+            $draftid_editor = file_get_submitted_draft_itemid('introeditor');
+            $currentintro = file_prepare_draft_area($draftid_editor, $context->id, $form->modulename.'_intro', 0, true, $form->intro);
+            $form->introeditor = array('text'=>$currentintro, 'format'=>$form->introformat, 'itemid'=>$draftid_editor);
+        }
+
         if ($items = grade_item::fetch_all(array('itemtype'=>'mod', 'itemmodule'=>$form->modulename,
                                                  'iteminstance'=>$form->instance, 'courseid'=>$course->id))) {
             // add existing outcomes
 
             $DB->update_record('course_modules', $cm);
 
+            $modcontext = get_context_instance(CONTEXT_MODULE, $fromform->coursemodule);
+    
+            // update embedded links and save files
+            if (plugin_supports('mod', $fromform->modulename, FEATURE_MOD_INTRO, true)) {
+                $fromform->intro = file_save_draft_area_files($fromform->introeditor['itemid'], $modcontext->id,
+                                                              $fromform->modulename.'_intro', 0,
+                                                              true, $fromform->introeditor['text']);
+                $fromform->introformat = $fromform->introeditor['format'];
+                unset($fromform->introeditor);
+            }
+            
             if (!$updateinstancefunction($fromform, $mform)) {
                 print_error('cannotupdatemod', '', 'view.php?id=$course->id', $fromform->modulename);
             }
                 print_error('cannotaddcoursemodule');
             }
 
+            $modcontext = get_context_instance(CONTEXT_MODULE, $fromform->coursemodule);
+    
+            // update embedded links and save files
+            if (plugin_supports('mod', $fromform->modulename, FEATURE_MOD_INTRO, true)) {
+                $fromform->intro = file_save_draft_area_files($fromform->introeditor['itemid'], $modcontext->id,
+                                                              $fromform->modulename.'_intro', 0,
+                                                              true, $fromform->introeditor['text']);
+                $fromform->introformat = $fromform->introeditor['format'];
+                unset($fromform->introeditor);
+            }
+
             $returnfromfunc = $addinstancefunction($fromform, $mform);
 
             if (!$returnfromfunc or !is_number($returnfromfunc)) {
             }
 
             // Set up conditions
-            if($CFG->enableavailability) {
-                condition_info::update_cm_from_form(
-                    (object)array('id'=>$fromform->coursemodule),$fromform,false);
+            if ($CFG->enableavailability) {
+                condition_info::update_cm_from_form((object)array('id'=>$fromform->coursemodule), $fromform, false);
             }
 
             add_to_log($course->id, "course", "add mod",
index 7c275bd23ea106dbcc93034749bbe82348629dd9..bb763864d6dd5d0085dcfb0ecbbde5329f5b80a3 100644 (file)
@@ -70,7 +70,7 @@ class moodleform_mod extends moodleform {
         $this->_features->outcomes          = (!empty($CFG->enableoutcomes) and plugin_supports('mod', $this->_modname, FEATURE_GRADE_OUTCOMES, true));
         $this->_features->hasgrades         = plugin_supports('mod', $this->_modname, FEATURE_GRADE_HAS_GRADE, false);
         $this->_features->idnumber          = plugin_supports('mod', $this->_modname, FEATURE_IDNUMBER, true);
-        $this->_features->introeditor       = plugin_supports('mod', $this->_modname, FEATURE_MODEDIT_INTRO_EDITOR, true);
+        $this->_features->introeditor       = plugin_supports('mod', $this->_modname, FEATURE_MOD_INTRO, true);
         $this->_features->defaultcompletion = plugin_supports('mod', $this->_modname, FEATURE_MODEDIT_DEFAULT_COMPLETION, true);
 
         $this->_features->gradecat          = ($this->_features->outcomes or $this->_features->hasgrades);
@@ -572,6 +572,22 @@ class moodleform_mod extends moodleform {
         $mform->setType('return', PARAM_BOOL);
     }
 
+    function add_intro_editor($required=false, $customlabel=null) {
+        if (!$this->_features->introeditor) {
+            // intro editor not supported in this module
+            return;
+        }
+
+        $mform = $this->_form;
+        $label = is_null($customlabel) ? get_string('moduleintro') : $customlabel;
+
+        $mform->addElement('editor', 'introeditor', $label, array('maxfiles'=>EDITOR_UNLIMITED_FILES));
+        $mform->setType('introeditor', PARAM_RAW); // no XSS prevention here, users must be trusted
+        if ($required) {
+            $mform->addRule('introeditor', get_string('required'), 'required', null, 'client');
+        }
+    }
+
     /**
      * Overriding formslib's add_action_buttons() method, to add an extra submit "save changes and return" button.
      *
@@ -589,7 +605,7 @@ class moodleform_mod extends moodleform {
             $submit2label = get_string('savechangesandreturntocourse');
         }
 
-        $mform =& $this->_form;
+        $mform = $this->_form;
 
         // elements in a row need a group
         $buttonarray = array();
index 817f6513ee3841c67e18a25e4cc34efdcb35f653..928e3a0eac939b0ced7b2a40efa0ddfc7c35f5e2 100644 (file)
@@ -1010,6 +1010,7 @@ $string['missingusername'] = 'Missing username';
 $string['modified'] = 'Modified';
 $string['moduledeleteconfirm'] = 'You are about to completely delete the module \'$a\'.  This will completely delete everything in the database associated with this activity module.  Are you SURE you want to continue?';
 $string['moduledeletefiles'] = 'All data associated with the module \'$a->module\' has been deleted from the database.  To complete the deletion (and prevent the module re-installing itself), you should now delete this directory from your server: $a->directory';
+$string['moduleintro'] = 'Description';
 $string['modulesetup'] = 'Setting up module tables';
 $string['modulesuccess'] = '$a tables have been set up correctly';
 $string['moodledocs'] = 'Moodle Docs';
index 7076044063997d11c51c75e18a16df0b9d731457..948a2765ee1f621f603c85ed14f5dcfae26ab273 100644 (file)
@@ -318,7 +318,7 @@ define('FEATURE_GROUPINGS', 'groupings');
 define('FEATURE_GROUPMEMBERSONLY', 'groupmembersonly');
 
 /** True if module supports intro editor */
-define('FEATURE_MODEDIT_INTRO_EDITOR', 'modedit_intro_editor');
+define('FEATURE_MOD_INTRO', 'mod_intro');
 /** True if module has default completion */
 define('FEATURE_MODEDIT_DEFAULT_COMPLETION', 'modedit_default_completion');
 
index 9ad99356f326dcffb04010ef028dbe040e5768ba..af987dbe918b79485960473889810b63b7a8aad9 100644 (file)
@@ -1550,6 +1550,19 @@ function filter_text($text, $courseid=NULL) {
 
     return filter_manager::instance()->filter_text($text, $context, $courseid);
 }
+/**
+ * Formats activity intro text
+ * @param string $module name of module
+ * @param object $activity instance of activity
+ * @param int $cmid course module id
+ * @return text
+ */
+function format_module_intro($module, $activity, $cmid) {
+    $options = (object)array('noclean'=>true);
+    $context = get_context_instance(CONTEXT_MODULE, $cmid);
+    $intro = file_rewrite_pluginfile_urls($activity->intro, 'pluginfile.php', $context->id, $module.'_intro', 0);
+    return format_text($intro, $activity->introformat, $options);
+}
 
 /**
  * Legacy function, used for cleaning of old forum and glossary text only.
index bc9c50191af784c15716717b9d0a8cf54aaf0fbc..548794be7023cffaf168f844441ec0cfd40ad8a2 100644 (file)
@@ -160,9 +160,7 @@ class assignment_base {
      */
     function view_intro() {
         print_simple_box_start('center', '', '', 0, 'generalbox', 'intro');
-        $formatoptions = new stdClass;
-        $formatoptions->noclean = true;
-        echo format_text($this->assignment->intro, $this->assignment->introformat, $formatoptions);
+        echo format_module_intro('assignment', $this->assignment, $this->cm->id);
         print_simple_box_end();
     }
 
@@ -358,7 +356,7 @@ class assignment_base {
             if ($assignment->timedue) {
                 $event = new object();
                 $event->name        = $assignment->name;
-                $event->description = $assignment->intro;
+                $event->description = format_module_intro('assignment', $assignment, $assignment->coursemodule);
                 $event->courseid    = $assignment->course;
                 $event->groupid     = 0;
                 $event->userid      = 0;
@@ -447,14 +445,14 @@ class assignment_base {
             if ($event->id = $DB->get_field('event', 'id', array('modulename'=>'assignment', 'instance'=>$assignment->id))) {
 
                 $event->name        = $assignment->name;
-                $event->description = $assignment->intro;
+                $event->description = format_module_intro('assignment', $assignment, $assignment->coursemodule);
                 $event->timestart   = $assignment->timedue;
 
                 update_event($event);
             } else {
                 $event = new object();
                 $event->name        = $assignment->name;
-                $event->description = $assignment->intro;
+                $event->description = format_module_intro('assignment', $assignment, $assignment->coursemodule);
                 $event->courseid    = $assignment->course;
                 $event->groupid     = 0;
                 $event->userid      = 0;
@@ -2429,9 +2427,10 @@ function assignment_refresh_events($courseid = 0) {
     $moduleid = $DB->get_field('modules', 'id', array('name'=>'assignment'));
 
     foreach ($assignments as $assignment) {
+        $cm = get_coursemodule_from_id('assignment', $assignment->id);
         $event = NULL;
         $event->name        = $assignment->name;
-        $event->description = $assignment->intro;
+        $event->description = format_module_intro('assignment', $assignment, $cm->id);
         $event->timestart   = $assignment->timedue;
 
         if ($event->id = $DB->get_field('event', 'id', array('modulename'=>'assignment', 'instance'=>$assignment->id))) {
@@ -3241,7 +3240,7 @@ function assignment_supports($feature) {
         case FEATURE_GROUPS:                  return true;
         case FEATURE_GROUPINGS:               return true;
         case FEATURE_GROUPMEMBERSONLY:        return true;
-        case FEATURE_MODEDIT_INTRO_EDITOR:    return true;
+        case FEATURE_MOD_INTRO:               return true;
         case FEATURE_COMPLETION_TRACKS_VIEWS: return true;
         case FEATURE_GRADE_HAS_GRADE:         return true;
         case FEATURE_GRADE_OUTCOMES:          return true;
index 7802a6102a73c47bdbdcd1c7ade9d158b1ff7800..8ed8b2db43c9fd25a847dffe0209f7b147daf6b4 100644 (file)
@@ -39,10 +39,7 @@ class mod_assignment_mod_form extends moodleform_mod {
         }
         $mform->addRule('name', null, 'required', null, 'client');
 
-        $mform->addElement('htmleditor', 'intro', get_string('description', 'assignment'));
-        $mform->setType('intro', PARAM_RAW);
-        $mform->setHelpButton('intro', array('writing', 'questions', 'richtext2'), false, 'editorhelpbutton');
-        $mform->addRule('intro', get_string('required'), 'required', null, 'client');
+        $this->add_intro_editor(true, get_string('description', 'assignment'));
 
         $mform->addElement('modgrade', 'grade', get_string('grade'));
         $mform->setDefault('grade', 100);
index 9dd173dcf4bb7a5017217c9a36f5d423d201238f..7476b683de8d2b48d76b346507629f776273815f 100644 (file)
@@ -980,7 +980,7 @@ function chat_supports($feature) {
         case FEATURE_GROUPS:                  return true;
         case FEATURE_GROUPINGS:               return true;
         case FEATURE_GROUPMEMBERSONLY:        return true;
-        case FEATURE_MODEDIT_INTRO_EDITOR:    return true;
+        case FEATURE_MOD_INTRO:               return true;
         case FEATURE_COMPLETION_TRACKS_VIEWS: return false;
         case FEATURE_GRADE_HAS_GRADE:         return false;
         case FEATURE_GRADE_OUTCOMES:          return true;
index 3cc1325a6dcc2058d47f784c56afbef42d666d67..889c0aa10fa6fa78e0dcc7bd7dc6347a04e22553 100644 (file)
@@ -765,7 +765,7 @@ function choice_supports($feature) {
         case FEATURE_GROUPS:                  return true;
         case FEATURE_GROUPINGS:               return true;
         case FEATURE_GROUPMEMBERSONLY:        return true;
-        case FEATURE_MODEDIT_INTRO_EDITOR:    return true;
+        case FEATURE_MOD_INTRO:               return true;
         case FEATURE_COMPLETION_TRACKS_VIEWS: return true;
         case FEATURE_GRADE_HAS_GRADE:         return false;
         case FEATURE_GRADE_OUTCOMES:          return false;
index 273015f1a13727bcc022c8b76ed6395b01fc4908..f05b690552cd93da5e120ed05de0bbfd3930b8e7 100755 (executable)
@@ -2328,7 +2328,7 @@ function data_supports($feature) {
         case FEATURE_GROUPS:                  return true;
         case FEATURE_GROUPINGS:               return true;
         case FEATURE_GROUPMEMBERSONLY:        return true;
-        case FEATURE_MODEDIT_INTRO_EDITOR:    return true;
+        case FEATURE_MOD_INTRO:               return true;
         case FEATURE_COMPLETION_TRACKS_VIEWS: return true;
         case FEATURE_GRADE_HAS_GRADE:         return true;
         case FEATURE_GRADE_OUTCOMES:          return true;
index cf56fdceea0c8910f7bebe28436df355fd9a0a6f..801c0d4dffd744f1e7cdd0ccdd202ef6e18e9d24 100644 (file)
@@ -38,7 +38,7 @@ function feedback_supports($feature) {
         case FEATURE_GROUPS:                  return true;
         case FEATURE_GROUPINGS:               return true;
         case FEATURE_GROUPMEMBERSONLY:        return true;
-        case FEATURE_MODEDIT_INTRO_EDITOR:    return true;
+        case FEATURE_MOD_INTRO:               return true;
         case FEATURE_COMPLETION_TRACKS_VIEWS: return true;
         case FEATURE_GRADE_HAS_GRADE:         return false;
         case FEATURE_GRADE_OUTCOMES:          return false;
index 04fadf769cab0ef2d724bf84745b9bfe5b6caeae..c241ea0e7296ddbcf7432396da5025c5cbf79a09 100644 (file)
@@ -240,7 +240,7 @@ function forum_supports($feature) {
         case FEATURE_GROUPS:                  return true;
         case FEATURE_GROUPINGS:               return true;
         case FEATURE_GROUPMEMBERSONLY:        return true;
-        case FEATURE_MODEDIT_INTRO_EDITOR:    return true;
+        case FEATURE_MOD_INTRO:               return true;
         case FEATURE_COMPLETION_TRACKS_VIEWS: return true;
         case FEATURE_COMPLETION_HAS_RULES:    return true;
         case FEATURE_GRADE_HAS_GRADE:         return true;
@@ -4064,22 +4064,6 @@ function forum_pluginfile($course, $cminfo, $context, $filearea, $args) {
         return false;
     }
 
-    if ($filearea === 'forum_intro') {
-        // all users may access it
-        $relativepath = '/'.implode('/', $args);
-        $fullpath = $context->id.'forum_intro0'.$relativepath;
-
-        $fs = get_file_storage();
-        if (!$file = $fs->get_file_by_hash(sha1($fullpath)) or $file->is_directory()) {
-            return false;
-        }
-
-        $lifetime = isset($CFG->filelifetime) ? $CFG->filelifetime : 86400;
-
-        // finally send the file
-        send_stored_file($file, $lifetime, 0);
-    }
-
     $fileareas = array('forum_attachment', 'forum_post');
     if (!in_array($filearea, $fileareas)) {
         return false;
index a5238a2c4d417a81c1798e3fdeb154f6c3c8f670..ff0a0fa585c162f4d6960a19f8ee09b3405b9e0c 100644 (file)
@@ -23,8 +23,7 @@ class mod_forum_post_form extends moodleform {
         $mform->addRule('subject', get_string('required'), 'required', null, 'client');
         $mform->addRule('subject', get_string('maximumchars', '', 255), 'maxlength', 255, 'client');
 
-        $mform->addElement('editor', 'message', get_string('message', 'forum'),
-                array('maxfiles' => EDITOR_UNLIMITED_FILES, 'filearea' => 'forum_post'));
+        $mform->addElement('editor', 'message', get_string('message', 'forum'), array('maxfiles' => EDITOR_UNLIMITED_FILES));
         $mform->setType('message', PARAM_RAW);
         $mform->addRule('message', get_string('required'), 'required', null, 'client');
         $mform->setHelpButton('message', array('reading', 'writing', 'questions', 'richtext2'), false, 'editorhelpbutton');
index 28f4237827a89ebca91eb62899ceb0ba1c3e9ba1..90b82572894c50d5d1ad2ad90667471e605e30ea 100644 (file)
@@ -17,8 +17,7 @@ class mod_glossary_entry_form extends moodleform {
         $mform->setType('concept', PARAM_TEXT);
         $mform->addRule('concept', null, 'required', null, 'client');
 
-        $mform->addElement('editor', 'entry', get_string('definition', 'glossary'),
-                           array('maxfiles' => EDITOR_UNLIMITED_FILES, 'filearea' => 'glossary_entry'));
+        $mform->addElement('editor', 'entry', get_string('definition', 'glossary'), array('maxfiles' => EDITOR_UNLIMITED_FILES));
         $mform->setType('entry', PARAM_RAW);
         $mform->addRule('entry', get_string('required'), 'required', null, 'client');
         $mform->setHelpButton('entry', array('reading', 'writing', 'questions', 'richtext2'), false, 'editorhelpbutton');
index da878e71e47e72f93a95d70dadcdc27b374ff153..0d0798a01a1d25386e82be316708722b59e2a930 100644 (file)
@@ -1084,22 +1084,7 @@ function glossary_pluginfile($course, $cminfo, $context, $filearea, $args) {
         return false;
     }
 
-    if ($filearea === 'glossary_intro') {
-        // all users may access it
-        $relativepath = '/'.implode('/', $args);
-        $fullpath = $context->id.'glossary_intro0'.$relativepath;
-
-        $fs = get_file_storage();
-        if (!$file = $fs->get_file_by_hash(sha1($fullpath)) or $file->is_directory()) {
-            return false;
-        }
-
-        $lifetime = isset($CFG->filelifetime) ? $CFG->filelifetime : 86400;
-
-        // finally send the file
-        send_stored_file($file, $lifetime, 0);
-
-    } else if ($filearea === 'glossary_attachment' or $filearea === 'glossary_entry') {
+    if ($filearea === 'glossary_attachment' or $filearea === 'glossary_entry') {
         $entryid = (int)array_shift($args);
 
         if (!$entry = $DB->get_record('glossary_entries', array('id'=>$entryid))) {
@@ -2277,7 +2262,7 @@ function glossary_supports($feature) {
         case FEATURE_GROUPS:                  return false;
         case FEATURE_GROUPINGS:               return false;
         case FEATURE_GROUPMEMBERSONLY:        return true;
-        case FEATURE_MODEDIT_INTRO_EDITOR:    return true;
+        case FEATURE_MOD_INTRO:               return true;
         case FEATURE_COMPLETION_TRACKS_VIEWS: return true;
         case FEATURE_GRADE_HAS_GRADE:         return true;
         case FEATURE_GRADE_OUTCOMES:          return true;
index a8a2e2e8de3b0647485a54875da094ab48edb381..e7768349e659d139298e54af65586a6b0e7e3f97 100644 (file)
@@ -145,7 +145,7 @@ function label_supports($feature) {
         case FEATURE_GROUPS:                  return false;
         case FEATURE_GROUPINGS:               return false;
         case FEATURE_GROUPMEMBERSONLY:        return true;
-        case FEATURE_MODEDIT_INTRO_EDITOR:    return false;
+        case FEATURE_MOD_INTRO:    return false;
         case FEATURE_COMPLETION_TRACKS_VIEWS: return false;
         case FEATURE_GRADE_HAS_GRADE:         return false;
         case FEATURE_GRADE_OUTCOMES:          return false;
index e3893b79ba9a2707b72e6d470c3c42a51aec6ebc..138fe5bb34f2c7e71b2b8b82417cdcc4026710a7 100644 (file)
@@ -720,7 +720,7 @@ function lesson_supports($feature) {
         case FEATURE_GROUPS:                  return false;
         case FEATURE_GROUPINGS:               return false;
         case FEATURE_GROUPMEMBERSONLY:        return true;
-        case FEATURE_MODEDIT_INTRO_EDITOR:    return true;
+        case FEATURE_MOD_INTRO:               return true;
         case FEATURE_COMPLETION_TRACKS_VIEWS: return true;
         case FEATURE_GRADE_HAS_GRADE:         return true;
         case FEATURE_GRADE_OUTCOMES:          return true;
index e03fbb62c593efae1f0249399c80ee2f717bd311..c20d6cf7fe77ed7eef98ff99445fb92afa00a56a 100644 (file)
@@ -1255,7 +1255,7 @@ function quiz_supports($feature) {
         case FEATURE_GROUPS:                  return true;
         case FEATURE_GROUPINGS:               return true;
         case FEATURE_GROUPMEMBERSONLY:        return true;
-        case FEATURE_MODEDIT_INTRO_EDITOR:    return true;
+        case FEATURE_MOD_INTRO:               return true;
         case FEATURE_COMPLETION_TRACKS_VIEWS: return true;
         case FEATURE_GRADE_HAS_GRADE:         return true;
         case FEATURE_GRADE_OUTCOMES:          return true;
index 45e5bc8ca6dfb426cffc56ec8d8fb5abfecf0c87..f892283e15a7c644a951953d5636404362d902b4 100644 (file)
@@ -764,7 +764,7 @@ function resource_supports($feature) {
         case FEATURE_GROUPS:                  return false;
         case FEATURE_GROUPINGS:               return false;
         case FEATURE_GROUPMEMBERSONLY:        return true;
-        case FEATURE_MODEDIT_INTRO_EDITOR:    return true;
+        case FEATURE_MOD_INTRO:               return true;
         case FEATURE_COMPLETION_TRACKS_VIEWS: return true;
         case FEATURE_GRADE_HAS_GRADE:         return false;
         case FEATURE_GRADE_OUTCOMES:          return false;
index cfcf39a5a672ece2d63573c8fe83bc5f43b7baea..4076547a7275c7b433241b47de01cf75825fcea4 100755 (executable)
@@ -820,7 +820,7 @@ function scorm_supports($feature) {
         case FEATURE_GROUPS:                  return false;
         case FEATURE_GROUPINGS:               return false;
         case FEATURE_GROUPMEMBERSONLY:        return true;
-        case FEATURE_MODEDIT_INTRO_EDITOR:    return true;
+        case FEATURE_MOD_INTRO:               return true;
         case FEATURE_COMPLETION_TRACKS_VIEWS: return true;
         case FEATURE_GRADE_HAS_GRADE:         return true;
         case FEATURE_GRADE_OUTCOMES:          return true;
index f181b853f781db2e1305219f82e87cf8bf53a1ab..cf0bc9569a171108309ae3ae670512fa1556bae0 100644 (file)
@@ -597,7 +597,7 @@ function survey_supports($feature) {
         case FEATURE_GROUPS:                  return true;
         case FEATURE_GROUPINGS:               return true;
         case FEATURE_GROUPMEMBERSONLY:        return true;
-        case FEATURE_MODEDIT_INTRO_EDITOR:    return true;
+        case FEATURE_MOD_INTRO:               return true;
         case FEATURE_COMPLETION_TRACKS_VIEWS: return true;
         case FEATURE_GRADE_HAS_GRADE:         return true;
         case FEATURE_GRADE_OUTCOMES:          return true;
index 3f75c579cf8dbe2df2183c73d76052f2e8b7bbac..d63ea6272e5425c7b866b39ff7feea0160352f88 100644 (file)
@@ -1777,7 +1777,7 @@ function wiki_supports($feature) {
         case FEATURE_GROUPS:                  return true;
         case FEATURE_GROUPINGS:               return true;
         case FEATURE_GROUPMEMBERSONLY:        return true;
-        case FEATURE_MODEDIT_INTRO_EDITOR:    return true;
+        case FEATURE_MOD_INTRO:               return true;
         case FEATURE_COMPLETION_TRACKS_VIEWS: return true;
         case FEATURE_GRADE_HAS_GRADE:         return false;
         case FEATURE_GRADE_OUTCOMES:          return true;
index 4a7f327d09c337fa36a222578421d88167dccbf3..4014e345eafd5b499ffa730b15a74559ec821055 100644 (file)
         $cminfo = $modinfo->cms[$context->instanceid];
         $modname = $cminfo->modname;
         $libfile = "$CFG->dirroot/mod/$modname/lib.php";
-        if (file_exists($libfile)) {
-            require_once($libfile);
-            $filefunction = $modname.'_pluginfile';
-            if (function_exists($filefunction)) {
-                if ($filefunction($course, $cminfo, $context, $filearea, $args) !== false) {
-                    die;
-                }
+        if (!file_exists($libfile)) {
+            send_file_not_found();
+        }
+
+        require_once($libfile);
+        if ($filearea === $modname.'_intro') {
+            if (!plugin_supports('mod', $modname, FEATURE_MOD_INTRO, true)) {
+                send_file_not_found();
+            }
+            if (!$cminfo->uservisible) {
+                send_file_not_found();
+            }
+            // all users may access it
+            $itemid = (int)array_shift($args);
+            $relativepath = '/'.implode('/', $args);
+            $fullpath = $context->id.$filearea.'0'.$relativepath;
+            
+            $fs = get_file_storage();
+            if (!$file = $fs->get_file_by_hash(sha1($fullpath)) or $file->is_directory()) {
+                send_file_not_found();
+            }
+            
+            $lifetime = isset($CFG->filelifetime) ? $CFG->filelifetime : 86400;
+    
+            // finally send the file
+            send_stored_file($file, $lifetime, 0);
+        }
+
+        $filefunction = $modname.'_pluginfile';
+        if (function_exists($filefunction)) {
+            if ($filefunction($course, $cminfo, $context, $filearea, $args) !== false) {
+                die;
             }
         }
-        send_file_not_found();
 
     } else if ($context->contextlevel == CONTEXT_BLOCK) {
         //not supported yet