X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-core%2Finclude%2Fclass_filter.inc;h=6e256f8158e824db66468b71d939e56e0ecbedc9;hb=4b3498ae8e78a11c7c99663d45bab6a0a14df052;hp=7b1867c7926adde5ccc49082dd57c0017d871e43;hpb=168850b75e9a103c904a177fe904dcc28347a2b8;p=gosa.git diff --git a/gosa-core/include/class_filter.inc b/gosa-core/include/class_filter.inc old mode 100755 new mode 100644 index 7b1867c79..6e256f815 --- a/gosa-core/include/class_filter.inc +++ b/gosa-core/include/class_filter.inc @@ -1,4 +1,24 @@ load($filename)) { die("Cannot parse $filename!"); } } + function load($filename) { - // Load data into array - $xmlData= simplexml_load_file($filename); - if ($xmlData === false) { + $contents = file_get_contents($filename); + $this->xmlData= xml::xml2array($contents, 1); + + if (!isset($this->xmlData['filter'])) { return false; } - // Load definition - if (isset($xmlData->definition)) { - foreach ($xmlData->definition as $entry) { - if (!isset($entry->target) || !isset($entry->template)) { - return false; - } + $this->xmlData= $this->xmlData["filter"]; - // Move information - $this->templatePath= (string)$entry->template; - $this->target= (string)$entry->target; + // Load filter + if (isset($this->xmlData['search'])) { + if (!isset($this->xmlData['search']['query'][0])){ + $this->xmlData['search']['query']= array($this->xmlData['search']['query']); + } - // One is enough - break; + // Move information + $entry= $this->xmlData['search']; + $this->scopeMode= $entry['scope']; + if ($entry['scope'] == "auto") { + $this->scope= "one"; + } else { + $this->scope= $entry['scope']; } + $this->query= $entry['query']; + } else { + return false; } - // Load filter - if (isset($xmlData->search)) { - foreach ($xmlData->search as $entry) { - if (!isset($entry->query) || !isset($entry->base) || !isset($entry->scope)) { - return false; - } - - // Move information - $this->baseMode= (string)$entry->base; - $this->scopeMode= (string)$entry->scope; - $this->query= $entry->query; + // Transfer initial value + if (isset($this->xmlData['definition']['initial']) && $this->xmlData['definition']['initial'] == "true"){ + $this->initial= true; + } - // One is enough - break; - } + // Transfer category + if (isset($this->xmlData['definition']['category'])){ + $this->category= $this->xmlData['definition']['category']; } // Generate formular data - if (isset($xmlData->element)) { - foreach ($xmlData->element as $element) { + if (isset($this->xmlData['element'])) { + if (!isset($this->xmlData['element'][0])){ + $this->xmlData['element']= array($this->xmlData['element']); + } + foreach ($this->xmlData['element'] as $element) { // Ignore elements without type - if (!isset($element->type)) { + if (!isset($element['type']) || !isset($element['tag'])) { next; } - $tag= (string)$element->tag; + $tag= $element['tag']; + + // Fix arrays + if (isset($element['value']) && !isset($element['value'][0])) { + $element['value']= array($element['value']); + } // Store element for quick access $this->elements[$tag] = $element; // Preset elementValues with default values if exist - if (isset($element->default)) { - $this->elementValues[$tag] = (string)$element->default; + if (isset($element['default']) && !is_array($element['default'])) { + $this->elementValues[$tag] = $element['default']; } else { $this->elementValues[$tag] = ""; } // Does this element react on alphabet links? - if (isset($element->alphabet) && (string)$element->alphabet == "true") { + if (isset($element['alphabet']) && $element['alphabet'] == "true") { $this->alphabetElements[]= $tag; } } - } - // Save definition - if (isset($xmlData->definition)) { - $this->definition = $xmlData->definition; - } + // 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); + } + uasort($this->elements, 'strlenSort'); + $this->elements= array_reverse($this->elements); - // Save search - if (isset($xmlData->search)) { - $this->search = $xmlData->search; } return true; @@ -113,21 +141,31 @@ class filter { function getTextfield($element) { - $tag= (string)$element->tag; - $result= ""; - if (isset($element->autocomplete)) { + $tag= $element['tag']; + $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"; - if (isset($element->autocomplete->frequency)) { - $frequency= (string)$element->autocomplete->frequency; + if (isset($element['autocomplete']['frequency'])) { + $frequency= $element['autocomplete']['frequency']; } - if (isset($element->autocomplete->characters)) { - $characters= (string)$element->autocomplete->characters; + if (isset($element['autocomplete']['characters'])) { + $characters= $element['autocomplete']['characters']; } $result.= "
". ""; + + $this->autocompleters[$tag]= $element['autocomplete']; } return $result; } @@ -135,7 +173,7 @@ class filter { function getCheckbox($element) { - $tag= (string)$element->tag; + $tag= $element['tag']; $checked= ""; if ($this->elementValues[$tag] == "true") { $checked= " checked"; @@ -148,14 +186,31 @@ class filter { function getCombobox($element) { - $result= ""; + + // Fill with presets + foreach ($element['value'] as $value) { $selected= ""; - if ($this->elementValues[(string)$element->tag] == $value->key) { + 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; @@ -182,27 +237,12 @@ class filter { } - function setBases($bases) { - $this->bases= $bases; - } - - 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; } @@ -212,23 +252,6 @@ class filter { } - function renderBase() - { - $result= ""; - - return $result; - } - - function renderAlphabet($columns= 10) { // Return pre-rendered alphabet if available @@ -281,18 +304,17 @@ class filter { } - 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) { $htmlCode= ""; - switch ($element->type) { + switch ($element['type']) { case "textfield": $htmlCode = $this->getTextfield($element); break; @@ -312,7 +334,7 @@ class filter { } // Load template - return ("".$smarty->fetch(get_template_path("filter/$this->templatePath"))); + return ("".$smarty->fetch(get_template_path($this->xmlData['definition']['template'], true))); } @@ -323,27 +345,27 @@ class filter { // Go thru all queries and merge results foreach ($this->query as $query) { - if (!isset($query->backend) || !isset($query->filter) || !isset($query->attribute)) { + if (!isset($query['backend']) || !isset($query['filter']) || !isset($query['attribute'])) { die("No backend specified in search config."); } // Is backend available? - $backend= "filter".(string)$query->backend; + $backend= "filter".$query['backend']; if (!isset($class_mapping["$backend"])) { die("Invalid backend specified in search config."); } // Load filter and attributes - $filter= $query->filter; - $attributes= array(); - foreach($query->attribute as $attr) { - $attributes[]= (string)$attr; - } + $filter= $query['filter']; + $attributes= $query['attribute']; // Generate final filter foreach ($this->elements as $tag => $element) { - $e_set= (string)$element->set; - $e_unset= (string)$element->unset; + if (!isset($element['set']) || !isset($element['unset'])) { + continue; + } + $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); @@ -355,7 +377,7 @@ class filter { } $result= array_merge($result, call_user_func(array($backend, 'query'), $this->base, $this->scope, $filter, $attributes, - $this->category, $this->objectStorage, $this->objectBase)); + $this->category, $this->objectStorage)); } @@ -400,22 +422,88 @@ class filter { $this->elementValues[$tag]= ""; } } + + // 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); } - // Save base - if (isset($_POST['BASE']) && $this->baseMode == "true") { - $base= validate($_POST['BASE']); - if (isset($this->bases[$base])) { - $this->base= $base; + // 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++) { + $res[]= $entry[$attribute][$i]; + } + } else { + $res[]= $entry[$attribute]; + } } } - // Save scope if needed - if ($this->scopeMode == "auto") { - $this->scope= isset($_POST['SCOPE'])?"sub":"one"; + return $res; + } + + + function processAutocomplete() + { + global $class_mapping; + $result= array(); + + // Introduce maximum number of entries + $max= 25; + + foreach ($this->autocompleters as $tag => $config) { + if(isset($_POST[$tag])){ + $result= $this->getCompletitionList($config, $tag, $_POST[$tag]); + $result= array_unique($result); + asort($result); + + echo ''; + } } } + } ?>