From d6f7cbfd9838478c2f3cf5122b15a1a188967231 Mon Sep 17 00:00:00 2001 From: skodak Date: Sat, 6 Sep 2008 17:00:43 +0000 Subject: [PATCH] MDL-16374 support for file browsing in modules --- lib/file/file_browser.php | 70 +++++++++++++++++++++++++++++++++-- lib/file/file_info_course.php | 11 ++++++ lib/file/file_info_module.php | 2 +- mod/forum/lib.php | 11 ++++++ 4 files changed, 89 insertions(+), 5 deletions(-) diff --git a/lib/file/file_browser.php b/lib/file/file_browser.php index 1e29acc4e9..9c3cffa88c 100644 --- a/lib/file/file_browser.php +++ b/lib/file/file_browser.php @@ -1,6 +1,7 @@ libdir/file/file_info.php"); +require_once("$CFG->libdir/file/file_info_module.php"); require_once("$CFG->libdir/file/file_info_stored.php"); require_once("$CFG->libdir/file/file_info_system.php"); require_once("$CFG->libdir/file/file_info_user.php"); @@ -23,7 +24,7 @@ class file_browser { * @return object file_info object or null if not found or access not allowed */ public function get_file_info($context, $filearea=null, $itemid=null, $filepath=null, $filename=null) { - global $USER, $CFG, $DB; + global $USER, $CFG, $DB, $COURSE; $fs = get_file_storage(); @@ -117,12 +118,13 @@ class file_browser { } // TODO: localise return new file_info_stored($this, $context, $storedfile, $urlbase, 'Category introduction files', false, true, true); - } } } else if ($context->contextlevel == CONTEXT_COURSE) { - if (!$course = $DB->get_record('course', array('id'=>$context->instanceid))) { + if ($context->instanceid == $COURSE->id) { + $course = $COURSE; + } else if (!$course = $DB->get_record('course', array('id'=>$context->instanceid))) { return null; } @@ -198,7 +200,67 @@ class file_browser { } } else if ($context->contextlevel == CONTEXT_MODULE) { - //TODO + if (!$cm = get_coursemodule_from_id('', $context->instanceid)) { + return null; + } + + if ($cm->course == $COURSE->id) { + $course = $COURSE; + } else if (!$course = $DB->get_record('course', array('id'=>$cm->course))) { + return null; + } + + $modinfo = get_fast_modinfo($course); + + if (empty($modinfo->cms[$cm->id]->uservisible)) { + return null; + } + + $modname = $modinfo->cms[$cm->id]->modname; + + $libfile = "$CFG->dirroot/mod/$modname/lib.php"; + if (!file_exists($libfile)) { + return null; + } + require_once($libfile); + + $fileinfofunction = $modname.'_get_file_areas'; + if (function_exists($fileinfofunction)) { + $areas = $fileinfofunction($course, $cm, $context); + } else { + return null; + } + if (is_null($filearea) or is_null($itemid)) { + return new file_info_module($this, $course, $cm, $context, $areas); + + } else if (!isset($areas[$filearea])) { + return null; + + } else if ($filearea === $modname.'_intro') { + if (!has_capability('moodle/course:managefiles', $context)) { + return null; + } + + $filepath = is_null($filepath) ? '/' : $filepath; + $filename = is_null($filename) ? '.' : $filename; + + $urlbase = $CFG->wwwroot.'/pluginfile.php'; + if (!$storedfile = $fs->get_file($context->id, $filearea, 0, $filepath, $filename)) { + if ($filepath === '/' and $filename === '.') { + $storedfile = $fs->create_directory($context->id, $filearea, 0, $filepath); + } else { + // not found + return null; + } + } + return new file_info_stored($this, $context, $storedfile, $urlbase, $areas[$filearea], false, true, true); + + } else { + $fileinfofunction = $modname.'_get_file_info'; + if (function_exists($fileinfofunction)) { + return $fileinfofunction($course, $cm, $context, $filearea); + } + } } return null; diff --git a/lib/file/file_info_course.php b/lib/file/file_info_course.php index dd8bf79918..f723b805bd 100644 --- a/lib/file/file_info_course.php +++ b/lib/file/file_info_course.php @@ -50,6 +50,17 @@ class file_info_course extends file_info { } } + $modinfo = get_fast_modinfo($this->course); + foreach ($modinfo->cms as $cminfo) { + if (empty($cminfo->uservisible)) { + continue; + } + $modcontext = get_context_instance(CONTEXT_MODULE, $cminfo->id); + if ($child = $this->browser->get_file_info($modcontext)) { + $children[] = $child; + } + } + return $children; } diff --git a/lib/file/file_info_module.php b/lib/file/file_info_module.php index c4b1992db4..7b1951eaf1 100644 --- a/lib/file/file_info_module.php +++ b/lib/file/file_info_module.php @@ -22,7 +22,7 @@ class file_info_module extends file_info { } public function get_visible_name() { - return $this->cm->name.' ('.$this->cm->modname.')'; + return $this->cm->name.' ('.get_string('modulename', $this->cm->modname).')'; } public function is_writable() { diff --git a/mod/forum/lib.php b/mod/forum/lib.php index 2500ee5475..451e5808ce 100644 --- a/mod/forum/lib.php +++ b/mod/forum/lib.php @@ -3976,6 +3976,17 @@ function forum_print_attachments($post, $cm, $type) { } } +/** + * Lists all browsable file areas + */ +function forum_get_file_areas($course, $cm, $context) { + $areas = array(); + if (has_capability('moodle/course:managefiles', $context)) { + $areas['forum_intro'] = 'Forum introduction files'; // TODO: localise + } + return $areas; +} + /** * Serves the forum attachments. Implements needed access control ;-) */ -- 2.39.5