ILIAS  release_4-3 Revision
 All Data Structures Namespaces Files Functions Variables Groups Pages
class.ilFileDataForum.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (c) 1998-2012 ILIAS open source, Extended GPL, see docs/LICENSE */
3 
4 require_once("./Services/FileSystem/classes/class.ilFileData.php");
5 
15 {
21  var $obj_id;
22  var $pos_id;
23 
30 
38  public function __construct($a_obj_id = 0,$a_pos_id = 0)
39  {
40  define('FORUM_PATH', 'forum');
42  $this->forum_path = parent::getPath()."/".FORUM_PATH;
43 
44  // IF DIRECTORY ISN'T CREATED CREATE IT
45  if(!$this->__checkPath())
46  {
47  $this->__initDirectory();
48  }
49  $this->obj_id = $a_obj_id;
50  $this->pos_id = $a_pos_id;
51  }
52 
53  function getObjId()
54  {
55  return $this->obj_id;
56  }
57  function getPosId()
58  {
59  return $this->pos_id;
60  }
61  function setPosId($a_id)
62  {
63  $this->pos_id = $a_id;
64  }
70  function getForumPath()
71  {
72  return $this->forum_path;
73  }
74 
75  function getFiles()
76  {
77  $files = array();
78  $dp = opendir($this->forum_path);
79 
80  while($file = readdir($dp))
81  {
82  if(is_dir($file))
83  {
84  continue;
85  }
86  list($obj_id,$rest) = split('_',$file,2);
87  if($obj_id == $this->obj_id)
88  {
89  if(!is_dir($this->forum_path.'/'.$file))
90  {
91  $files[] = array(
92  'path' => $this->forum_path.'/'.$file,
93  'md5' => md5($this->obj_id.'_'.$this->pos_id.'_'.$rest),
94  'name' => $rest,
95  'size' => filesize($this->forum_path.'/'.$file),
96  'ctime' => ilFormat::formatDate(date('Y-m-d H:i:s',filectime($this->forum_path.'/'.$file))));
97  }
98  }
99  }
100  closedir($dp);
101  return $files;
102  }
103  function getFilesOfPost()
104  {
105  $files = array();
106  $dp = opendir($this->forum_path);
107 
108  while($file = readdir($dp))
109  {
110  if(is_dir($file))
111  {
112  continue;
113  }
114  list($obj_id,$rest) = split('_',$file,2);
115  if($obj_id == $this->obj_id)
116  {
117  list($pos_id,$rest) = split('_',$rest,2);
118  if($pos_id == $this->getPosId())
119  {
120  if(!is_dir($this->forum_path.'/'.$file))
121  {
122  $files[] = array(
123  'path' => $this->forum_path.'/'.$file,
124  'md5' => md5($this->obj_id.'_'.$this->pos_id.'_'.$rest),
125  'name' => $rest,
126  'size' => filesize($this->forum_path.'/'.$file),
127  'ctime' => ilFormat::formatDate(date('Y-m-d H:i:s',filectime($this->forum_path.'/'.$file))));
128  }
129  }
130  }
131  }
132  closedir($dp);
133  return $files;
134  }
135 
136  public function moveFilesOfPost($a_new_frm_id = 0)
137  {
138  if((int)$a_new_frm_id)
139  {
140  $dp = opendir($this->forum_path);
141 
142  while($file = readdir($dp))
143  {
144  if(is_dir($file))
145  {
146  continue;
147  }
148  list($obj_id,$rest) = split('_',$file,2);
149  if($obj_id == $this->obj_id)
150  {
151  list($pos_id,$rest) = split('_',$rest,2);
152  if($pos_id == $this->getPosId())
153  {
154  if(!is_dir($this->forum_path.'/'.$file))
155  {
156  @rename($this->forum_path.'/'.$file, $this->forum_path.'/'.$a_new_frm_id.'_'.$this->pos_id.'_'.$rest);
157  }
158  }
159  }
160  }
161  closedir($dp);
162  return true;
163  }
164 
165  return false;
166  }
167 
168  function ilClone($a_new_obj_id,$a_new_pos_id)
169  {
170  foreach($this->getFilesOfPost() as $file)
171  {
172  @copy($this->getForumPath()."/".$this->obj_id."_".$this->pos_id."_".$file["name"],
173  $this->getForumPath()."/".$a_new_obj_id."_".$a_new_pos_id."_".$file["name"]);
174  }
175  return true;
176  }
177  function delete()
178  {
179  foreach($this->getFiles() as $file)
180  {
181  if(file_exists($this->getForumPath()."/".$this->getObjId()."_".$file["name"]))
182  {
183  unlink($this->getForumPath()."/".$this->getObjId()."_".$file["name"]);
184  }
185  }
186  return true;
187  }
188 
198  function storeUploadedFile($files)
199  {
200  if(isset($files['name']) && is_array($files['name']))
201  {
202  foreach($files['name'] as $index => $name)
203  {
204  // remove trailing '/'
205  while(substr($name, -1) == '/')
206  {
207  $name = substr($name, 0, -1);
208  }
210  $temp_name = $files['tmp_name'][$index];
211  $error = $files['error'][$index];
212 
213  if(strlen($filename) && strlen($temp_name) && $error == 0)
214  {
215  $path = $this->getForumPath().'/'.$this->obj_id.'_'.$this->pos_id.'_'.$filename;
216 
217  $this->__rotateFiles($path);
219  }
220  }
221 
222  return true;
223  }
224  else if(isset($files['name']) && is_string($files['name']))
225  {
226  // remove trailing '/'
227  while(substr($files['name'], -1) == '/')
228  {
229  $files['name'] = substr($files['name'], 0, -1);
230  }
231  $filename = ilUtil::_sanitizeFilemame($files['name']);
232  $temp_name = $files['tmp_name'];
233 
234  $path = $this->getForumPath().'/'.$this->obj_id.'_'.$this->pos_id.'_'.$filename;
235 
236  $this->__rotateFiles($path);
238 
239  return true;
240  }
241 
242  return false;
243  }
250  function unlinkFiles($a_filenames)
251  {
252  if(is_array($a_filenames))
253  {
254  foreach($a_filenames as $file)
255  {
256  if(!$this->unlinkFile($file))
257  {
258  return $file;
259  }
260  }
261  }
262  return '';
263  }
270  function unlinkFile($a_filename)
271  {
272  if(file_exists($this->forum_path.'/'.$this->obj_id.'_'.$this->pos_id.'_'.$a_filename))
273  {
274  return unlink($this->forum_path.'/'.$this->obj_id.'_'.$this->pos_id."_".$a_filename);
275  }
276  }
283  function getAbsolutePath($a_path)
284  {
285  return $this->forum_path.'/'.$this->obj_id.'_'.$this->pos_id."_".$a_path;
286  }
287 
294  public function getFileDataByMD5Filename($a_md5_filename)
295  {
296  $files = ilUtil::getDir( $this->forum_path );
297  foreach((array)$files as $file)
298  {
299  if($file['type'] == 'file' && md5($file['entry']) == $a_md5_filename)
300  {
301  return array(
302  'path' => $this->forum_path.'/'.$file['entry'],
303  'filename' => $file['entry'],
304  'clean_filename' => str_replace($this->obj_id.'_'.$this->pos_id.'_', '', $file['entry'])
305  );
306  }
307  }
308 
309  return false;
310  }
311 
318  function unlinkFilesByMD5Filenames($a_md5_filename)
319  {
320  $files = ilUtil::getDir( $this->forum_path );
321  if(is_array($a_md5_filename))
322  {
323  foreach((array)$files as $file)
324  {
325  if($file['type'] == 'file' && in_array(md5($file['entry']), $a_md5_filename))
326  {
327  unlink( $this->forum_path.'/'.$file['entry'] );
328  }
329  }
330 
331  return true;
332  }
333  else
334  {
335  foreach((array)$files as $file)
336  {
337  if($file['type'] == 'file' && md5($file['entry']) == $a_md5_filename)
338  {
339  return unlink( $this->forum_path.'/'.$file['entry'] );
340  }
341  }
342  }
343 
344  return false;
345  }
346 
353  function checkFilesExist($a_files)
354  {
355  if($a_files)
356  {
357  foreach($a_files as $file)
358  {
359  if(!file_exists($this->forum_path.'/'.$this->obj_id.'_'.$this->pos_id.'_'.$file))
360  {
361  return false;
362  }
363  }
364  return true;
365  }
366  return true;
367  }
368 
369  // PRIVATE METHODS
370  function __checkPath()
371  {
372  if(!@file_exists($this->getForumPath()))
373  {
374  return false;
375  }
376  $this->__checkReadWrite();
377 
378  return true;
379  }
386  function __checkReadWrite()
387  {
388  if(is_writable($this->forum_path) && is_readable($this->forum_path))
389  {
390  return true;
391  }
392  else
393  {
394  $this->ilias->raiseError("Forum directory is not readable/writable by webserver",$this->ilias->error_obj->FATAL);
395  }
396  }
403  function __initDirectory()
404  {
405  if(is_writable($this->getPath()))
406  {
407  if(mkdir($this->getPath().'/'.FORUM_PATH))
408  {
409  if(chmod($this->getPath().'/'.FORUM_PATH,0755))
410  {
411  $this->forum_path = $this->getPath().'/'.FORUM_PATH;
412  return true;
413  }
414  }
415  }
416  return false;
417  }
425  function __rotateFiles($a_path)
426  {
427  if(file_exists($a_path))
428  {
429  $this->__rotateFiles($a_path.".old");
430  return rename($a_path,$a_path.'.old');
431  }
432  return true;
433  }
434 
435 }