From: skodak Date: Sun, 3 Aug 2008 17:05:09 +0000 (+0000) Subject: MDL-14589 implemented directory listing X-Git-Url: http://git.mjollnir.org/gw?a=commitdiff_plain;h=ee03a6514e6fb9c5816365d21a3628e20fafa21b;p=moodle.git MDL-14589 implemented directory listing --- diff --git a/lib/file/file_browser.php b/lib/file/file_browser.php index 62d405c60f..33a22698bf 100644 --- a/lib/file/file_browser.php +++ b/lib/file/file_browser.php @@ -208,60 +208,30 @@ class file_browser { * Returns content of local directory */ public function build_stored_file_children($context, $filearea, $itemid, $filepath, $urlbase, $areavisiblename, $itemidused, $readaccess, $writeaccess) { - global $DB; - - $dirs = array(); - $files = array(); + $result = array(); $fs = get_file_storage(); - $level = substr_count($filepath, '/'); - // TODO: this should be improved ;-) - $localfiles = $fs->get_area_files($context->id, $filearea, $itemid, "filepath, filename"); + $localfiles = $fs->get_directory_files($context->id, $filearea, $itemid, $filepath, false, true, "filepath, filename"); foreach ($localfiles as $file) { - $name = $file->get_filename(); - $path = $file->get_filepath(); - $l = substr_count($path, '/'); - - if ($filepath === $path) { - if ($name !== '.') { - $files[] = new file_info_stored($this, $context, $file, $urlbase, $areavisiblename, $itemidused, $readaccess, $writeaccess); - } - } else if ($level == $l-1 and $name === '.' and strpos($path, $filepath) === 0) { - $dirs[] = new file_info_stored($this, $context, $file, $urlbase, $areavisiblename, $itemidused, $readaccess, $writeaccess); - } + $result[] = new file_info_stored($this, $context, $file, $urlbase, $areavisiblename, $itemidused, $readaccess, $writeaccess); } - return array_merge($dirs, $files); + return $result; } /** * Returns content of coursefiles directory */ public function build_coursefile_children($context, $filepath) { - global $DB; - - $dirs = array(); - $files = array(); + $result = array(); $fs = get_file_storage(); - $level = substr_count($filepath, '/'); - // TODO: this should be improved ;-) - $localfiles = $fs->get_area_files($context->id, 'course_content', 0, "filepath, filename"); + $localfiles = $fs->get_directory_files($context->id, 'course_content', 0, $filepath, false, true, "filepath, filename"); foreach ($localfiles as $file) { - $name = $file->get_filename(); - $path = $file->get_filepath(); - $l = substr_count($path, '/'); - - if ($filepath === $path) { - if ($name !== '.') { - $files[] = new file_info_coursefile($this, $context, $file); - } - } else if ($level == $l-1 and $name === '.' and strpos($path, $filepath) === 0) { - $dirs[] = new file_info_coursefile($this, $context, $file); - } + $result[] = new file_info_coursefile($this, $context, $file); } - return array_merge($dirs, $files); + return $result; } public function encodepath($urlbase, $path, $forcedownload=false, $https=false) { diff --git a/lib/file/file_storage.php b/lib/file/file_storage.php index c00a157042..40befb7987 100644 --- a/lib/file/file_storage.php +++ b/lib/file/file_storage.php @@ -154,6 +154,89 @@ class file_storage { return $result; } + /** + * Returns all files and otionally directories + * @param int $contextid + * @param string $filearea + * @param int $itemid + * @param int $filepath directory path + * @param bool $recursive include all subdirectories + * @param bool $includedirs inlcude files and directories + * @param string $sort + * @return array of stored_files + */ + public function get_directory_files($contextid, $filearea, $itemid, $filepath, $recursive=false, $inludedirs=true, $sort="filepath, filename") { + global $DB; + + if (!$directory = $this->get_file($contextid, $filearea, $itemid, $filepath, '.')) { + return array(); + } + + if ($recursive) { + + $dirs = $inludedirs ? "" : "AND filename <> '.'"; + $length = textlib_get_instance()->strlen($filepath); + + $sql = "SELECT * + FROM {files} + WHERE contextid = :contextid AND filearea = :filearea AND itemid = :itemid + AND ".$DB->sql_substr()."(filepath, 1, $length) = :filepath + AND id <> :dirid + $dirs + ORDER BY $sort"; + $params = array('contextid'=>$contextid, 'filearea'=>$filearea, 'itemid'=>$itemid, 'filepath'=>$filepath, 'dirid'=>$directory->get_id()); + + $files = array(); + $dirs = array(); + $file_records = $DB->get_records_sql($sql, $params); + foreach ($file_records as $file_record) { + if ($file_record->filename == '.') { + $dirs[] = new stored_file($this, $file_record); + } else { + $files[] = new stored_file($this, $file_record); + } + } + $result = array_merge($dirs, $files); + + } else { + $result = array(); + $params = array('contextid'=>$contextid, 'filearea'=>$filearea, 'itemid'=>$itemid, 'filepath'=>$filepath, 'dirid'=>$directory->get_id()); + + $length = textlib_get_instance()->strlen($filepath); + + if ($inludedirs) { + $sql = "SELECT * + FROM {files} + WHERE contextid = :contextid AND filearea = :filearea + AND itemid = :itemid AND filename = '.' + AND ".$DB->sql_substr()."(filepath, 1, $length) = :filepath + AND id <> :dirid + ORDER BY $sort"; + $reqlevel = substr_count($filepath, '/') + 1; + $file_records = $DB->get_records_sql($sql, $params); + foreach ($file_records as $file_record) { + if (substr_count($file_record->filepath, '/') !== $reqlevel) { + continue; + } + $result[] = new stored_file($this, $file_record); + } + } + + $sql = "SELECT * + FROM {files} + WHERE contextid = :contextid AND filearea = :filearea AND itemid = :itemid + AND filepath = :filepath AND filename <> '.' + ORDER BY $sort"; + + $file_records = $DB->get_records_sql($sql, $params); + foreach ($file_records as $file_record) { + $result[] = new stored_file($this, $file_record); + } + } + + return $result; + } + /** * Delete all area files (optionally limited by itemid) * @param int $contextid diff --git a/lib/file/stored_file.php b/lib/file/stored_file.php index bc41d219f7..8e536247cd 100644 --- a/lib/file/stored_file.php +++ b/lib/file/stored_file.php @@ -172,4 +172,8 @@ class stored_file { public function get_status() { return $this->file_record->status; } + + public function get_id() { + return $this->file_record->id; + } }