X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-core%2Finclude%2Fclass_filter.inc;h=efd72574e18683c237523fd59872278ea2f73ec6;hb=fa919250554e64617662c2e07e569263a53a1ee3;hp=a829942939f92646e73e802514e31ecad23926ad;hpb=38f2ea49ea8d185f98d0868aeab3e95ee7dbec16;p=gosa.git diff --git a/gosa-core/include/class_filter.inc b/gosa-core/include/class_filter.inc index a82994293..efd72574e 100644 --- a/gosa-core/include/class_filter.inc +++ b/gosa-core/include/class_filter.inc @@ -1,4 +1,24 @@ load($filename)) { die("Cannot parse $filename!"); } + + $this->pid= preg_replace("/[^0-9]/", "", microtime(TRUE)); } @@ -32,11 +57,11 @@ class filter { $contents = file_get_contents($filename); $this->xmlData= xml::xml2array($contents, 1); - if (!isset($this->xmlData['filter'])) { + if (!isset($this->xmlData['filterdef'])) { return false; } - $this->xmlData= $this->xmlData["filter"]; + $this->xmlData= $this->xmlData["filterdef"]; // Load filter if (isset($this->xmlData['search'])) { @@ -46,13 +71,27 @@ class filter { // Move information $entry= $this->xmlData['search']; - $this->baseMode= $entry['base']; $this->scopeMode= $entry['scope']; + if ($entry['scope'] == "auto") { + $this->scope= "one"; + } else { + $this->scope= $entry['scope']; + } $this->query= $entry['query']; } else { return false; } + // Transfer initial value + if (isset($this->xmlData['definition']['initial']) && $this->xmlData['definition']['initial'] == "true"){ + $this->initial= true; + } + + // Transfer category + if (isset($this->xmlData['definition']['category'])){ + $this->category= $this->xmlData['definition']['category']; + } + // Generate formular data if (isset($this->xmlData['element'])) { if (!isset($this->xmlData['element'][0])){ @@ -87,6 +126,10 @@ class filter { $this->alphabetElements[]= $tag; } } + + uasort($this->elements, 'strlenSort'); + $this->elements= array_reverse($this->elements); + } return true; @@ -96,7 +139,15 @@ class filter { function getTextfield($element) { $tag= $element['tag']; - $result= ""; + $size= 30; + if (isset($element['size'])){ + $size= $element['size']; + } + $maxlength= 30; + if (isset($element['maxlength'])){ + $maxlength= $element['maxlength']; + } + $result= ""; if (isset($element['autocomplete'])) { $frequency= "0.5"; $characters= "1"; @@ -125,27 +176,56 @@ class filter { $checked= " checked"; } - $result= ""; + $result= ""; return $result; } function getCombobox($element) { - $result= ""; + + // Fill with presets foreach ($element['value'] as $value) { $selected= ""; if ($this->elementValues[$element['tag']] == $value['key']) { $selected= " selected"; } - $result.= ""; + + // Handle translations + $result.= ""; } + + // Use autocompleter for additional data + if (isset($element['autocomplete'])) { + $list= $this->getCompletitionList($element['autocomplete'], $element['tag']); + foreach ($list as $value) { + $selected= ""; + if ($this->elementValues[$element['tag']] == $value) { + $selected= " selected"; + } + $result.= ""; + } + } + $result.= ""; return $result; } + function setComboBoxOptions($tag, $options) + { + if (isset($this->elements[$tag]) && $this->elements[$tag]['type'] == "combobox") { + + $this->elements[$tag]['value']= array(); + foreach ($options as $key => $label) { + $this->elements[$tag]['value'][]= array('label' => $label, 'key' => $key); + } + } + } + + function getCurrentBase() { if (isset($this->search->base) && (string)$this->search->scope != "auto") { @@ -166,50 +246,27 @@ class filter { } - function setBases($bases) { - $this->bases= $bases; + function setConverter($field, $hook) + { + $this->converter[$field]= $hook; } - function setObjectStorage($storage) { + function setObjectStorage($storage) + { $this->objectStorage= $storage; } - function setObjectBase($base) { - $this->objectBase= $base; - } - - - function setCategory($category) { - $this->category= $category; - } - - - function setCurrentBase($base) { + function setBase($base) + { $this->base= $base; } - function setCurrentScope($scope) { - $this->scope= $scope; - } - - - function renderBase() + function setCurrentScope($scope) { - $result= ""; - - return $result; + $this->scope= $scope; } @@ -261,17 +318,16 @@ class filter { function renderScope() { $checked= $this->scope == "sub"?" checked":""; - return " "._("Search in subtrees"); + return " "; } - function renderFilter() + function render() { $smarty= get_smarty(); $smarty->assign("ALPHABET", $this->renderAlphabet()); $smarty->assign("APPLY", $this->renderApply()); $smarty->assign("SCOPE", $this->renderScope()); - $smarty->assign("BASE", $this->renderBase()); // Load template and replace elementsHtml[] foreach ($this->elements as $tag => $element) { @@ -295,8 +351,16 @@ class filter { $smarty->assign("$tag", $htmlCode); } + // Try to load template from plugin the folder first... + $file = get_template_path($this->xmlData['definition']['template'], true); + + // ... if this fails, try to load the file from the theme folder. + if(!file_exists($file)){ + $file = get_template_path($this->xmlData['definition']['template']); + } + // Load template - return ("".$smarty->fetch(get_template_path("filter/".$this->xmlData['definition']['template']))); + return ("".$smarty->fetch($file)); } @@ -305,6 +369,12 @@ class filter { global $class_mapping; $result= array(); + // Return empty list if initial is not set + if (!$this->initial) { + $this->initial= true; + return $result; + } + // Go thru all queries and merge results foreach ($this->query as $query) { if (!isset($query['backend']) || !isset($query['filter']) || !isset($query['attribute'])) { @@ -326,23 +396,31 @@ class filter { if (!isset($element['set']) || !isset($element['unset'])) { continue; } - $e_set= is_array($element['set'])?"":$element['set']; - $e_unset= is_array($element['unset'])?"":$element['unset']; + + // Handle converters if present + if (isset($this->converter[$tag])) { + preg_match('/([^:]+)::(.*)$/', $this->converter[$tag], $m); + $e_set= call_user_func(array($m[1], $m[2]), preg_replace('/\$/', $this->elementValues[$tag], is_array($element['set'])?"":$element['set'])); + $e_unset= call_user_func(array($m[1], $m[2]), preg_replace('/\$/', $this->elementValues[$tag], is_array($element['unset'])?"":$element['unset'])); + } else { + $e_set= is_array($element['set'])?"":$element['set']; + $e_unset= is_array($element['unset'])?"":$element['unset']; + } if ($this->elementValues[$tag] == "") { - $e_unset= preg_replace('/\$/', normalizeLdap($this->elementValues[$tag]), $e_unset); + $e_unset= preg_replace('/[^\\\\]\$/', normalizeLdap($this->elementValues[$tag]), $e_unset); + $e_unset= preg_replace('/\\\\\$/','$', $e_unset); $filter= preg_replace("/\\$$tag/", $e_unset, $filter); } else { - $e_set= preg_replace('/\$/', normalizeLdap($this->elementValues[$tag]), $e_set); + $e_set= preg_replace('/[^\\\\]\$/', normalizeLdap($this->elementValues[$tag]), $e_set); + $e_set= preg_replace('/\\\\\$/','$', $e_set); $filter= preg_replace("/\\$$tag/", $e_set, $filter); } } - $result= array_merge($result, call_user_func(array($backend, 'query'), $this->base, $this->scope, $filter, $attributes, - $this->category, $this->objectStorage, $this->objectBase)); + $result= array_merge($result, call_user_func(array($backend, 'query'), $this->base, $this->scope, $filter, $attributes, $this->category, $this->objectStorage)); } - return ($result); } @@ -362,19 +440,15 @@ class filter { function update() { - /* React on alphabet links if needed */ if (isset($_GET['filter'])){ - $s= mb_substr(validate($_GET['filter']), 0, 1, "UTF8")."*"; - if ($s == "**"){ - $s= "*"; - } + $s= mb_substr(validate($_GET['filter']), 0, 1, "UTF8"); foreach ($this->alphabetElements as $tag) { $this->elementValues[$tag]= $s; } } - if (isset($_POST['FILTER_LOADED'])) { + if (isset($_POST['FILTER_PID']) && $_POST['FILTER_PID'] == $this->pid) { // Load post values and adapt filter, base and scope accordingly - but // only if we didn't get a _GET foreach ($this->elements as $tag => $element) { @@ -384,20 +458,59 @@ class filter { $this->elementValues[$tag]= ""; } } - } - // Save base - if (isset($_POST['BASE']) && $this->baseMode == "true") { - $base= validate($_POST['BASE']); - if (isset($this->bases[$base])) { - $this->base= $base; + // Save scope if needed + if ($this->scopeMode == "auto") { + $this->scope= isset($_POST['SCOPE'])?"sub":"one"; } } - // Save scope if needed - if ($this->scopeMode == "auto") { - $this->scope= isset($_POST['SCOPE'])?"sub":"one"; + } + + + function getCompletitionList($config, $tag, $value="*") + { + global $class_mapping; + $res= array(); + + // Is backend available? + $backend= "filter".$config['backend']; + if (!isset($class_mapping["$backend"])) { + die("Invalid backend specified in search config."); + } + + // Load filter and attributes + $filter= $config['filter']; + $attributes= $config['attribute']; + if (!is_array($attributes)) { + $attributes= array($attributes); } + + // Make filter + $filter= preg_replace("/\\$$tag/", normalizeLdap($value), $filter); + if (isset($config['base']) && isset($config['scope']) && isset($config['category'])) { + $result= call_user_func(array($backend, 'query'), $config['base'], $config['scope'], $filter, $attributes, + $config["category"], $config["objectStorage"]); + } else { + $result= call_user_func(array($backend, 'query'), $this->base, $this->scope, $filter, $attributes, + $this->category, $this->objectStorage); + } + + foreach ($result as $entry) { + foreach ($attributes as $attribute) { + if (is_array($entry[$attribute])) { + for ($i= 0; $i<$entry[$attribute]['count']; $i++) { + if (mb_stristr($entry[$attribute][$i], $value)) { + $res[]= $entry[$attribute][$i]; + } + } + } else { + $res[]= $entry[$attribute]; + } + } + } + + return $res; } @@ -406,46 +519,61 @@ class filter { global $class_mapping; $result= array(); + // Introduce maximum number of entries + $max= 25; + foreach ($this->autocompleters as $tag => $config) { if(isset($_POST[$tag])){ - - // Is backend available? - $backend= "filter".$config['backend']; - if (!isset($class_mapping["$backend"])) { - die("Invalid backend specified in search config."); - } - - // Load filter and attributes - $filter= $config['filter']; - $attributes= $config['attribute']; - if (!is_array($attributes)) { - $attributes= array($attributes); - } - - // Make filter - $filter= preg_replace("/\\$$tag/", normalizeLDAP($_POST[$tag]), $filter); - $result= call_user_func(array($backend, 'query'), $this->base, $this->scope, $filter, $attributes, - $this->category, $this->objectStorage, $this->objectBase); + $result= $this->getCompletitionList($config, $tag, $_POST[$tag]); + $result= array_unique($result); + asort($result); echo ''; } + } + } + + + function getObjectBase($dn) + { + global $config; + $base= ""; + + // Try every object storage + $storage= $this->objectStorage; + if (!is_array($storage)){ + $storage= array($storage); + } + foreach ($storage as $location) { + $pattern= "/^[^,]+,".preg_quote($location, '/')."/i"; + $base= preg_replace($pattern, '', $dn); + } + /* Set to base, if we're not on a correct subtree */ + if (!isset($config->idepartments[$base])){ + $base= $config->current['BASE']; } + + return $base; } + } +// Sort elements for element length to allow proper replacing later on +function strlenSort($a, $b) { + if (strlen($a['tag']) == strlen($b['tag'])) { + return 0; + } + return (strlen($a['tag']) < strlen($b['tag']) ? -1 : 1); +} + ?>