]> git.mjollnir.org Git - moodle.git/commitdiff
MDL-14589 implemented directory listing
authorskodak <skodak>
Sun, 3 Aug 2008 17:05:09 +0000 (17:05 +0000)
committerskodak <skodak>
Sun, 3 Aug 2008 17:05:09 +0000 (17:05 +0000)
lib/file/file_browser.php
lib/file/file_storage.php
lib/file/stored_file.php

index 62d405c60f60043cbb530f54fc03e15cc048d61f..33a22698bf7aa62f2cd056e336f7447361724206 100644 (file)
@@ -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) {
index c00a157042f7c6502ab9273eaf368a197c9977bc..40befb7987b1cb1bbe14fc9951237bd97d6b3cc3 100644 (file)
@@ -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
index bc41d219f7f2d0e66f0b9ae1700e2445cdf8d13a..8e536247cd5098d28360f248839c62a13c3abe4b 100644 (file)
@@ -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;
+    }
 }