X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-core%2Finclude%2Fclass_filter.inc;h=469f309b1bf295fb07aa9bb5de24d6b8a0a90ac9;hb=f4c90f413ad24a3bedf79f1effc0f534050d849f;hp=efd72574e18683c237523fd59872278ea2f73ec6;hpb=c4a081a32fbde7ec29a59f77c1704f2a630f92f5;p=gosa.git diff --git a/gosa-core/include/class_filter.inc b/gosa-core/include/class_filter.inc index efd72574e..469f309b1 100644 --- a/gosa-core/include/class_filter.inc +++ b/gosa-core/include/class_filter.inc @@ -22,558 +22,447 @@ class filter { - var $xmlData; - var $elements= array(); - var $elementValues= array(); - var $alphabetElements= array(); - var $autocompleter= array(); - var $category= ""; - var $objectStorage= array(); - var $base= ""; - var $scope= ""; - var $query; - var $initial= false; - var $scopeMode= "auto"; - var $alphabet= null; - var $converter= array(); - var $pid; - - - function filter($filename) - { - global $config; - - // Load eventually passed filename - if (!$this->load($filename)) { - die("Cannot parse $filename!"); - } + var $searches= array(); + var $xmlSearches= array(); + var $attributes= array(); + var $search; + var $defaultSearch; + var $category= ""; + var $objectStorage= array(); + var $base= ""; + var $scope= ""; + var $query; + var $value= ""; + var $initial= false; + var $scopeMode= "auto"; + var $converter= null; + var $pid; + + + function filter($filename) + { + global $config; + + // Load eventually passed filename + if (!$this->load($filename)) { + die("Cannot parse $filename!"); + } - $this->pid= preg_replace("/[^0-9]/", "", microtime(TRUE)); - } + $this->pid= preg_replace("/[^0-9]/", "", microtime(TRUE)); + } - function load($filename) - { - $contents = file_get_contents($filename); - $this->xmlData= xml::xml2array($contents, 1); + function load($filename) + { + $contents = file_get_contents($filename); + $xmlData= xml::xml2array($contents, 1); - if (!isset($this->xmlData['filterdef'])) { - return false; - } + if (!isset($xmlData['filterdef'])) { + return false; + } - $this->xmlData= $this->xmlData["filterdef"]; - - // Load filter - if (isset($this->xmlData['search'])) { - if (!isset($this->xmlData['search']['query'][0])){ - $this->xmlData['search']['query']= array($this->xmlData['search']['query']); - } - - // 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; - } + $xmlData= $xmlData["filterdef"]; - // Transfer initial value - if (isset($this->xmlData['definition']['initial']) && $this->xmlData['definition']['initial'] == "true"){ - $this->initial= true; - } + // Load filter + if (isset($xmlData['search'])) { - // Transfer category - if (isset($this->xmlData['definition']['category'])){ - $this->category= $this->xmlData['definition']['category']; - } + // Array conversion + if (!isset($xmlData['search'][0])) { + $searches= array($xmlData['search']); + } else { + $searches= $xmlData['search']; + } - // Generate formular data - if (isset($this->xmlData['element'])) { - if (!isset($this->xmlData['element'][0])){ - $this->xmlData['element']= array($this->xmlData['element']); - } - foreach ($this->xmlData['element'] as $element) { + /* Store available searches */ + foreach ($searches as $search) { - // Ignore elements without type - if (!isset($element['type']) || !isset($element['tag'])) { - next; - } + /* Do multi conversation */ + if (!isset($search['query'][0])){ + $search['query']= array($search['query']); + } - $tag= $element['tag']; + /* Store search */ + $this->xmlSearches[$search['tag']]= $search; - // Fix arrays - if (isset($element['value']) && !isset($element['value'][0])) { - $element['value']= array($element['value']); + } + } else { + return false; } - // Store element for quick access - $this->elements[$tag] = $element; - - // Preset elementValues with default values if exist - if (isset($element['default']) && !is_array($element['default'])) { - $this->elementValues[$tag] = $element['default']; + // Transfer scope + $this->scopeMode= $xmlData['definition']['scope']; + if ($this->scopeMode == "auto") { + $this->scope= "one"; } else { - $this->elementValues[$tag] = ""; + $this->scope= $this->scopeMode; } - // Does this element react on alphabet links? - if (isset($element['alphabet']) && $element['alphabet'] == "true") { - $this->alphabetElements[]= $tag; + // Transfer attributes + $this->attributes= $xmlData['definition']['attribute']; + if (!is_array($this->attributes)) { + $this->attributes= array($this->attributes); } - } - - uasort($this->elements, 'strlenSort'); - $this->elements= array_reverse($this->elements); - - } - return true; - } + // Transfer initial value + if (isset($xmlData['definition']['initial']) && $xmlData['definition']['initial'] == "true"){ + $this->initial= true; + } + // Transfer category + if (isset($xmlData['definition']['category'])){ + $this->category= $xmlData['definition']['category']; + } + if (!is_array($this->category)) { + $this->category= array($this->category); + } - function getTextfield($element) - { - $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= $element['autocomplete']['frequency']; - } - if (isset($element['autocomplete']['characters'])) { - $characters= $element['autocomplete']['characters']; - } - $result.= "
". - ""; + // Initialize searches and default search mode + $this->defaultSearch= $xmlData['definition']['default']; + $this->reloadFilters(); + $this->setSearch($this->defaultSearch); - $this->autocompleters[$tag]= $element['autocomplete']; + return true; } - return $result; - } - function getCheckbox($element) - { - $tag= $element['tag']; - $checked= ""; - if ($this->elementValues[$tag] == "true") { - $checked= " checked"; + function reloadFilters() + { + $this->searches= array_merge($this->xmlSearches, userFilter::getFilter($this->category)); + $this->setSearch($this->search); } - $result= ""; - return $result; - } + function setSearch($method= null) + { + $patch= null; - function getCombobox($element) - { - $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 getTextfield($tag, $value= "", $element= null) + { + $size= 30; + $maxlength= 30; + $result= ""; + if ($element && isset($element['autocomplete'])) { + $frequency= "0.5"; + $characters= "1"; + if (isset($element['autocomplete']['frequency'])) { + $frequency= $element['autocomplete']['frequency']; + } + if (isset($element['autocomplete']['characters'])) { + $characters= $element['autocomplete']['characters']; + } + $result.= "
". + ""; - function getCurrentBase() - { - if (isset($this->search->base) && (string)$this->search->scope != "auto") { - return false; + $this->autocompleters[$tag]= $element; + } + return $result; } - return $this->base; - } + function getCurrentBase() + { + if (isset($this->search->base) && (string)$this->search->scope != "auto") { + return false; + } - function getCurrentScope() - { - if (isset($this->search->scope) && (string)$this->search->scope != "auto") { - return (string)$this->search->scope; + return $this->base; } - return $this->scope; - } + function getCurrentScope() + { + if (isset($this->search->scope) && (string)$this->search->scope != "auto") { + return (string)$this->search->scope; + } - function setConverter($field, $hook) - { - $this->converter[$field]= $hook; - } + return $this->scope; + } - function setObjectStorage($storage) - { - $this->objectStorage= $storage; - } + function setConverter($hook) + { + $this->converter= $hook; + } - function setBase($base) - { - $this->base= $base; - } + function setObjectStorage($storage) + { + $this->objectStorage= $storage; + } - function setCurrentScope($scope) - { - $this->scope= $scope; - } + function setBase($base) + { + $this->base= $base; + } - function renderAlphabet($columns= 10) - { - // Return pre-rendered alphabet if available - if ($this->alphabet) { - return ($this->alphabet); + function setCurrentScope($scope) + { + $this->scope= $scope; } - $characters= _("*ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"); - $alphabet= ""; - $c= 0; - /* Fill cells with charaters */ - for ($i= 0, $l= mb_strlen($characters, 'UTF8'); $i<$l; $i++){ - if ($c == 0){ - $alphabet.= ""; - } - $ch = mb_substr($characters, $i, 1, "UTF8"); - $alphabet.= " ".$ch." "; - - if ($c++ == $columns){ - $alphabet.= ""; - $c= 0; - } - } + function render() + { + $content= "
".$this->renderFilterMenu().""; + $content.= "
".$this->getTextfield('search_filter', set_post($this->value), $this->searches[$this->search])."
". + " 
"; - /* Fill remaining cells */ - while ($c++ <= $columns){ - $alphabet.= " "; + // Return meta data + return ("".$content); } - /* Save alphabet */ - $this->alphabet= "$alphabet
"; - return ($this->alphabet); - } + function query() + { + 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'])) { + die("No backend specified in search config."); + } - function renderApply() - { - return (""); - } - + // Is backend available? + $backend= "filter".$query['backend']; + if (!isset($class_mapping["$backend"])) { + die("Invalid backend specified in search config."); + } - function renderScope() - { - $checked= $this->scope == "sub"?" checked":""; - return " "; - } + // Load filter and attributes + $filter= $query['filter']; + + // Handle converters if present + if ($this->converter) { + preg_match('/([^:]+)::(.*)$/', $this->converter, $m); + if ($this->value == "") { + $filter= call_user_func(array($m[1], $m[2]), preg_replace('/\$/', "*", $filter)); + } else { + $filter= call_user_func(array($m[1], $m[2]), preg_replace('/\$/', $this->value, $filter)); + } + } + // Do not replace escaped \$ - This is required to be able to search for e.g. windows machines. + if ($this->value == "") { + $filter= preg_replace("/\\$/", '*', $filter); + } else { + $filter= preg_replace("/\\$/", "*".normalizeLdap($this->value)."*", $filter); + } - function render() - { - $smarty= get_smarty(); - $smarty->assign("ALPHABET", $this->renderAlphabet()); - $smarty->assign("APPLY", $this->renderApply()); - $smarty->assign("SCOPE", $this->renderScope()); + $result= array_merge($result, call_user_func(array($backend, 'query'), $this->base, $this->scope, $filter, $this->attributes, $this->category, $this->objectStorage)); + } - // Load template and replace elementsHtml[] - foreach ($this->elements as $tag => $element) { - $htmlCode= ""; - switch ($element['type']) { - case "textfield": - $htmlCode = $this->getTextfield($element); - break; + return ($result); + } - case "checkbox": - $htmlCode = $this->getCheckbox($element); - break; - case "combobox": - $htmlCode = $this->getCombobox($element); - break; + function update() + { + if (isset($_POST['FILTER_PID']) && $_POST['FILTER_PID'] == $this->pid) { + // Save input field + if (isset($_POST['search_filter'])) { + $this->value= get_post('search_filter'); + } - default: - die ("Unknown element type specified!"); - } - $smarty->assign("$tag", $htmlCode); - } + // Save scope if needed + if ($this->scopeMode == "auto" && isset($_POST['act']) && $_POST['act'] == "toggle-subtree") { + $this->scope= ($this->scope == "one")?"sub":"one"; + } - // Try to load template from plugin the folder first... - $file = get_template_path($this->xmlData['definition']['template'], true); + // Switch filter? + if (isset($_POST['act'])) { + foreach ($this->searches as $tag => $cfg) { + if ($_POST['act'] == "filter-$tag") { + $this->setSearch($tag); + break; + } + } + } + } - // ... 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($file)); - } + function getCompletitionList($config, $value="*") + { + global $class_mapping; + $res= array(); - function query() - { - global $class_mapping; - $result= array(); + // Load result attributes + $attributes= $config['autocomplete']['attribute']; + if (!is_array($attributes)) { + $attributes= array($attributes); + } - // Return empty list if initial is not set - if (!$this->initial) { - $this->initial= true; - return $result; - } + // Do the query + $result= array(); - // Go thru all queries and merge results - foreach ($this->query as $query) { - if (!isset($query['backend']) || !isset($query['filter']) || !isset($query['attribute'])) { - die("No backend specified in search config."); - } - - // Is backend available? - $backend= "filter".$query['backend']; - if (!isset($class_mapping["$backend"])) { - die("Invalid backend specified in search config."); - } - - // Load filter and attributes - $filter= $query['filter']; - $attributes= $query['attribute']; - - // Generate final filter - foreach ($this->elements as $tag => $element) { - if (!isset($element['set']) || !isset($element['unset'])) { - continue; + // Is backend available? +# FIXME + $queries= $config['query']; + if (!isset($queries[0])){ + $queries= array($queries); } + foreach ($queries as $query) { + $backend= "filter".$query['backend']; + if (!isset($class_mapping["$backend"])) { + die("Invalid backend specified in search config."); + } + $filter= preg_replace("/\\$/", "*".normalizeLdap($value)."*", $query['filter']); - // 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']; + $result= array_merge($result, call_user_func(array($backend, 'query'), $this->base, $this->scope, $filter, $attributes, + $this->category, $this->objectStorage)); } - if ($this->elementValues[$tag] == "") { - $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('/\\\\\$/','$', $e_set); - $filter= preg_replace("/\\$$tag/", $e_set, $filter); + 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]; + } + } } - } - $result= array_merge($result, call_user_func(array($backend, 'query'), $this->base, $this->scope, $filter, $attributes, $this->category, $this->objectStorage)); + return $res; } - - return ($result); - } - function isValid() - { - foreach ($this->elements as $tag => $element) { - if (isset($element->regex)){ - if (!preg_match('/'.(string)$element->regex.'/', $this->elementValues[$tag])){ - return false; - } - } - } - return true; - } - - - function update() - { - /* React on alphabet links if needed */ - if (isset($_GET['filter'])){ - $s= mb_substr(validate($_GET['filter']), 0, 1, "UTF8"); - foreach ($this->alphabetElements as $tag) { - $this->elementValues[$tag]= $s; - } - } + function processAutocomplete() + { + global $class_mapping; + $result= array(); - 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) { - if (isset($_POST[$tag])){ - $this->elementValues[$tag]= validate($_POST[$tag]); - } else { - $this->elementValues[$tag]= ""; - } - } + // Introduce maximum number of entries + $max= 25; + + if(isset($this->searches[$this->search]['autocomplete'])){ + $result= $this->getCompletitionList($this->searches[$this->search], get_post('search_filter')); + $result= array_unique($result); + asort($result); + + echo ''; + } } - } + function getObjectBase($dn) + { + global $config; + $base= ""; - function getCompletitionList($config, $tag, $value="*") - { - global $class_mapping; - $res= array(); + // 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); + } - // Is backend available? - $backend= "filter".$config['backend']; - if (!isset($class_mapping["$backend"])) { - die("Invalid backend specified in search config."); - } + /* Set to base, if we're not on a correct subtree */ + if (!isset($config->idepartments[$base])){ + $base= $config->current['BASE']; + } - // Load filter and attributes - $filter= $config['filter']; - $attributes= $config['attribute']; - if (!is_array($attributes)) { - $attributes= array($attributes); + return $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++) { - if (mb_stristr($entry[$attribute][$i], $value)) { - $res[]= $entry[$attribute][$i]; - } - } - } else { - $res[]= $entry[$attribute]; - } - } - } - return $res; - } + function renderFilterMenu() + { + // Load shortcut + $result= "$script"; } - return $base; - } + function getFixedFilters() + { + return array_keys($this->searches); + } } -// 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); -} +// vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: ?>