From 8ea068a2f53f6971c456177b404066700d0adf09 Mon Sep 17 00:00:00 2001 From: dongsheng Date: Wed, 2 Sep 2009 05:43:01 +0000 Subject: [PATCH] "MDL-16596, improved non-js filemanager, 1. supported subfolder 2. browse draft area 3. create new folder 4. zip folder & unzip archiev" --- repository/filepicker.php | 242 ++++++++++++++++++++++++++++++-------- 1 file changed, 193 insertions(+), 49 deletions(-) diff --git a/repository/filepicker.php b/repository/filepicker.php index ba9788d075..5250764136 100755 --- a/repository/filepicker.php +++ b/repository/filepicker.php @@ -23,34 +23,48 @@ set_time_limit(0); require_login(); -$page = optional_param('page', '', PARAM_RAW); // page +// disable blocks in this page +$PAGE->set_generaltype('form'); + +// general parameters +$action = optional_param('action', '', PARAM_ALPHA); $client_id = optional_param('client_id', SITEID, PARAM_RAW); // client ID -$env = optional_param('env', 'filepicker', PARAM_ALPHA); // opened in editor or moodleform -$file = optional_param('file', '', PARAM_RAW); // file to download -$title = optional_param('title', '', PARAM_FILE); // new file name $itemid = optional_param('itemid', '', PARAM_INT); -$icon = optional_param('icon', '', PARAM_RAW); -$action = optional_param('action', '', PARAM_ALPHA); -$ctx_id = optional_param('ctx_id', SITEID, PARAM_INT); // context ID -$repo_id = optional_param('repo_id', 0, PARAM_INT); // repository ID -$req_path = optional_param('p', '', PARAM_RAW); // path -$page = optional_param('page', '', PARAM_RAW); + +// parameters for repository $callback = optional_param('callback', '', PARAM_CLEANHTML); +$contextid = optional_param('ctx_id', SITEID, PARAM_INT); // context ID +$env = optional_param('env', 'filepicker', PARAM_ALPHA); // opened in file picker, file manager or html editor +$filename = optional_param('filename', '', PARAM_FILE); +$fileurl = optional_param('fileurl', '', PARAM_FILE); +$thumbnail = optional_param('thumbnail', '', PARAM_RAW); +$repo_id = optional_param('repo_id', 0, PARAM_INT); // repository ID +$req_path = optional_param('p', '', PARAM_RAW); // the path in repository +$page = optional_param('page', '', PARAM_RAW); // What page in repository? $search_text = optional_param('s', '', PARAM_CLEANHTML); +// draft area +$newdirname = optional_param('newdirname', '', PARAM_FILE); +// path in draft area +$draftpath = optional_param('draftpath', '/', PARAM_PATH); + + +// user context +$user_context = get_context_instance(CONTEXT_USER, $USER->id); + $PAGE->set_url('/repository/filepicker.php'); // init repository plugin +// $sql = 'SELECT i.name, i.typeid, r.type FROM {repository} r, {repository_instances} i '. 'WHERE i.id=? AND i.typeid=r.id'; - if ($repository = $DB->get_record_sql($sql, array($repo_id))) { $type = $repository->type; if (file_exists($CFG->dirroot.'/repository/'.$type.'/repository.class.php')) { require_once($CFG->dirroot.'/repository/'.$type.'/repository.class.php'); $classname = 'repository_' . $type; try { - $repo = new $classname($repo_id, $ctx_id, array('ajax'=>false, 'name'=>$repository->name, 'client_id'=>$client_id)); + $repo = new $classname($repo_id, $contextid, array('ajax'=>false, 'name'=>$repository->name)); } catch (repository_exception $e){ print_error('pluginerror', 'repository'); } @@ -58,29 +72,29 @@ if ($repository = $DB->get_record_sql($sql, array($repo_id))) { print_error('invalidplugin', 'repository'); } } -$url = new moodle_url($CFG->httpswwwroot."/repository/filepicker.php", array('ctx_id' => $ctx_id, 'itemid' => $itemid)); + +$url = new moodle_url($CFG->httpswwwroot."/repository/filepicker.php", array('ctx_id' => $contextid, 'itemid' => $itemid)); $home_url = new moodle_url($url, array('action' => 'embedded')); switch ($action) { case 'upload': // The uploaded file has been processed in plugin construct function + // redirect to default page redirect($url, get_string('uploadsucc','repository')); break; + case 'deletedraft': - if (!$context = get_context_instance(CONTEXT_USER, $USER->id)) { - print_error('wrongcontextid', 'error'); - } - $contextid = $context->id; + $contextid = $user_context->id; $fs = get_file_storage(); - if ($file = $fs->get_file($contextid, 'user_draft', $itemid, '/', $title)) { + if ($file = $fs->get_file($contextid, 'user_draft', $itemid, $draftpath, $filename)) { if($result = $file->delete()) { header('Location: ' . $home_url->out(false, array(), false)); } else { print_error('cannotdelete', 'repository'); } } - exit; break; + case 'search': echo '
'.get_string('back', 'repository')."
"; try { @@ -111,10 +125,10 @@ case 'search': echo ''; echo ''; echo '
'; - echo ''; + echo ''; echo ''; - echo ''; - echo ''; + echo ''; + echo ''; echo ''; echo '
'; echo ''; @@ -124,6 +138,7 @@ case 'search': } catch (repository_exception $e) { } break; + case 'list': case 'sign': print_header(); @@ -136,6 +151,7 @@ case 'sign': echo ''; echo '
'; echo '
'; + echo '
'; echo '
'; echo ''; echo ''; @@ -145,6 +161,7 @@ case 'sign': echo '
'; echo '
'; echo ''; echo '
'; echo ' / '; @@ -152,7 +169,7 @@ case 'sign': } if (!empty($list['page'])) { // TODO: need a better solution - $pagingurl = new moodle_url("$CFG->httpswwwroot/repository/filepicker.php?action=list&itemid=$itemid&ctx_id=$ctx_id&repo_id=$repo_id"); + $pagingurl = new moodle_url("$CFG->httpswwwroot/repository/filepicker.php?action=list&itemid=$itemid&ctx_id=$contextid&repo_id=$repo_id"); echo $OUTPUT->paging_bar(moodle_paging_bar::make($list['total'], $list['page'] - 1, $list['perpage'], $pagingurl)); } echo ''; @@ -169,10 +186,11 @@ case 'sign': echo '
'; if (!isset($item['children'])) { echo '
'; - echo ''; + echo ''; echo ''; - echo ''; - echo ''; + echo '
'; + echo ''; + echo ''; echo ''; echo '
'; } else { @@ -195,76 +213,202 @@ case 'sign': } echo $OUTPUT->footer(); break; + case 'download': - $filepath = $repo->get_file($file, $title, $itemid); + $filepath = $repo->get_file($fileurl, $filename, $itemid); if (!empty($filepath)) { - // normal file path name - $info = repository::move_to_filepool($filepath, $title, $itemid); - //echo json_encode($info); + $info = repository::move_to_filepool($filepath, $filename, $itemid, $draftpath); redirect($url, get_string('downloadsucc','repository')); } else { print_error('cannotdownload', 'repository'); } break; + case 'confirm': print_header(); echo ''; - echo ''; - echo '
'; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; + echo ''; + echo ''; + echo '
'; + echo ' '; + echo ' '; + echo ' '; + echo ' '; + echo ' '; + echo ' '; + echo ' '; echo '
'; echo '
'; - echo ''; + // the save path + echo ' '; + echo ' '; echo '
'; echo '
'; echo $OUTPUT->footer(); break; + case 'plugins': $user_context = get_context_instance(CONTEXT_USER, $USER->id); $repos = repository::get_instances(array($user_context, get_system_context()), null, true, null, '*', 'ref_id'); print_header(); - echo '
    '; + echo '"; + echo '
    '; + echo '
      '; foreach($repos as $repo) { $info = $repo->get_meta(); $icon = new moodle_action_icon(); $icon->image->src = $info->icon; $icon->image->style = 'height: 16px; width: 16px;'; $icon->link->url = clone($url); - $icon->link->url->params(array('action' => 'list', 'repo_id' => $info->id)); + $icon->link->url->params(array('action' => 'list', 'repo_id' => $info->id, 'draftpath'=>$draftpath)); $icon->linktext = $info->name; echo '
    • ' . $OUTPUT->action_icon($icon) . '
    • '; } - echo '
    '; + echo '
