require_once("$CFG->libdir/file/file_info_user.php");
require_once("$CFG->libdir/file/file_info_coursecat.php");
require_once("$CFG->libdir/file/file_info_course.php");
+require_once("$CFG->libdir/file/file_info_coursesection.php");
require_once("$CFG->libdir/file/file_info_coursefile.php");
require_once("$CFG->libdir/file/virtual_root_file.php");
return null;
}
- if (!is_null($filearea) and !in_array($filearea, array('course_intro', 'course_content', 'course_backup'))) {
+ if (!is_null($filearea) and !in_array($filearea, array('course_intro', 'course_content', 'course_section', 'course_backup'))) {
// file area does not exist, sorry
$filearea = null;
}
$filepath = is_null($filepath) ? '/' : $filepath;
$filename = is_null($filename) ? '.' : $filename;
- if (is_null($filearea) or is_null($itemid)) {
+ if (is_null($filearea)) {
return new file_info_course($this, $context, $course);
} else {
if (!has_capability('moodle/course:update', $context)) {
return null;
}
+ if (is_null($itemid)) {
+ return new file_info_course($this, $context, $course);
+ }
$urlbase = $CFG->wwwroot.'/pluginfile.php';
if (!$storedfile = $fs->get_file($context->id, $filearea, 0, $filepath, $filename)) {
}
return new file_info_stored($this, $context, $storedfile, $urlbase, get_string('areacourseintro', 'repository'), false, true, true, false);
+ } else if ($filearea === 'course_section') {
+ if (!has_capability('moodle/course:update', $context)) {
+ return null;
+ }
+ $urlbase = $CFG->wwwroot.'/pluginfile.php';
+
+ if (empty($itemid)) {
+ // list all sections
+ return new file_info_coursesection($this, $context, $course);
+ }
+
+ if (!$section = $DB->get_record('course_sections', array('course'=>$course->id, 'id'=>$itemid))) {
+ return null; // does not exist
+ }
+
+ if (!$storedfile = $fs->get_file($context->id, $filearea, $itemid, $filepath, $filename)) {
+ if ($filepath === '/' and $filename === '.') {
+ $storedfile = new virtual_root_file($context->id, $filearea, $itemid);
+ } else {
+ // not found
+ return null;
+ }
+ }
+ return new file_info_stored($this, $context, $storedfile, $urlbase, $section->section, true, true, true, false);
+
} else if ($filearea == 'course_backup') {
if (!has_capability('moodle/site:backup', $context) and !has_capability('moodle/site:restore', $context)) {
return null;
}
+ if (is_null($itemid)) {
+ return new file_info_course($this, $context, $course);
+ }
$urlbase = $CFG->wwwroot.'/pluginfile.php';
if (!$storedfile = $fs->get_file($context->id, $filearea, 0, $filepath, $filename)) {
if (!has_capability('moodle/course:managefiles', $context)) {
return null;
}
+ if (is_null($itemid)) {
+ return new file_info_course($this, $context, $course);
+ }
if (!$storedfile = $fs->get_file($context->id, $filearea, 0, $filepath, $filename)) {
if ($filepath === '/' and $filename === '.') {
/**
* Returns content of local directory
*/
- public function build_stored_file_children($context, $filearea, $itemid, $filepath, $urlbase, $areavisiblename, $itemidused, $readaccess, $writeaccess) {
+ public function build_stored_file_children($context, $filearea, $itemid, $filepath, $urlbase, $topvisiblename, $itemidused, $readaccess, $writeaccess) {
$result = array();
$fs = get_file_storage();
$storedfiles = $fs->get_directory_files($context->id, $filearea, $itemid, $filepath, false, true, "filepath, filename");
foreach ($storedfiles as $file) {
- $result[] = new file_info_stored($this, $context, $file, $urlbase, $areavisiblename, $itemidused, $readaccess, $writeaccess, false);
+ $result[] = new file_info_stored($this, $context, $file, $urlbase, $topvisiblename, $itemidused, $readaccess, $writeaccess, false);
}
return $result;
public function get_children() {
$children = array();
- if (has_capability('moodle/course:update', $this->context)) {
- if ($child = $this->browser->get_file_info($this->context, 'course_intro', 0)) {
- $children[] = $child;
- }
+ if ($child = $this->browser->get_file_info($this->context, 'course_intro', 0)) {
+ $children[] = $child;
+ }
+ if ($child = $this->browser->get_file_info($this->context, 'course_section')) {
+ $children[] = $child;
}
- if (has_capability('moodle/site:backup', $this->context) or has_capability('moodle/site:restorep', $this->context)) {
- if ($child = $this->browser->get_file_info($this->context, 'course_backup', 0)) {
- $children[] = $child;
- }
+ if ($child = $this->browser->get_file_info($this->context, 'course_backup', 0)) {
+ $children[] = $child;
}
- if (has_capability('moodle/course:managefiles', $this->context)) {
- if ($child = $this->browser->get_file_info($this->context, 'course_content', 0)) {
- $children[] = $child;
- }
+ if ($child = $this->browser->get_file_info($this->context, 'course_content', 0)) {
+ $children[] = $child;
}
$modinfo = get_fast_modinfo($this->course);
--- /dev/null
+<?php //$Id$
+
+/**
+ * Represents a course category context in the tree navigated by @see{file_browser}.
+ */
+class file_info_coursesection extends file_info {
+ protected $course;
+
+ public function __construct($browser, $context, $course) {
+ parent::__construct($browser, $context);
+ $this->course = $course;
+ }
+
+ public function get_params() {
+ return array('contextid'=>$this->context->id,
+ 'filearea' =>'course_section',
+ 'itemid' =>null,
+ 'filepath' =>null,
+ 'filename' =>null);
+ }
+
+ public function get_visible_name() {
+ $format = $this->course->format;
+ $sectionsname = get_string("coursesections$format","format_$format"); // TODO: localise
+ if ($sectionsname === "[[coursesections$format]]") {
+ $sectionsname = get_string("coursesections$format", 'repository'); // TODO: localise
+ }
+
+ return $sectionsname;
+ }
+
+ public function is_writable() {
+ return false;
+ }
+
+ public function is_directory() {
+ return true;
+ }
+
+ public function get_children() {
+ global $DB;
+
+ $children = array();
+
+ $course_sections = $DB->get_records('course_sections', array('course'=>$this->course->id), 'section');
+ foreach ($course_sections as $section) {
+ if ($child = $this->browser->get_file_info($this->context, 'course_section', $section->id)) {
+ $children[] = $child;
+ }
+ }
+
+ return $children;
+ }
+
+ public function get_parent() {
+ return $this->browser->get_file_info($this->context);
+ }
+}
class file_info_stored extends file_info {
protected $lf;
protected $urlbase;
- protected $areavisiblename;
+ protected $topvisiblename;
protected $itemidused;
protected $readaccess;
protected $writeaccess;
protected $areaonly;
- public function __construct($browser, $context, $storedfile, $urlbase, $areavisiblename, $itemidused, $readaccess, $writeaccess, $areaonly) {
+ public function __construct($browser, $context, $storedfile, $urlbase, $topvisiblename, $itemidused, $readaccess, $writeaccess, $areaonly) {
parent::__construct($browser, $context);
- $this->lf = $storedfile;
- $this->urlbase = $urlbase;
- $this->areavisiblename = $areavisiblename;
- $this->itemidused = $itemidused;
- $this->readaccess = $readaccess;
- $this->writeaccess = $writeaccess;
- $this->areaonly = $areaonly;
+ $this->lf = $storedfile;
+ $this->urlbase = $urlbase;
+ $this->topvisiblename = $topvisiblename;
+ $this->itemidused = $itemidused;
+ $this->readaccess = $readaccess;
+ $this->writeaccess = $writeaccess;
+ $this->areaonly = $areaonly;
}
public function get_params() {
$dir = explode('/', $dir);
$dir = array_pop($dir);
if ($dir === '') {
- if ($this->areaonly) {
- return $this->areavisiblename;
- } else if ($this->itemidused) {
- return $this->lf->get_itemid();
- } else {
- return $this->areavisiblename;
- }
+ return $this->topvisiblename;
} else {
return $dir;
}
return array();
}
return $this->browser->build_stored_file_children($this->context, $this->lf->get_filearea(), $this->lf->get_itemid(), $this->lf->get_filepath(),
- $this->urlbase, $this->areavisiblename, $this->itemidused, $this->readaccess, $this->writeaccess,
+ $this->urlbase, $this->topvisiblename, $this->itemidused, $this->readaccess, $this->writeaccess,
$this->areaonly);
}
if ($this->areaonly) {
return null;
} else if ($this->itemidused) {
- return $this->browser->get_file_info($this->context, $this->lf->get_filearea(), $this->lf->get_itemid());
- } else {
return $this->browser->get_file_info($this->context, $this->lf->get_filearea());
+ } else {
+ return $this->browser->get_file_info($this->context);
}
}
return array('filecount'=>count($draftfiles));
}
+/**
+ * Returns draftitemid of given editor element.
+ * @param string $elname name of formlib editor element
+ * @return int 0 if not submitted yet
+ */
+function file_get_submitted_draftitemid($elname) {
+ if (!empty($_REQUEST[$elname]['itemid']) and confirm_sesskey()) {
+ return (int)$_REQUEST[$elname]['itemid'];
+ }
+ return 0;
+}
+
/**
* Converts absolute links in text and merges draft files to target area.
* @param int $draftitemid
}
public function get_visible_name() {
if ($this->lf->get_filepath() === '/' and $this->lf->get_filename() === '.') {
- return $this->areavisiblename;
+ return $this->topvisiblename;
}
return parent::get_visible_name();
}
session_get_instance()->write_close(); // unlock session during fileserving
send_stored_file($file, 60*60, 0, false); // TODO: change timeout?
+ } else if ($filearea === 'course_section') {
+ if ($CFG->forcelogin) {
+ require_login($course);
+ } else if ($course->id !== SITEID) {
+ require_login($course);
+ }
+
+ $sectionid = (int)array_shift($args);
+
+ if ($course->numsections < $sectionid) {
+ if (!has_capability('moodle/course:update', $context)) {
+ // disable access to invisible sections if can not edit course
+ // this is going to break some ugly hacks, but is necessary
+ send_file_not_found();
+ }
+ }
+
+ $relativepath = '/'.implode('/', $args);
+ $fullpath = $context->id.'course_section'.$sectionid.$relativepath;
+
+ if (!$file = $fs->get_file_by_hash(sha1($fullpath)) or $file->is_directory()) {
+ send_file_not_found();
+ }
+
+ session_get_instance()->write_close(); // unlock session during fileserving
+ send_stored_file($file, 60*60, 0, false); // TODO: change timeout?
+
} else if ($filearea === 'user_profile') {
$userid = (int)array_shift($args);
$usercontext = get_context_instance(CONTEXT_USER, $userid);