ILIAS  release_5-1 Revision 5.0.0-5477-g43f3e3fab5f
class.ilSearchGUI.php
Go to the documentation of this file.
1<?php
2/* Copyright (c) 1998-2009 ILIAS open source, Extended GPL, see docs/LICENSE */
3
4include_once 'Services/Search/classes/class.ilSearchBaseGUI.php';
5
6
7
23{
24 protected $search_cache = null;
25
29 var $type;
30
31
36 public function __construct()
37 {
38 global $ilUser, $lng;
39
40 $lng->loadLanguageModule("search");
41
42 // put form values into "old" post variables
44 $this->form->checkInput();
45
46 $new_search = isset($_POST['cmd']['performSearch']) ? true : false;
47
48 $enabled_types = ilSearchSettings::getInstance()->getEnabledLuceneItemFilterDefinitions();
49 foreach($enabled_types as $type => $pval)
50 {
51 if($_POST['filter_type'][$type] == 1)
52 {
53 $_POST["search"]["details"][$type] = $_POST['filter_type'][$type];
54 }
55 }
56
57 $_POST["search"]["string"] = $_POST["term"];
58 $_POST["search"]["combination"] = $_POST["combination"];
59 $_POST["search"]["type"] = $_POST["type"];
60 $_SESSION['search_root'] = $_POST["area"];
61
62 $this->root_node = $_SESSION['search_root'] ? $_SESSION['search_root'] : ROOT_FOLDER_ID;
63 $this->setType($_POST['search']['type'] ? $_POST['search']['type'] : $_SESSION['search']['type']);
64 $this->setCombination($_POST['search']['combination'] ? $_POST['search']['combination'] : $_SESSION['search']['combination']);
65 $this->setString($_POST['search']['string'] ? $_POST['search']['string'] : $_SESSION['search']['string']);
66 #$this->setDetails($_POST['search']['details'] ? $_POST['search']['details'] : $_SESSION['search']['details']);
67 $this->setDetails($new_search ? $_POST['search']['details'] : $_SESSION['search']['details']);
68 parent::__construct();
69 }
70
71
76 public function executeCommand()
77 {
78 global $rbacsystem, $ilCtrl;
79
80
81
82 $next_class = $this->ctrl->getNextClass($this);
83 $cmd = $this->ctrl->getCmd();
84
85 switch($next_class)
86 {
87 case "ilpropertyformgui":
88 //$this->initStandardSearchForm(ilSearchBaseGUI::SEARCH_FORM_STANDARD);
89 $form = $this->getSearchAreaForm();
90 $this->prepareOutput();
91 $ilCtrl->setReturn($this, 'storeRoot');
92 return $ilCtrl->forwardCommand($form);
93
94 case 'ilobjectcopygui':
95 $this->prepareOutput();
96 $this->ctrl->setReturn($this,'');
97 include_once './Services/Object/classes/class.ilObjectCopyGUI.php';
98 $cp = new ilObjectCopyGUI($this);
99 $this->ctrl->forwardCommand($cp);
100 break;
101
102 default:
103 $this->initUserSearchCache();
104 if(!$cmd)
105 {
106 $cmd = "showSavedResults";
107 }
108 $this->prepareOutput();
109 $this->handleCommand($cmd);
110 break;
111 }
112 return true;
113 }
114
119 function setType($a_type)
120 {
121 $_SESSION['search']['type'] = $this->type = $a_type;
122 }
123 function getType()
124 {
125 return $this->type ? $this->type : ilSearchBaseGUI::SEARCH_FAST;
126 }
131 function setCombination($a_combination)
132 {
133 $_SESSION['search']['combination'] = $this->combination = $a_combination;
134 }
135 function getCombination()
136 {
137 return $this->combination ? $this->combination : ilSearchBaseGUI::SEARCH_OR;
138 }
143 function setString($a_str)
144 {
145 $_SESSION['search']['string'] = $this->string = $a_str;
146 }
147 function getString()
148 {
149 return $this->string;
150 }
155 function setDetails($a_details)
156 {
157 $_SESSION['search']['details'] = $this->details = $a_details;
158 }
159 function getDetails()
160 {
161 return $this->details ? $this->details : array();
162 }
163
164
165 function getRootNode()
166 {
167 return $this->root_node ? $this->root_node : ROOT_FOLDER_ID;
168 }
169 function setRootNode($a_node_id)
170 {
171 $_SESSION['search_root'] = $this->root_node = $a_node_id;
172 }
173
174
175 function remoteSearch()
176 {
177 $this->setString(ilUtil::stripSlashes($_POST['queryString']));
178 $this->setRootNode((int) $_POST['root_id']);
179 $this->performSearch();
180
181 }
182
186 protected function storeRoot()
187 {
188 $form = $this->getSearchAreaForm();
189
190 $this->root_node = $form->getItemByPostVar('area')->getValue();
191 $this->search_cache->setRoot($this->root_node);
192 $this->search_cache->save();
193 $this->search_cache->deleteCachedEntries();
194
195 include_once './Services/Object/classes/class.ilSubItemListGUI.php';
197
198 $this->performSearch();
199 }
200
204 public function autoComplete()
205 {
206 if((int) $_REQUEST['search_type'] == -1)
207 {
208 $a_fields = array('login','firstname','lastname','email');
209 $result_field = 'login';
210
211 // Starting user autocomplete search
212 include_once './Services/User/classes/class.ilUserAutoComplete.php';
213 $auto = new ilUserAutoComplete();
214
215
216 $auto->setMoreLinkAvailable(true);
217 $auto->setSearchFields($a_fields);
218 $auto->setResultField($result_field);
219 $auto->enableFieldSearchableCheck(true);
220 $auto->setUserLimitations(true);
222
223 $res = $auto->getList($_REQUEST['term']);
224
225 $res_obj = json_decode($res);
226
227 ilLoggerFactory::getLogger('sea')->debug($res);
228
229
230 ilLoggerFactory::getLogger('sea')->dump($res_obj->items, ilLogLevel::DEBUG);
231 if(is_array($res_obj->items))
232 {
233 echo json_encode($res_obj->items);
234 exit;
235 }
236
237 }
238 else
239 {
240 $q = $_REQUEST["term"];
241 include_once("./Services/Search/classes/class.ilSearchAutoComplete.php");
243 ilLoggerFactory::getLogger('sea')->dump(json_decode($list));
244 echo $list;
245 exit;
246 }
247 }
248
249 function showSearch()
250 {
251 global $ilLocator, $ilCtrl, $lng;
252
253 // include js needed
254 include_once("./Services/UIComponent/Overlay/classes/class.ilOverlayGUI.php");
256 $this->tpl->addJavascript("./Services/Search/js/Search.js");
257
258 include_once("./Services/UIComponent/Glyph/classes/class.ilGlyphGUI.php");
259
260 $this->tpl->addBlockFile('ADM_CONTENT','adm_content','tpl.search.html','Services/Search');
261 $this->tpl->setVariable("FORM_ACTION", $ilCtrl->getFormAction($this,'performSearch'));
262 $this->tpl->setVariable("TERM", ilUtil::prepareFormOutput($this->getString()));
263 include_once("./Services/UIComponent/Button/classes/class.ilSubmitButton.php");
265 $btn->setCommand("performSearch");
266 $btn->setCaption("search");
267 $this->tpl->setVariable("SUBMIT_BTN",$btn->render());
268 $this->tpl->setVariable("TXT_OPTIONS", $lng->txt("options"));
269 $this->tpl->setVariable("ARR_IMG", ilGlyphGUI::get(ilGlyphGUI::CARET));
270 $this->tpl->setVariable("TXT_COMBINATION", $lng->txt("search_term_combination"));
271 $this->tpl->setVariable('TXT_COMBINATION_DEFAULT', ilSearchSettings::getInstance()->getDefaultOperator() == ilSearchSettings::OPERATOR_AND ? $lng->txt('search_all_words') : $lng->txt('search_any_word'));
272
273 if (ilSearchSettings::getInstance()->isLuceneItemFilterEnabled())
274 {
275 $this->tpl->setCurrentBlock("type_sel");
276 $this->tpl->setVariable('TXT_TYPE_DEFAULT',$lng->txt("search_fast_info"));
277 $this->tpl->setVariable("TXT_TYPE", $lng->txt("search_type"));
279 $this->tpl->setVariable("ARR_IMGT", ilGlyphGUI::get(ilGlyphGUI::CARET));
280 $this->tpl->setVariable("FORM", $this->form->getHTML());
281 $this->tpl->parseCurrentBlock();
282 }
283
284 if(ilSearchSettings::getInstance()->isDateFilterEnabled())
285 {
286 // begin-patch creation_date
287 $this->tpl->setVariable('TXT_FILTER_BY_CDATE',$this->lng->txt('search_filter_cd'));
288 $this->tpl->setVariable('TXT_CD_OFF',$this->lng->txt('search_off'));
289 $this->tpl->setVariable('FORM_CD',$this->getCreationDateForm()->getHTML());
290 $this->tpl->setVariable("ARR_IMG_CD", ilGlyphGUI::get(ilGlyphGUI::CARET));
291 // end-patch creation_date
292 }
293
294
295 $this->tpl->setVariable("TXT_AREA", $lng->txt("search_area"));
296
297 // search area form
298 $this->tpl->setVariable('SEARCH_AREA_FORM', $this->getSearchAreaForm()->getHTML());
299
300 return true;
301 }
302
304 {
305 global $ilUser;
306
307 // Read old result sets
308 include_once 'Services/Search/classes/class.ilSearchResult.php';
309
310 $result_obj = new ilSearchResult($ilUser->getId());
311 $result_obj->read();
312 $result_obj->filterResults($this->getRootNode());
313
314 $this->showSearch();
315
316 // Show them
317 if(count($result_obj->getResults()))
318 {
319 $this->addPager($result_obj,'max_page');
320
321 include_once './Services/Search/classes/class.ilSearchResultPresentation.php';
323 $presentation->setResults($result_obj->getResultsForPresentation());
324 $presentation->setSubitemIds($result_obj->getSubitemIds());
325 $presentation->setPreviousNext($this->prev_link, $this->next_link);
326 #$presentation->setSearcher($searcher);
327
328 if($presentation->render())
329 {
330// $this->tpl->setVariable('SEARCH_RESULTS',$presentation->getHTML());
331 $this->tpl->setVariable('RESULTS_TABLE',$presentation->getHTML(true));
332 }
333 }
334
335 return true;
336 }
337
338
342 function performSearch()
343 {
344 global $ilUser;
345
346 if(!isset($_GET['page_number']) and $this->search_mode != 'in_results' )
347 {
348 unset($_SESSION['max_page']);
349 $this->search_cache->deleteCachedEntries();
350 }
351
352 if($this->getType() == ilSearchBaseGUI::SEARCH_DETAILS and !$this->getDetails())
353 {
354 ilUtil::sendInfo($this->lng->txt('search_choose_object_type'));
355 $this->showSearch();
356 return false;
357 }
358
359 // Step 1: parse query string
360 if(!is_object($query_parser =& $this->__parseQueryString()))
361 {
362 ilUtil::sendInfo($query_parser);
363 $this->showSearch();
364
365 return false;
366 }
367 // Step 2: perform object search. Get an ObjectSearch object via factory. Depends on fulltext or like search type.
368 $result =& $this->__searchObjects($query_parser);
369
370 // Step 3: perform meta keyword search. Get an MetaDataSearch object.
371 $result_meta =& $this->__searchMeta($query_parser,'keyword');
372 $result->mergeEntries($result_meta);
373
374 $result_meta =& $this->__searchMeta($query_parser,'contribute');
375 $result->mergeEntries($result_meta);
376
377 $result_meta =& $this->__searchMeta($query_parser,'title');
378 $result->mergeEntries($result_meta);
379
380 $result_meta =& $this->__searchMeta($query_parser,'description');
381 $result->mergeEntries($result_meta);
382
383 // Perform details search in object specific tables
385 {
386 $result = $this->__performDetailsSearch($query_parser,$result);
387 }
388 // Step 5: Search in results
389 if($this->search_mode == 'in_results')
390 {
391 include_once 'Services/Search/classes/class.ilSearchResult.php';
392
393 $old_result_obj = new ilSearchResult($ilUser->getId());
394 $old_result_obj->read();
395
396 $result->diffEntriesFromResult($old_result_obj);
397 }
398
399
400 // Step 4: merge and validate results
401 $result->filter($this->getRootNode(),$query_parser->getCombination() == 'and');
402 $result->save();
403 $this->showSearch();
404
405 if(!count($result->getResults()))
406 {
407 ilUtil::sendInfo($this->lng->txt('search_no_match'));
408 }
409
410 if($result->isLimitReached())
411 {
412 #$message = sprintf($this->lng->txt('search_limit_reached'),$this->settings->getMaxHits());
413 #ilUtil::sendInfo($message);
414 }
415
416 // Step 6: show results
417 $this->addPager($result,'max_page');
418
419 include_once './Services/Search/classes/class.ilSearchResultPresentation.php';
421 $presentation->setResults($result->getResultsForPresentation());
422 $presentation->setSubitemIds($result->getSubitemIds());
423 $presentation->setPreviousNext($this->prev_link, $this->next_link);
424
425 if($presentation->render())
426 {
427// $this->tpl->setVariable('SEARCH_RESULTS',$presentation->getHTML());
428 $this->tpl->setVariable('RESULTS_TABLE',$presentation->getHTML(true));
429 }
430
431 return true;
432 }
433
434
435
436 function prepareOutput()
437 {
438 global $ilTabs, $ilHelp;
439
440 parent::prepareOutput();
441
442 $ilHelp->setScreenIdComponent("src");
443
444 $ilTabs->addTab("search", $this->lng->txt("search"),
445 $this->ctrl->getLinkTarget($this));
446
447 if (!$this->settings->getHideAdvancedSearch())
448 {
449 $ilTabs->addTab("adv_search", $this->lng->txt("search_advanced"),
450 $this->ctrl->getLinkTargetByClass('iladvancedsearchgui'));
451 }
452
453 $ilTabs->activateTab("search");
454 }
455
456 // PRIVATE
457 function &__performDetailsSearch(&$query_parser,&$result)
458 {
459 foreach($this->getDetails() as $type => $enabled)
460 {
461 if(!$enabled)
462 {
463 continue;
464 }
465
466 switch($type)
467 {
468 case 'crs':
469 $crs_search = ilObjectSearchFactory::_getObjectSearchInstance($query_parser);
470 $crs_search->setFilter(array('crs'));
471 $result->mergeEntries($crs_search->performSearch());
472 break;
473
474 case 'grp':
475 $grp_search = ilObjectSearchFactory::_getObjectSearchInstance($query_parser);
476 $grp_search->setFilter(array('grp'));
477 $result->mergeEntries($grp_search->performSearch());
478 break;
479
480 case 'lms':
481 $content_search =& ilObjectSearchFactory::_getLMContentSearchInstance($query_parser);
482 $content_search->setFilter($this->__getFilter());
483 $result->mergeEntries($content_search->performSearch());
484 break;
485
486 case 'frm':
487 $forum_search =& ilObjectSearchFactory::_getForumSearchInstance($query_parser);
488 $forum_search->setFilter($this->__getFilter());
489 $result->mergeEntries($forum_search->performSearch());
490 break;
491
492 case 'glo':
493 // Glossary term definition pages
494 $gdf_search =& ilObjectSearchFactory::_getLMContentSearchInstance($query_parser);
495 $gdf_search->setFilter(array('gdf'));
496 $result->mergeEntries($gdf_search->performSearch());
497 // Glossary terms
498 $gdf_term_search =& ilObjectSearchFactory::_getGlossaryDefinitionSearchInstance($query_parser);
499 $result->mergeEntries($gdf_term_search->performSearch());
500 break;
501
502 case 'exc':
503 $exc_search =& ilObjectSearchFactory::_getExerciseSearchInstance($query_parser);
504 $exc_search->setFilter($this->__getFilter());
505 $result->mergeEntries($exc_search->performSearch());
506 break;
507
508 case 'mcst':
509 $mcst_search =& ilObjectSearchFactory::_getMediaCastSearchInstance($query_parser);
510 $result->mergeEntries($mcst_search->performSearch());
511 break;
512
513 case 'tst':
514 $tst_search =& ilObjectSearchFactory::_getTestSearchInstance($query_parser);
515 $tst_search->setFilter($this->__getFilter());
516 $result->mergeEntries($tst_search->performSearch());
517 break;
518
519 case 'mep':
520 $mep_search =& ilObjectSearchFactory::_getMediaPoolSearchInstance($query_parser);
521 $mep_search->setFilter($this->__getFilter());
522 $result->mergeEntries($mep_search->performSearch());
523
524 // Mob keyword search
525 $mob_search = ilObjectSearchFactory::_getMediaPoolSearchInstance($query_parser);
526 $mob_search->setFilter($this->__getFilter());
527 $result->mergeEntries($mob_search->performKeywordSearch());
528
529 break;
530
531 case 'wiki':
532 $wiki_search =& ilObjectSearchFactory::_getWikiContentSearchInstance($query_parser);
533 $wiki_search->setFilter($this->__getFilter());
534 $result->mergeEntries($wiki_search->performSearch());
535
536 /*$result_meta =& $this->__searchMeta($query_parser,'title');
537 $result->mergeEntries($result_meta);
538 $result_meta =& $this->__searchMeta($query_parser,'description');
539 $result->mergeEntries($result_meta);*/
540 break;
541
542 }
543 }
544 return $result;
545 }
546
553 {
554 include_once 'Services/Search/classes/class.ilQueryParser.php';
555
556 $query_parser = new ilQueryParser(ilUtil::stripSlashes($this->getString()));
557 $query_parser->setCombination($this->getCombination());
558 $query_parser->parse();
559
560 if(!$query_parser->validate())
561 {
562 return $query_parser->getMessage();
563 }
564 return $query_parser;
565 }
571 function &__searchObjects(&$query_parser)
572 {
573 include_once 'Services/Search/classes/class.ilObjectSearchFactory.php';
574
575 $obj_search =& ilObjectSearchFactory::_getObjectSearchInstance($query_parser);
577 {
578 $obj_search->setFilter($this->__getFilter());
579 }
580
581 $this->parseCreationFilter($obj_search);
582 return $obj_search->performSearch();
583 }
584
585 public function parseCreationFilter(ilObjectSearch $search)
586 {
587 $options = $this->getSearchCache()->getCreationFilter();
588
589 if(!$options['enabled'])
590 {
591 return TRUE;
592 }
593 $limit = new ilDate($options['date'],IL_CAL_UNIX);
594 $search->setCreationDateFilterDate($limit);
595
596 switch($options['ontype'])
597 {
598 case 1:
600 break;
601
602 case 2:
604 break;
605
606 case 3:
608 break;
609 }
610
611 return TRUE;
612 }
613
614
620 function &__searchMeta(&$query_parser,$a_type)
621 {
622 include_once 'Services/Search/classes/class.ilObjectSearchFactory.php';
623
624 $meta_search =& ilObjectSearchFactory::_getMetaDataSearchInstance($query_parser);
626 {
627 $meta_search->setFilter($this->__getFilter());
628 }
629 switch($a_type)
630 {
631 case 'keyword':
632 $meta_search->setMode('keyword');
633 break;
634
635 case 'contribute':
636 $meta_search->setMode('contribute');
637 break;
638
639 case 'title':
640 $meta_search->setMode('title');
641 break;
642
643 case 'description':
644 $meta_search->setMode('description');
645 break;
646 }
647 return $meta_search->performSearch();
648 }
654 function __getFilter()
655 {
657 {
658 return false;
659 }
660
661 foreach($this->getDetails() as $key => $detail_type)
662 {
663 if(!$detail_type)
664 {
665 continue;
666 }
667
668 switch($key)
669 {
670 case 'lms':
671 $filter[] = 'lm';
672 $filter[] = 'dbk';
673 $filter[] = 'pg';
674 $filter[] = 'st';
675 $filter[] = 'sahs';
676 $filter[] = 'htlm';
677 break;
678
679 case 'frm':
680 $filter[] = 'frm';
681 break;
682
683 case 'glo':
684 $filter[] = 'glo';
685 break;
686
687 case 'exc':
688 $filter[] = 'exc';
689 break;
690
691 case 'mcst':
692 $filter[] = 'mcst';
693 break;
694
695 case 'tst':
696 $filter[] = 'tst';
697 $filter[] = 'svy';
698 $filter[] = 'qpl';
699 $filter[] = 'spl';
700 break;
701
702 case 'mep':
703 $filter[] = 'mep';
704 $filter[] = 'mob';
705 break;
706
707 case 'fil':
708 $filter[] = 'file';
709 break;
710
711 case 'wiki':
712 $filter[] = 'wpg';
713 break;
714
715 default:
716 $filter[] = $key;
717 }
718 }
719 return $filter ? $filter : array();
720 }
721
728 protected function initUserSearchCache()
729 {
730 global $ilUser;
731
732 include_once('Services/Search/classes/class.ilUserSearchCache.php');
733 $this->search_cache = ilUserSearchCache::_getInstance($ilUser->getId());
734 $this->search_cache->switchSearchType(ilUserSearchCache::DEFAULT_SEARCH);
735
736 if($_GET['page_number'])
737 {
738 $this->search_cache->setResultPageNumber((int) $_GET['page_number']);
739 }
740 if(isset($_POST['cmd']['performSearch']))
741 {
742 $this->search_cache->setQuery(ilUtil::stripSlashes($_POST['term']));
743 $this->search_cache->setCreationFilter($this->loadCreationFilter());
744 $this->search_cache->save();
745 }
746 }
747
748}
749?>
$result
$_GET["client_id"]
$_SESSION["AccountId"]
const IL_CAL_UNIX
Class for single dates.
static get($a_glyph, $a_text="")
Get glyph html.
static getLogger($a_component_id)
Get component logger.
GUI class for the workflow of copying objects.
static _getMetaDataSearchInstance($query_parser)
get reference of ilFulltext/LikeMetaDataSearch.
static _getMediaPoolSearchInstance($query_parser)
get reference of ilFulltextMediapoolSearch
static _getLMContentSearchInstance($query_parser)
get reference of ilFulltextLMContentSearch
static _getTestSearchInstance($query_parser)
get reference of ilFulltextTestSearch
static _getGlossaryDefinitionSearchInstance($query_parser)
get reference of ilFulltextGlossaryDefinitionSearch
static _getObjectSearchInstance($query_parser)
get reference of ilFulltext/LikeObjectSearch.
static _getExerciseSearchInstance($query_parser)
get reference of ilFulltextExerciseSearch
static _getForumSearchInstance($query_parser)
get reference of ilFulltextForumSearch
static _getWikiContentSearchInstance($query_parser)
get reference of ilFulltextWikiContentSearch
setCreationDateFilterDate(ilDate $day)
Set creation date filter.
setCreationDateFilterOperator($a_operator)
static initJavascript()
Init javascript.
static getList($a_str)
Get completion list.
initStandardSearchForm($a_mode)
Init standard search form.
addPager($result, $a_session_key)
Add Pager.
getSearchCache()
Get user search cache.
getSearchAreaForm()
Init standard search form.
handleCommand($a_cmd)
Handle command.
Class ilSearchGUI.
setString($a_str)
Set/get search string @access public.
performSearch()
Perform search.
& __searchObjects(&$query_parser)
Search in obect title,desctiption.
__construct()
Constructor @access public.
setCombination($a_combination)
Set/get combination of search ('and' or 'or') @access public.
executeCommand()
Control @access public.
setDetails($a_details)
Set/get details (object types for details search) @access public.
setType($a_type)
Set/get type of search (detail or 'fast' search) @access public.
setRootNode($a_node_id)
parseCreationFilter(ilObjectSearch $search)
storeRoot()
Store new root node.
& __searchMeta(&$query_parser, $a_type)
Search in object meta data (keyword)
autoComplete()
Data resource for autoComplete.
__getFilter()
Get object type for filter (If detail search is enabled)
& __performDetailsSearch(&$query_parser, &$result)
initUserSearchCache()
Init user search cache.
& __parseQueryString()
parse query string, using query parser instance
Presentation of search results using object list gui.
static resetDetails()
reset details As long as static::resetDetails is not possible this method is final
static getInstance()
Factory.
Auto completion class for user lists.
static _getInstance($a_usr_id)
Get singleton instance.
static stripSlashes($a_str, $a_strip_html=true, $a_allow="")
strip slashes if magic qoutes is enabled
static sendInfo($a_info="", $a_keep=false)
Send Info Message to Screen.
static prepareFormOutput($a_str, $a_strip=false)
prepares string output for html forms @access public
$_POST['username']
Definition: cron.php:12
global $ilCtrl
Definition: ilias.php:18
exit
Definition: login.php:54
$cmd
Definition: sahs_server.php:35
if($_REQUEST['ilias_path']) define('ILIAS_HTTP_PATH' $_REQUEST['ilias_path']
Definition: index.php:7
if(!is_array($argv)) $options
global $ilUser
Definition: imgupload.php:15