ILIAS  release_5-1 Revision 5.0.0-5477-g43f3e3fab5
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 require_once("./Services/Utilities/classes/class.ilFileUtils.php");
6 
16 {
22  var $obj_id;
23  var $pos_id;
24 
31 
39  public function __construct($a_obj_id = 0,$a_pos_id = 0)
40  {
41  define('FORUM_PATH', 'forum');
42  parent::__construct();
43  $this->forum_path = parent::getPath()."/".FORUM_PATH;
44 
45  // IF DIRECTORY ISN'T CREATED CREATE IT
46  if(!$this->__checkPath())
47  {
48  $this->__initDirectory();
49  }
50  $this->obj_id = $a_obj_id;
51  $this->pos_id = $a_pos_id;
52  }
53 
54  function getObjId()
55  {
56  return $this->obj_id;
57  }
58  function getPosId()
59  {
60  return $this->pos_id;
61  }
62  function setPosId($a_id)
63  {
64  $this->pos_id = $a_id;
65  }
71  function getForumPath()
72  {
73  return $this->forum_path;
74  }
75 
79  public function getFiles()
80  {
81  $files = array();
82 
83  foreach(new DirectoryIterator($this->forum_path) as $file)
84  {
89  if($file->isDir())
90  {
91  continue;
92  }
93 
94  list($obj_id, $rest) = explode('_', $file->getFilename(), 2);
95  if($obj_id == $this->obj_id)
96  {
97  $files[] = array(
98  'path' => $file->getPathname(),
99  'md5' => md5($this->obj_id . '_' . $this->pos_id . '_' . $rest),
100  'name' => $rest,
101  'size' => $file->getSize(),
102  'ctime' => ilFormat::formatDate(date('Y-m-d H:i:s', $file->getCTime()))
103  );
104  }
105  }
106 
107  return $files;
108  }
109 
113  public function getFilesOfPost()
114  {
115  $files = array();
116 
117  foreach(new DirectoryIterator($this->forum_path) as $file)
118  {
123  if($file->isDir())
124  {
125  continue;
126  }
127 
128  list($obj_id, $rest) = explode('_', $file->getFilename(), 2);
129  if($obj_id == $this->obj_id)
130  {
131  list($pos_id, $rest) = explode('_', $rest, 2);
132  if($pos_id == $this->getPosId())
133  {
134  $files[] = array(
135  'path' => $file->getPathname(),
136  'md5' => md5($this->obj_id . '_' . $this->pos_id . '_' . $rest),
137  'name' => $rest,
138  'size' => $file->getSize(),
139  'ctime' => ilFormat::formatDate(date('Y-m-d H:i:s', $file->getCTime()))
140  );
141  }
142  }
143  }
144 
145  return $files;
146  }
147 
152  public function moveFilesOfPost($a_new_frm_id = 0)
153  {
154  if((int)$a_new_frm_id)
155  {
156  foreach(new DirectoryIterator($this->forum_path) as $file)
157  {
162  if($file->isDir())
163  {
164  continue;
165  }
166 
167  list($obj_id, $rest) = explode('_', $file->getFilename(), 2);
168  if($obj_id == $this->obj_id)
169  {
170  list($pos_id, $rest) = explode('_', $rest, 2);
171  if($pos_id == $this->getPosId())
172  {
174  $file->getPathname(),
175  $this->forum_path . '/' . $a_new_frm_id . '_' . $this->pos_id . '_' . $rest
176  );
177  }
178  }
179  }
180 
181  return true;
182  }
183 
184  return false;
185  }
186 
187  function ilClone($a_new_obj_id,$a_new_pos_id)
188  {
189  foreach($this->getFilesOfPost() as $file)
190  {
191  @copy($this->getForumPath()."/".$this->obj_id."_".$this->pos_id."_".$file["name"],
192  $this->getForumPath()."/".$a_new_obj_id."_".$a_new_pos_id."_".$file["name"]);
193  }
194  return true;
195  }
196  function delete()
197  {
198  foreach($this->getFiles() as $file)
199  {
200  if(file_exists($this->getForumPath()."/".$this->getObjId()."_".$file["name"]))
201  {
202  unlink($this->getForumPath()."/".$this->getObjId()."_".$file["name"]);
203  }
204  }
205  return true;
206  }
207 
217  function storeUploadedFile($files)
218  {
219  if(isset($files['name']) && is_array($files['name']))
220  {
221  foreach($files['name'] as $index => $name)
222  {
223  // remove trailing '/'
224  while(substr($name, -1) == '/')
225  {
226  $name = substr($name, 0, -1);
227  }
229  $temp_name = $files['tmp_name'][$index];
230  $error = $files['error'][$index];
231 
232  if(strlen($filename) && strlen($temp_name) && $error == 0)
233  {
234  $path = $this->getForumPath().'/'.$this->obj_id.'_'.$this->pos_id.'_'.$filename;
235 
236  $this->__rotateFiles($path);
238  }
239  }
240 
241  return true;
242  }
243  else if(isset($files['name']) && is_string($files['name']))
244  {
245  // remove trailing '/'
246  while(substr($files['name'], -1) == '/')
247  {
248  $files['name'] = substr($files['name'], 0, -1);
249  }
250  $filename = ilUtil::_sanitizeFilemame($files['name']);
251  $temp_name = $files['tmp_name'];
252 
253  $path = $this->getForumPath().'/'.$this->obj_id.'_'.$this->pos_id.'_'.$filename;
254 
255  $this->__rotateFiles($path);
257 
258  return true;
259  }
260 
261  return false;
262  }
269  function unlinkFiles($a_filenames)
270  {
271  if(is_array($a_filenames))
272  {
273  foreach($a_filenames as $file)
274  {
275  if(!$this->unlinkFile($file))
276  {
277  return $file;
278  }
279  }
280  }
281  return '';
282  }
289  function unlinkFile($a_filename)
290  {
291  if(file_exists($this->forum_path.'/'.$this->obj_id.'_'.$this->pos_id.'_'.$a_filename))
292  {
293  return unlink($this->forum_path.'/'.$this->obj_id.'_'.$this->pos_id."_".$a_filename);
294  }
295  }
302  function getAbsolutePath($a_path)
303  {
304  return $this->forum_path.'/'.$this->obj_id.'_'.$this->pos_id."_".$a_path;
305  }
306 
313  public function getFileDataByMD5Filename($a_md5_filename)
314  {
315  $files = ilUtil::getDir( $this->forum_path );
316  foreach((array)$files as $file)
317  {
318  if($file['type'] == 'file' && md5($file['entry']) == $a_md5_filename)
319  {
320  return array(
321  'path' => $this->forum_path.'/'.$file['entry'],
322  'filename' => $file['entry'],
323  'clean_filename' => str_replace($this->obj_id.'_'.$this->pos_id.'_', '', $file['entry'])
324  );
325  }
326  }
327 
328  return false;
329  }
330 
337  function unlinkFilesByMD5Filenames($a_md5_filename)
338  {
339  $files = ilUtil::getDir( $this->forum_path );
340  if(is_array($a_md5_filename))
341  {
342  foreach((array)$files as $file)
343  {
344  if($file['type'] == 'file' && in_array(md5($file['entry']), $a_md5_filename))
345  {
346  unlink( $this->forum_path.'/'.$file['entry'] );
347  }
348  }
349 
350  return true;
351  }
352  else
353  {
354  foreach((array)$files as $file)
355  {
356  if($file['type'] == 'file' && md5($file['entry']) == $a_md5_filename)
357  {
358  return unlink( $this->forum_path.'/'.$file['entry'] );
359  }
360  }
361  }
362 
363  return false;
364  }
365 
372  function checkFilesExist($a_files)
373  {
374  if($a_files)
375  {
376  foreach($a_files as $file)
377  {
378  if(!file_exists($this->forum_path.'/'.$this->obj_id.'_'.$this->pos_id.'_'.$file))
379  {
380  return false;
381  }
382  }
383  return true;
384  }
385  return true;
386  }
387 
388  // PRIVATE METHODS
389  function __checkPath()
390  {
391  if(!@file_exists($this->getForumPath()))
392  {
393  return false;
394  }
395  $this->__checkReadWrite();
396 
397  return true;
398  }
405  function __checkReadWrite()
406  {
407  if(is_writable($this->forum_path) && is_readable($this->forum_path))
408  {
409  return true;
410  }
411  else
412  {
413  $this->ilias->raiseError("Forum directory is not readable/writable by webserver",$this->ilias->error_obj->FATAL);
414  }
415  }
422  function __initDirectory()
423  {
424  if(is_writable($this->getPath()))
425  {
426  if(mkdir($this->getPath().'/'.FORUM_PATH))
427  {
428  if(chmod($this->getPath().'/'.FORUM_PATH,0755))
429  {
430  $this->forum_path = $this->getPath().'/'.FORUM_PATH;
431  return true;
432  }
433  }
434  }
435  return false;
436  }
444  function __rotateFiles($a_path)
445  {
446  if(file_exists($a_path))
447  {
448  $this->__rotateFiles($a_path.".old");
449  return \ilFileUtils::rename($a_path, $a_path . '.old');
450  }
451  return true;
452  }
453 
454 }
checkFilesExist($a_files)
check if files exist
unlinkFiles($a_filenames)
unlink files: expects an array of filenames e.g.
print $file
__checkReadWrite()
check if directory is writable overwritten method from base class private
$rest
Definition: goto.php:85
getAbsolutePath($a_path)
get absolute path of filename
getPath()
get Path public
static getDir($a_dir, $a_rec=false, $a_sub_dir="")
get directory
__construct($a_obj_id=0, $a_pos_id=0)
Constructor call base constructors checks if directory is writable and sets the optional obj_id...
static rename($a_source, $a_target)
Rename a file.
static _sanitizeFilemame($a_filename)
This class handles all operations on files in directory /ilias_data/.
static moveUploadedFile($a_file, $a_name, $a_target, $a_raise_errors=true, $a_mode="move_uploaded")
move uploaded file
redirection script todo: (a better solution should control the processing via a xml file) ...
$filename
Definition: buildRTE.php:89
unlinkFilesByMD5Filenames($a_md5_filename)
get file data of a specific attachment
__rotateFiles($a_path)
rotate files with same name recursive method
unlinkFile($a_filename)
unlink one uploaded file expects a filename e.g &#39;foo&#39;
formatDate($a_date, $a_mode="datetime", $a_omit_seconds=false, $a_relative=TRUE)
format a date according to the user language shortcut for Format::fmtDateTime public ...
This class handles all operations on files for the forum object.
getFileDataByMD5Filename($a_md5_filename)
get file data of a specific attachment
ilClone($a_new_obj_id, $a_new_pos_id)
__initDirectory()
init directory overwritten method public
getForumPath()
get forum path public
storeUploadedFile($files)
Store uploaded files in filesystem.