'; + echo '
'; + echo $OUTPUT->footer(); + break; + +case 'mkdir': + $fs = get_file_storage(); + $fs->create_directory($user_context->id, 'user_draft', $itemid, trim_path(trim_path($draftpath).$newdirname)); + $url->param('action', 'browse'); + $url->param('draftpath', $draftpath); + redirect($url, get_string('Created folder success!','repository')); break; + +case 'zip': + $zipper = new zip_packer(); + $fs = get_file_storage(); + + $file = $fs->get_file($user_context->id, 'user_draft', $itemid, $draftpath, '.'); + if (!$file->get_parent_directory()) { + $parent_path = '/'; + } else { + $parent_path = $file->get_parent_directory()->get_filepath(); + } + + $newfile = $zipper->archive_to_storage(array($file), $user_context->id, 'user_draft', $itemid, $parent_path, $file->get_filepath().'.zip', $USER->id); + + $url->param('action', 'browse'); + $url->param('draftpath', $parent_path); + redirect($url, get_string('ziped','repository')); + break; + +case 'unzip': + $zipper = new zip_packer(); + $fs = get_file_storage(); + $file = $fs->get_file($user_context->id, 'user_draft', $itemid, $draftpath, $filename); + + if ($newfile = $file->extract_to_storage($zipper, $user_context->id, 'user_draft', $itemid, $draftpath, $USER->id)) { + $str = get_string('unziped','repository'); + } else { + $str = get_string('cannotunzip', 'repository'); + } + $url->param('action', 'browse'); + $url->param('draftpath', $draftpath); + redirect($url, $str); + break; + +case 'browse': default: $user_context = get_context_instance(CONTEXT_USER, $USER->id); $repos = repository::get_instances(array($user_context, get_system_context()), null, true, null, '*', 'ref_id'); print_header(); + + echo '
'; + $url->param('draftpath', '/'); + echo ''.'Files ▶'; + $trail = ''; + if ($draftpath !== '/') { + $path = trim_path($draftpath); + $parts = explode('/', $path); + foreach ($parts as $part) { + if (!empty($part)) { + $trail .= ('/'.$part.'/'); + $data->path[] = array('name'=>$part, 'path'=>$trail); + $url->param('draftpath', $trail); + echo ' '.$part.' ▶ '; + } + } + } + echo '
'; + + $fs = get_file_storage(); - $context = get_context_instance(CONTEXT_USER, $USER->id); - $files = $fs->get_area_files($context->id, 'user_draft', $itemid); + $files = $fs->get_directory_files($user_context->id, 'user_draft', $itemid, $draftpath, false); + + $iconzip = $CFG->wwwroot . '/pix/f/zip.gif'; + if (empty($files)) { echo get_string('nofilesattached', 'repository'); } else { echo '
    '; foreach ($files as $file) { + $drafturl = new moodle_url($CFG->httpswwwroot.'/draftfile.php/'.$user_context->id.'/user_draft/'.$itemid.'/'.$file->get_filename()); if ($file->get_filename()!='.') { - $drafturl = new moodle_url($CFG->httpswwwroot.'/draftfile.php/'.$context->id.'/user_draft/'.$itemid.'/'.$file->get_filename()); - echo '
  • '.$file->get_filename().' '; - echo '
  • '; + // a file + $fileicon = $CFG->wwwroot.'/pix/'.(file_extension_icon($file->get_filename())); + $type = str_replace('.gif', '', mimeinfo('icon', $file->get_filename())); + echo '
  • '; + echo ''; + echo ' '.$file->get_filename().' '; + + $url->param('filename', $file->get_filename()); + $url->param('action', 'deletedraft'); + echo ' '; + + if ($type == 'zip') { + $url->param('action', 'unzip'); + $url->param('draftpath', $file->get_filepath()); + echo ' [Unzip]'; + } + + echo '
  • '; + } else { + // a folder + echo '
  • '; + echo ''; + + $url->param('action', 'browse'); + $url->param('draftpath', $file->get_filepath()); + $foldername = trim(array_pop(explode('/', trim($file->get_filepath(), '/'))), '/'); + echo ' '.$foldername.''; + + $url->param('draftpath', $file->get_filepath()); + $url->param('filename', $file->get_filename()); + $url->param('action', 'deletedraft'); + echo ' '; + + $url->param('action', 'zip'); + echo ' [Zip]'; + echo '
  • '; } } echo '
'; } + $url->param('draftpath', $draftpath); $url->param('action', 'plugins'); - echo ''; + + echo '
'; + echo ' '.get_string('addfile', 'repository').''; + $url->param('action', 'mkdir'); + echo '
'; + echo ' '; + echo ' '; + echo '
'; + echo '
'; + echo $OUTPUT->footer(); break; } + +/** + * trim filepath, and add slash to it + * @param string $str + * @return string path + */ +function trim_path($str) { + return '/'.trim(trim($str), './@#$').'/'; +} -- 2.39.5