From db232bb0f46469592b7a0088aa38c73bfd960451 Mon Sep 17 00:00:00 2001 From: Frederic Massart Date: Mon, 17 Sep 2012 15:22:45 +0800 Subject: [PATCH] MDL-34607 File API: Natural sort on area tree files --- lib/filestorage/file_storage.php | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/lib/filestorage/file_storage.php b/lib/filestorage/file_storage.php index 917705b4493..11065452023 100644 --- a/lib/filestorage/file_storage.php +++ b/lib/filestorage/file_storage.php @@ -398,7 +398,7 @@ class file_storage { * @param bool $includedirs whether or not include directories * @return array of stored_files indexed by pathanmehash */ - public function get_area_files($contextid, $component, $filearea, $itemid = false, $sort = "sortorder, itemid, filepath, filename", $includedirs = true) { + public function get_area_files($contextid, $component, $filearea, $itemid = false, $sort = "itemid, filepath, filename", $includedirs = true) { global $DB; $conditions = array('contextid'=>$contextid, 'component'=>$component, 'filearea'=>$filearea); @@ -443,7 +443,7 @@ class file_storage { */ public function get_area_tree($contextid, $component, $filearea, $itemid) { $result = array('dirname'=>'', 'dirfile'=>null, 'subdirs'=>array(), 'files'=>array()); - $files = $this->get_area_files($contextid, $component, $filearea, $itemid, "sortorder, itemid, filepath, filename", true); + $files = $this->get_area_files($contextid, $component, $filearea, $itemid, '', true); // first create directory structure foreach ($files as $hash=>$dir) { if (!$dir->is_directory()) { @@ -480,9 +480,28 @@ class file_storage { $pointer['files'][$file->get_filename()] = $file; unset($pointer); } + $result = $this->sort_area_tree($result); return $result; } + /** + * Sorts the result of {@link file_storage::get_area_tree()}. + * + * @param array of results provided by {@link file_storage::get_area_tree()} + * @return array of sorted results + */ + protected function sort_area_tree($tree) { + foreach ($tree as $key => &$value) { + if ($key == 'subdirs') { + $value = $this->sort_area_tree($value); + collatorlib::ksort($value, collatorlib::SORT_NATURAL); + } else if ($key == 'files') { + collatorlib::ksort($value, collatorlib::SORT_NATURAL); + } + } + return $tree; + } + /** * Returns all files and optionally directories *