diff --git a/lib/filestorage/zip_archive.php b/lib/filestorage/zip_archive.php index f22a28c89f5..435660ecd94 100644 --- a/lib/filestorage/zip_archive.php +++ b/lib/filestorage/zip_archive.php @@ -361,7 +361,7 @@ class zip_archive extends file_archive { if (!isset($this->za)) { return false; } - $localname = ltrim($localname, '/'). '/'; + $localname = trim($localname, '/'). '/'; $localname = $this->mangle_pathname($localname); if ($localname === '/') { @@ -369,10 +369,12 @@ class zip_archive extends file_archive { return false; } - if (!$this->za->addEmptyDir($localname)) { - return false; + if ($localname !== '') { + if (!$this->za->addEmptyDir($localname)) { + return false; + } + $this->modified = true; } - $this->modified = true; return true; } diff --git a/lib/form/filemanager.js b/lib/form/filemanager.js index 27036aa2db0..16d93c771c2 100644 --- a/lib/form/filemanager.js +++ b/lib/form/filemanager.js @@ -220,9 +220,9 @@ M.form_filemanager.init = function(Y, options) { params: {'filepath':filepath}, callback: function(id, obj, args) { scope.filecount = obj.filecount; - scope.check_buttons(); scope.options = obj; scope.lazyloading = {}; + scope.check_buttons(); scope.render(obj); } }, true); diff --git a/repository/draftfiles_ajax.php b/repository/draftfiles_ajax.php index 43ff97d678c..b88cff8b7eb 100644 --- a/repository/draftfiles_ajax.php +++ b/repository/draftfiles_ajax.php @@ -220,7 +220,11 @@ switch ($action) { $parent_path = $file->get_parent_directory()->get_filepath(); - if ($newfile = $zipper->archive_to_storage(array($file), $user_context->id, 'user', 'draft', $draftid, $parent_path, $filepath.'.zip', $USER->id)) { + $filepath = explode('/', trim($file->get_filepath(), '/')); + $filepath = array_pop($filepath); + $zipfile = repository::get_unused_filename($draftid, $parent_path, $filepath . '.zip'); + + if ($newfile = $zipper->archive_to_storage(array($filepath => $file), $user_context->id, 'user', 'draft', $draftid, $parent_path, $zipfile, $USER->id)) { $return = new stdClass(); $return->filepath = $parent_path; echo json_encode($return); @@ -242,19 +246,18 @@ switch ($action) { $stored_file = $fs->get_file($user_context->id, 'user', 'draft', $draftid, $filepath, '.'); if ($filepath === '/') { - $parent_path = '/'; $filename = get_string('files').'.zip'; } else { - $parent_path = $stored_file->get_parent_directory()->get_filepath(); - $filename = trim($filepath, '/').'.zip'; + $filename = explode('/', trim($filepath, '/')); + $filename = array_pop($filename) . '.zip'; } // archive compressed file to an unused draft area $newdraftitemid = file_get_unused_draft_itemid(); - if ($newfile = $zipper->archive_to_storage(array($stored_file), $user_context->id, 'user', 'draft', $newdraftitemid, '/', $filename, $USER->id)) { + if ($newfile = $zipper->archive_to_storage(array('/' => $stored_file), $user_context->id, 'user', 'draft', $newdraftitemid, '/', $filename, $USER->id)) { $return = new stdClass(); $return->fileurl = moodle_url::make_draftfile_url($newdraftitemid, '/', $filename)->out(); - $return->filepath = $parent_path; + $return->filepath = $filepath; echo json_encode($return); } else { echo json_encode(false); diff --git a/repository/draftfiles_manager.php b/repository/draftfiles_manager.php index 28e585f86b2..e398b5340d3 100644 --- a/repository/draftfiles_manager.php +++ b/repository/draftfiles_manager.php @@ -139,17 +139,17 @@ case 'downloaddir': $zipper = new zip_packer(); $file = $fs->get_file($user_context->id, 'user', 'draft', $itemid, $draftpath, '.'); - if ($file->get_parent_directory()) { - $parent_path = $file->get_parent_directory()->get_filepath(); - $filename = trim($draftpath, '/').'.zip'; - } else { - $parent_path = '/'; + if ($draftpath === '/') { $filename = get_string('files').'.zip'; + } else { + $filename = explode('/', trim($draftpath, '/')); + $filename = array_pop($filename) . '.zip'; } - if ($newfile = $zipper->archive_to_storage(array($file), $user_context->id, 'user', 'draft', $itemid, $parent_path, $filename, $USER->id)) { - $fileurl = moodle_url::make_draftfile_url($itemid, '/', $filename)->out(); - header('Location: ' . $fileurl ); + $newdraftitemid = file_get_unused_draft_itemid(); + if ($newfile = $zipper->archive_to_storage(array('/' => $file), $user_context->id, 'user', 'draft', $newdraftitemid, '/', $filename, $USER->id)) { + $fileurl = moodle_url::make_draftfile_url($newdraftitemid, '/', $filename)->out(); + header('Location: ' . $fileurl); } else { print_error('cannotdownloaddir', 'repository'); } @@ -161,14 +161,17 @@ case 'zip': $file = $fs->get_file($user_context->id, 'user', 'draft', $itemid, $draftpath, '.'); if (!$file->get_parent_directory()) { $parent_path = '/'; + $filepath = '/'; $filename = get_string('files').'.zip'; } else { $parent_path = $file->get_parent_directory()->get_filepath(); $filepath = explode('/', trim($file->get_filepath(), '/')); - $filename = array_pop($filepath).'.zip'; + $filepath = array_pop($filepath); + $filename = $filepath.'.zip'; } - $newfile = $zipper->archive_to_storage(array($file), $user_context->id, 'user', 'draft', $itemid, $parent_path, $filename, $USER->id); + $filename = repository::get_unused_filename($itemid, $parent_path, $filename); + $newfile = $zipper->archive_to_storage(array($filepath => $file), $user_context->id, 'user', 'draft', $itemid, $parent_path, $filename, $USER->id); $home_url->param('action', 'browse'); $home_url->param('draftpath', $parent_path); @@ -269,7 +272,7 @@ default: $path = '/' . trim($draftpath, '/') . '/'; $parts = explode('/', $path); foreach ($parts as $part) { - if (!empty($part)) { + if ($part != '') { $trail .= ('/'.$part.'/'); $data->path[] = array('name'=>$part, 'path'=>$trail); $home_url->param('draftpath', $trail); @@ -295,8 +298,10 @@ default: $home_url->param('action', 'mkdirform'); echo ' '.get_string('makeafolder', 'moodle').''; } - $home_url->param('action', 'downloaddir'); - echo html_writer::link($home_url, get_string('downloadfolder', 'repository'), array('target'=>'_blank')); + if (!empty($files->list)) { + $home_url->param('action', 'downloaddir'); + echo ' ' . html_writer::link($home_url, get_string('downloadfolder', 'repository'), array('target'=>'_blank')); + } } echo ''; diff --git a/theme/base/style/filemanager.css b/theme/base/style/filemanager.css index 2cecdc4abbc..5693ab2e15f 100644 --- a/theme/base/style/filemanager.css +++ b/theme/base/style/filemanager.css @@ -268,6 +268,7 @@ a.ygtvspacer:hover {color: transparent;text-decoration: none;} .filemanager.fm-loaded .filemanager-loading {display:none;} .filemanager.fm-maxfiles .fp-btn-add {display:none;} .filemanager.fm-maxfiles .dndupload-message {display:none;} +.filemanager.fm-noitems .fp-btn-download, .filemanager.fm-nofiles .fp-btn-download {display:none;} .filemanager .fm-empty-container {display:none;} .filemanager.fm-noitems .filemanager-container .fp-content {display:none;}