root/devel/mod/file/lib/files_actions.php

Revision 1572, 13.3 kB (checked in by misja, 10 months ago)

Misja Hoebe <misja@curverider.co.uk> Applied attachment:ticket:281:files_actions.patch, closes #281

  • Property svn:eol-style set to native
Line 
1 <?php
2 global $CFG, $USER;
3
4 // Action parser for file uploads
5
6 global $folder;
7 global $page_owner;
8 $textlib = textlib_get_instance();
9
10 /**
11  * Deletes a file
12  * #281
13  * @param file - The file to delete. Get this from get_record(s)
14  */
15 function deleteFile($file) {
16     if (!empty($file) && (permissions_check("files:edit",$file->files_owner)) || permissions_check("files:edit",$file->owner)) {
17         @unlink(stripslashes($CFG->dataroot.$file->location)); //TODO maybe some error reporting here!?! Penny
18         delete_records('files','ident',$file->ident);
19         delete_records('tags','tagtype','file','ref',$file->ident);
20     }
21 }
22
23 /**
24  * Deletes a folder and all its sub folders
25  * #281
26  * @param file - The folder to delete. Get this from get_record(s)
27  */
28 function deleteFolder($folder) {
29     if (!empty($folder) && (permissions_check("files:edit",$folder->files_owner) || permissions_check("files:edit",$folder->owner))) {
30         $files = get_records('files', 'folder', $folder->ident);
31         if (!empty($files)) {
32             foreach($files as $file) {
33                 deleteFile($file);
34             }
35         }
36     
37         $childFolders = get_records('file_folders', 'parent', $folder->ident);
38         if (!empty($childFolders)) {
39             foreach($childFolders as $childFolder) {
40                 deleteFolder($childFolder);
41             }
42         }
43     
44         set_field('file_folders','parent',$folder->parent,'parent',$folder->ident);
45         delete_records('file_folders','ident',$folder->ident);
46         delete_records('tags','tagtype','folder','ref',$folder->ident);
47     }
48 }
49
50 /**
51  * Returns the total number of sub folders of a folder, including all sub folders of sub filders an infinitum...
52  * #281
53  * @param file - The ident of the top level folder
54  */
55 function getNumberOfChildFolders($id) {
56     $count = 0;
57     
58     $childFolders = get_records('file_folders', 'parent', $id);
59     if (!empty($childFolders)) {
60         foreach($childFolders as $childFolder) {
61             $count++;
62             $count += getNumberOfChildFolders($childFolder->ident);
63         }
64     }
65     
66     return $count;
67 }
68
69
70 $action = optional_param('action');
71 if (logged_on) {
72     switch ($action) {
73         
74     // Create a new folder
75     case "files:createfolder":
76         $f = new StdClass;
77         $f->name = trim(optional_param('new_folder_name'));
78         $f->access = trim(optional_param('new_folder_access'));
79         if (!empty($f->access) && !empty($folder) && permissions_check("files",$page_owner)) {
80             $f->parent = $folder;
81             $f->files_owner = $page_owner;
82             $f->owner = $USER->ident;
83             $f->handler = trim(optional_param('edit_folder_type'));
84             $f = plugin_hook("folder","create",$f);
85             if (!empty($f)) {
86                 $insert_id = insert_record('file_folders',$f);
87                 $f->ident = $insert_id;
88                 $value = trim(optional_param('new_folder_keywords'));
89                 insert_tags_from_string ($value, 'folder', $insert_id, $f->access, $f->owner);
90                 plugin_hook("folder","publish",$f);
91                 $messages[] = __gettext("Your folder was created.");
92             }
93         } else {
94             $messages[] = __gettext("Could not create folder. Perhaps the folder name was blank?");
95         }
96         break;
97                 
98         // Upload a new file
99     case "files:uploadfile":
100         $description = trim(optional_param('new_file_description'));
101         $title = trim(optional_param('new_file_title'));
102         $access = trim(optional_param('new_file_access'));
103         $folderid = optional_param('folder',0,PARAM_INT);
104         $copyright = optional_param('copyright');
105         
106         if (isloggedin() && !empty($access) && !empty($folderid) && permissions_check("files",$page_owner)) {
107             $ul_username = user_info('username', $page_owner);
108             if (empty($copyright)) {
109                 $redirect_url = $CFG->wwwroot . $ul_username . "/files/";
110                 if ($folderid > -1) {
111                     $redirect_url .= $folderid;
112                 }
113                 define('redirect_url', $redirect_url);
114                 $messages[] = __gettext("Upload unsuccessful. You must check the copyright box for a file to be uploaded.");
115                 break;
116             }
117             $upload_folder = $textlib->substr($ul_username,0,1);
118             require_once($CFG->dirroot.'lib/uploadlib.php');
119             $total_quota = get_field_sql('SELECT sum(size) FROM '.$CFG->prefix.'files WHERE files_owner = ?',array($page_owner));
120             $max_quota = user_info('file_quota',$page_owner);
121             $maxbytes = $max_quota - $total_quota;
122             // $um = new upload_manager('new_file',false,true,true,$maxbytes,true);
123             $um = new upload_manager('',false,true,true,$maxbytes,true);
124             $reldir "files/" . $upload_folder . "/" . $ul_username . "/";
125             $dir = $CFG->dataroot .$reldir;
126             if ($um->process_file_uploads($dir)) {
127                 foreach($um->files as $file) {
128                     if ($file['error'] == 0) {
129                         $f = new StdClass;
130                         $f->owner = $USER->ident;
131                         $f->files_owner = $page_owner;
132                         $f->folder $folderid;
133                         $f->originalname = $file['originalname'];
134                         $f->title = $title;
135                         $f->description = $description;
136                         $f->location = $reldir . $file['name'];
137                         $f->access = $access;
138                         $f->size = $file['size'];
139                         $f->time_uploaded = time();
140                         $f = plugin_hook("file","create",$f);
141                         if (!empty($f)) {
142                             $file_id = insert_record('files',$f);
143                             $f->ident = $file_id;
144                             $value = trim(optional_param('new_file_keywords'));
145                             insert_tags_from_string ($value, 'file', $file_id, $access, $page_owner);
146                             $metadata = optional_param('metadata');
147                             if (is_array($metadata)) {
148                                 foreach($metadata as $name => $value) {
149                                     $m = new StdClass;
150                                     $m->name = trim($name);
151                                     $m->value = trim($value);
152                                     $m->file_id = $file_id;
153                                     insert_record('file_metadata',$m);
154                                 }
155                             }
156                             plugin_hook("file","publish",$f);
157                             $rssresult = run("files:rss:publish", array($page_owner, false));
158                             $rssresult = run("profile:rss:publish", array($page_owner, false));
159                             $messages[] = __gettext("{$f->originalname} was successfully uploaded.");
160                         }
161                     }
162                 }
163             } else {
164                 $messages[] = $um->get_errors();
165             }
166             
167             $redirect_url = $CFG->wwwroot . $ul_username . "/files/";
168             if ($folderid > -1) {
169                 $redirect_url .= $folderid;
170             }
171             define('redirect_url', $redirect_url);
172         }
173         break;
174         
175         // Edit a file
176     case "files:editfile":
177         $f = new stdClass;
178         $f->ident = optional_param('file_id',0,PARAM_INT);
179         $f->title = trim(optional_param('edit_file_title'));
180         $f->folder = optional_param('edit_file_folder',0,PARAM_INT);
181         $f->access = trim(optional_param('edit_file_access'));
182         $f->description = trim(optional_param('edit_file_description'));
183         if (!empty($f->ident) && !empty($f->folder) && !empty($f->access)) {
184             $file_info = get_record('files','ident',$f->ident);
185             if (!empty($file_info) && permissions_check("files:edit",$file_info->files_owner)) {
186                 $files_username = user_info('username', $file_info->files_owner);
187                 $f = plugin_hook("file","update",$f);
188                 if (!empty($f)) {
189                     update_record('files',$f);
190                     $file_info = get_record('files','ident',$f->ident);
191                     delete_records('tags','tagtype','file','ref',$f->ident);
192                     $file_keywords = trim(optional_param('edit_file_keywords'));
193                     insert_tags_from_string ($file_keywords, 'file', $f->ident, $f->access, $USER->ident);
194                     plugin_hook("file","republish",$file_info);
195                     $redirect_url = $CFG->wwwroot . $files_username . "/files/";
196                     if ($f->folder != -1) {
197                         $redirect_url .= $f->folder;
198                     }
199                     define('redirect_url',$redirect_url);
200                     $rssresult = run("files:rss:publish", array($file_info->files_owner, false));
201                     $rssresult = run("profile:rss:publish", array($file_info->files_owner, false));
202                     $messages[] = __gettext("The file was updated.");
203                 }
204             }
205         }
206         break;
207         
208         // Edit a folder
209     case "edit_folder":
210         $f = new StdClass;
211         $return_type = trim(optional_param('return_type','same'));
212         $f->ident = optional_param('edit_folder_id',0,PARAM_INT);
213         $f->name = trim(optional_param('edit_folder_name'));
214         $f->access = trim(optional_param('edit_folder_access'));
215         $f->handler = trim(optional_param('edit_folder_type'));
216         $f->parent = optional_param('edit_folder_parent',0,PARAM_INT);
217         if (!empty($f->ident) && !empty($f->name) && !empty($f->access) && !empty($f->parent)) {
218             $edit_owner = get_field('file_folders','files_owner','ident',$f->ident);
219             if (permissions_check("files:edit",$edit_owner)) {
220                 if ($f->ident != $f->parent) {
221                     $f = plugin_hook("folder","update",$f);
222                     if (!empty($f)) {
223                         update_record('file_folders',$f);
224                         delete_records('tags','tagtype','folder','ref',$f->ident);
225                         $edit_value = trim(optional_param('edit_folder_keywords'));
226                         insert_tags_from_string ($edit_value, 'folder', $f->ident, $f->access, $USER->ident);
227                         plugin_hook("folder","updated",$f);
228                         $messages[] = __gettext("The folder was edited.");
229                         if ($return_type == "same") {
230                             $return_url = $CFG->wwwroot . user_info("username",$edit_owner) . "/files/" . $f->ident;
231                         } else {
232                             $return_url = $CFG->wwwroot . user_info("username",$edit_owner) . "/files/";
233                             if ($f->parent > -1) {
234                                 $return_url .= $f->parent;
235                             }
236                         }
237                         header_redirect($return_url);
238                     }
239                 } else {
240                     $messages[] = __gettext("Error: a folder cannot be its own parent.");
241                 }
242             }
243         }
244         break;
245
246         // Delete a folder
247     case "delete_folder":
248         $id = optional_param('delete_folder_id',0,PARAM_INT);
249         $files = get_records('files', 'folder', $id);
250         $text = sprintf(__gettext("Are you sure you want to permanently delete this folder and its %s file(s) and %s folder(s)?"),
251                         count($files), getNumberOfChildFolders($id));
252         require_confirm($text);
253         
254         if (!empty($id) && $id != -1) {
255             $folder = get_record('file_folders','ident',$id);
256             if (!empty($folder) && (permissions_check("files:edit",$folder->files_owner) || permissions_check("files:edit",$folder->owner))) {
257                 $files_username = user_info('username', $folder->files_owner);
258                 $folder = plugin_hook("folder","delete",$folder);
259                 if (!empty($folder)) {
260                     deleteFolder($folder);
261                 }
262                 global $redirect_url;
263                 $redirect_url = $CFG->wwwroot . $files_username . "/files/";
264                 if ($folder->parent > -1) {
265                     $redirect_url .= $folder->parent;
266                 }
267                 define('redirect_url', $redirect_url);
268                 $messages[] = __gettext("The folder was deleted.");
269             }
270         }
271         break;
272     
273         // Delete a file
274     case "delete_file":
275         $id = optional_param('delete_file_id',0,PARAM_INT);
276         require_confirm(__gettext('Are you sure you want to permanently delete this file?'));
277
278         if (!empty($id) && $id != -1) {
279             $file = get_record('files','ident',$id);
280
281             if (!empty($file) && (permissions_check("files:edit",$file->files_owner)) || permissions_check("files:edit",$file->owner)) {
282                 $files_username = user_info('username', $file->files_owner);
283                 $file = plugin_hook("file","delete",$file);
284                 if (!empty($file)) {
285                     deleteFile($file);
286                 }
287                 $redirect_url = $CFG->wwwroot . $files_username . "/files/";
288                 if ($file->folder > -1) {
289                     $redirect_url .= $file->folder;
290                 }
291                 define('redirect_url', $redirect_url);
292                 $rssresult = run("files:rss:publish", array($file->files_owner, false));
293                 $rssresult = run("profile:rss:publish", array($file->files_owner, false));
294                 $messages[] = __gettext("The file was deleted.");
295
296             }
297         }
298         break;
299     }
300 }
301
302
303 ?>
Note: See TracBrowser for help on using the browser.