ILIAS  eassessment Revision 61809
 All Data Structures Namespaces Files Functions Variables Groups Pages
class.ilFileExplorer.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (c) 1998-2009 ILIAS open source, Extended GPL, see docs/LICENSE */
3 
4 
13 {
19  var $ilias;
20 
26  var $output;
27 
34 
41 
47  var $target;
48 
55 
62 
68  var $expanded;
69 
76 
83 
90 
96  function ilFileExplorer($a_directory, $a_target)
97  {
98  global $ilias;
99 
100  if (!isset($a_target) or !is_string($a_target))
101  {
102  $this->ilias->raiseError(get_class($this)."::Constructor(): No target given!",$this->ilias->error_obj->WARNING);
103  }
104 
105  if (!isset($a_directory) or !is_string($a_directory))
106  {
107  $this->ilias->raiseError(get_class($this)."::Constructor(): No directory given!",$this->ilias->error_obj->WARNING);
108  }
109 
110  $this->ilias =& $ilias;
111  $this->directory = $a_directory;
112  $this->output = array();
113  $this->expanded = array();
114  $this->target = $a_target;
115  $this->target_get = 'ref_id';
116  $this->frame_target = "_top";
117  $this->order_column = "title";
118  $this->expand_target = $_SERVER["PATH_INFO"];
119  $this->rbac_check = true;
120  $this->output_icons = true;
121  }
122 
128  function setOrderColumn($a_column)
129  {
130  $this->order_column = $a_column;
131  }
132 
138  function setTargetGet($a_target_get)
139  {
140  if (!isset($a_target_get) or !is_string($a_target_get))
141  {
142  $this->ilias->raiseError(get_class($this)."::setTargetGet(): No target given!",$this->ilias->error_obj->WARNING);
143  }
144 
145  $this->target_get = $a_target_get;
146  }
147 
153  function setParamsGet($a_params_get)
154  {
155  if (!isset($a_params_get) or !is_array($a_params_get))
156  {
157  $this->ilias->raiseError(get_class($this)."::setTargetGet(): No target given!",$this->ilias->error_obj->WARNING);
158  }
159 
160  foreach ($a_params_get as $key => $val)
161  {
162  $str .= "&".$key."=".$val;
163  }
164 
165  $this->params_get = $str;
166  }
167 
168 
175  function setExpandTarget($a_exp_target)
176  {
177  $this->expand_target = $a_exp_target;
178  }
179 
185  function checkPermissions($a_check)
186  {
187  $this->rbac_check = $a_check;
188  }
189 
195  function outputIcons($a_icons)
196  {
197  $this->output_icons = $a_icons;
198  }
199 
200 
209  function setOutput($a_parent_dir, $a_depth = 1)
210  {
211  static $counter = 0;
212 
213  if (!isset($a_parent_id))
214  {
215  $this->ilias->raiseError(get_class($this)."::setOutput(): No node_id given!",$this->ilias->error_obj->WARNING);
216  }
217  $files = $this->getFiles($a_parent_dir, $this->order_column);
218  if (count($files) > 0)
219  {
220  $tab = ++$a_depth - 2;
221  foreach ($objects as $key => $object)
222  {
223  //ask for FILTER
224  if ($this->filtered == false || $this->checkFilter($object["type"])==true)
225  {
226  if ($object["child"] != $this->tree->getRootId())
227  {
228  $parent_index = $this->getIndex($object);
229  }
230  $this->format_options["$counter"]["parent"] = $object["parent"];
231  $this->format_options["$counter"]["child"] = $object["child"];
232  $this->format_options["$counter"]["title"] = $object["title"];
233  $this->format_options["$counter"]["type"] = $object["type"];
234  $this->format_options["$counter"]["desc"] = "obj_".$object["type"];
235  $this->format_options["$counter"]["depth"] = $tab;
236  $this->format_options["$counter"]["container"] = false;
237  $this->format_options["$counter"]["visible"] = true;
238 
239  // Create prefix array
240  for ($i = 0; $i < $tab; ++$i)
241  {
242  $this->format_options["$counter"]["tab"][] = 'blank';
243  }
244 
245  // only if parent is expanded and visible, object is visible
246  if ($object["child"] != $this->tree->getRootId() and (!in_array($object["parent"],$this->expanded)
247  or !$this->format_options["$parent_index"]["visible"]))
248  {
249  $this->format_options["$counter"]["visible"] = false;
250  }
251 
252  // if object exists parent is container
253  if ($object["child"] != $this->tree->getRootId())
254  {
255  $this->format_options["$parent_index"]["container"] = true;
256 
257  if (in_array($object["parent"],$this->expanded))
258  {
259  $this->format_options["$parent_index"]["tab"][($tab-2)] = 'minus';
260  }
261  else
262  {
263  $this->format_options["$parent_index"]["tab"][($tab-2)] = 'plus';
264  }
265  }
266 
267  ++$counter;
268 
269  // Recursive
270  $this->setOutput($object["child"],$a_depth);
271  } //if FILTER
272  } //foreach
273  } //if
274  } //function
275 
276 
277  function getFiles($a_parent_dir, $a_order)
278  {
279  $files = array();
280  $handle = opendir($a_parent_dir);
281  while (false !== ($file = readdir($handle)))
282  {
283  if (!is_dir($file))
284  {
285  $files[] = array("type" => "file", "name" => $file);
286  }
287  else
288  {
289  $files[] = array("type" => "dir", "name" => $file);
290  }
291  }
292  return $files;
293  }
294 
301  function getOutput()
302  {
303  $this->format_options[0]["tab"] = array();
304 
305  /* ???
306  $depth = $this->tree->getMaximumDepth();
307 
308  for ($i=0;$i<$depth;++$i)
309  {
310  $this->createLines($i);
311  }*/
312 
313  foreach ($this->format_options as $key => $options)
314  {
315  if ($options["visible"] and $key != 0)
316  {
317  $this->formatObject($options["child"],$options);
318  }
319  if ($key == 0)
320  {
321  $this->formatHeader($options["child"],$options);
322  }
323  }
324 
325  return implode('',$this->output);
326  }
327 
336  function formatHeader($a_obj_id,$a_option)
337  {
338  }
339 
348  function formatObject($a_node_id,$a_option)
349  {
350  global $lng;
351 
352  if (!isset($a_node_id) or !is_array($a_option))
353  {
354  $this->ilias->raiseError(get_class($this)."::formatObject(): Missing parameter or wrong datatype! ".
355  "node_id: ".$a_node_id." options:".var_dump($a_option),$this->ilias->error_obj->WARNING);
356  }
357 
358  $tpl = new ilTemplate("tpl.tree.html", true, true);
359 
360  foreach ($a_option["tab"] as $picture)
361  {
362  if ($picture == 'plus')
363  {
364  $target = $this->createTarget('+',$a_node_id);
365  $tpl->setCurrentBlock("expander");
366  $tpl->setVariable("LINK_TARGET", $target);
367  $tpl->setVariable("IMGPATH", ilUtil::getImagePath("browser/plus.gif"));
368  $tpl->parseCurrentBlock();
369  }
370 
371  if ($picture == 'minus')
372  {
373  $target = $this->createTarget('-',$a_node_id);
374  $tpl->setCurrentBlock("expander");
375  $tpl->setVariable("LINK_TARGET", $target);
376  $tpl->setVariable("IMGPATH", ilUtil::getImagePath("browser/minus.gif"));
377  $tpl->parseCurrentBlock();
378  }
379 
380  if ($picture == 'blank' or $picture == 'winkel'
381  or $picture == 'hoch' or $picture == 'quer' or $picture == 'ecke')
382  {
383  $tpl->setCurrentBlock("expander");
384  $tpl->setVariable("IMGPATH", ilUtil::getImagePath("browser/".$picture.".gif"));
385  $tpl->setVariable("TXT_ALT_IMG", $lng->txt($a_option["desc"]));
386  $tpl->parseCurrentBlock();
387  }
388  }
389 
390  if ($this->output_icons)
391  {
392  $tpl->setCurrentBlock("icon");
393  $tpl->setVariable("ICON_IMAGE" ,ilUtil::getImagePath("icon_".$a_option["type"].".gif"));
394  $tpl->setVariable("TXT_ALT_IMG", $lng->txt($a_option["desc"]));
395  $tpl->parseCurrentBlock();
396  }
397  $tpl->setCurrentBlock("row");
398  $target = (strpos($this->target, "?") === false) ?
399  $this->target."?" : $this->target."&";
400  $tpl->setVariable("LINK_TARGET", $target.$this->target_get."=".$a_node_id.$this->params_get);
401  $tpl->setVariable("TITLE", $a_option["title"]);
402 
403  if ($this->frame_target != "")
404  {
405  $tpl->setVariable("TARGET", " target=\"".$this->frame_target."\"");
406  }
407 
408  $tpl->parseCurrentBlock();
409 
410  $this->output[] = $tpl->get();
411  }
412 
420  function createTarget($a_type,$a_node_id)
421  {
422  if (!isset($a_type) or !is_string($a_type) or !isset($a_node_id))
423  {
424  $this->ilias->raiseError(get_class($this)."::createTarget(): Missing parameter or wrong datatype! ".
425  "type: ".$a_type." node_id:".$a_node_id,$this->ilias->error_obj->WARNING);
426  }
427 
428  // SET expand parameter:
429  // positive if object is expanded
430  // negative if object is compressed
431  $a_node_id = $a_type == '+' ? $a_node_id : -(int) $a_node_id;
432 
433  $sep = (is_int(strpos($this->expand_target, "?")))
434  ? "&"
435  : "?";
436  return $this->expand_target.$sep."expand=".$a_node_id.$this->params_get;
437  }
438 
445  function setFrameTarget($a_target)
446  {
447  $this->frame_target = $a_target;
448  }
449 
455  function createLines($a_depth)
456  {
457  for ($i = 0; $i < count($this->format_options); ++$i)
458  {
459  if ($this->format_options[$i]["depth"] == $a_depth+1
460  and !$this->format_options[$i]["container"]
461  and $this->format_options[$i]["depth"] != 1)
462  {
463  $this->format_options[$i]["tab"]["$a_depth"] = "quer";
464  }
465 
466  if ($this->format_options[$i]["depth"] == $a_depth+2)
467  {
468  if ($this->is_in_array($i+1,$this->format_options[$i]["depth"]))
469  {
470  $this->format_options[$i]["tab"]["$a_depth"] = "winkel";
471  }
472  else
473  {
474  $this->format_options[$i]["tab"]["$a_depth"] = "ecke";
475  }
476  }
477 
478  if ($this->format_options[$i]["depth"] > $a_depth+2)
479  {
480  if ($this->is_in_array($i+1,$a_depth+2))
481  {
482  $this->format_options[$i]["tab"]["$a_depth"] = "hoch";
483  }
484  }
485  }
486  }
487 
495  function is_in_array($a_start,$a_depth)
496  {
497  for ($i=$a_start;$i<count($this->format_options);++$i)
498  {
499  if ($this->format_options[$i]["depth"] < $a_depth)
500  {
501  break;
502  }
503 
504  if ($this->format_options[$i]["depth"] == $a_depth)
505  {
506  return true;
507  }
508  }
509  return false;
510  }
511 
518  function getIndex($a_data)
519  {
520  foreach ($this->format_options as $key => $value)
521  {
522  if (($value["child"] == $a_data["parent"]))
523  {
524  return $key;
525  }
526  }
527 
528  // exit on error
529  $this->ilias->raiseError(get_class($this)."::getIndex(): Error in tree. No index found!",$this->ilias->error_obj->FATAL);
530  }
531 
538  function addFilter($a_item)
539  {
540  $ispresent = 0;
541 
542  if (is_array($this->filter))
543  {
544  //run through filter
545  foreach ($this->filter as $item)
546  {
547  if ($item == $a_item)
548  {
549  $is_present = 1;
550 
551  return false;
552  }
553  }
554  }
555  else
556  {
557  $this->filter = array();
558  }
559 
560  if ($is_present == 0)
561  {
562  $this->filter[] = $a_item;
563 
564  }
565 
566  return true;
567  }
568 
575  function delFilter($a_item)
576  {
577  //check if a filter exists
578  if (is_array($this->filter))
579  {
580  //build copy of the existing filter without the given item
581  $tmp = array();
582 
583  foreach ($this->filter as $item)
584  {
585  if ($item != $a_item)
586  {
587  $tmp[] = $item;
588  }
589  else
590  {
591  $deleted = 1;
592  }
593  }
594  $this->filter = $tmp;
595  }
596  else
597  {
598  return false;
599  }
600 
601  if ($deleted == 1)
602  {
603  return true;
604  }
605  else
606  {
607  return false;
608  }
609  }
610 
617  function setExpand($a_node_id)
618  {
619  // IF ISN'T SET CREATE SESSION VARIABLE
620  if(!is_array($_SESSION["expand"]))
621  {
622  $_SESSION["expand"] = array($this->tree->getRootId());
623  }
624  // IF $_GET["expand"] is positive => expand this node
625  if ($a_node_id > 0 && !in_array($a_node_id,$_SESSION["expand"]))
626  {
627  array_push($_SESSION["expand"],$a_node_id);
628  }
629  // IF $_GET["expand"] is negative => compress this node
630  if ($a_node_id < 0)
631  {
632  $key = array_keys($_SESSION["expand"],-(int) $a_node_id);
633  unset($_SESSION["expand"][$key[0]]);
634  }
635  $this->expanded = $_SESSION["expand"];
636  }
637 
644  function setFiltered($a_bool)
645  {
646  $this->filtered = $a_bool;
647  return true;
648  }
649 
656  function checkFilter($a_item)
657  {
658  if (is_array($this->filter))
659  {
660  return in_array($a_item, $this->filter);
661  }
662  else
663  {
664  return false;
665  }
666  }
667 } // END class.ilExplorer
668 ?>