MDL-34607 File API: Natural sort on area tree files

This commit is contained in:
Frederic Massart
2012-09-21 10:08:46 +08:00
parent a3ab18c735
commit db232bb0f4
+21 -2
View File
@@ -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
*