X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-core%2Finclude%2Fclass_filter.inc;h=04de2dae2c5cb13fce48ef21f3638fe6ce823937;hb=c9bd6c4d92532063a9dd8df3cfd20740d43e5841;hp=b0e859650a58958cee13d47a381a3f41a94db0c4;hpb=41cb28d90c89c00d2dad8280675497becf101caa;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 b0e859650..04de2dae2 --- a/gosa-core/include/class_filter.inc +++ b/gosa-core/include/class_filter.inc @@ -1,147 +1,177 @@ load($filename)) { die("Cannot parse $filename!"); } + + $this->pid= preg_replace("/[^0-9]/", "", microtime(TRUE)); } + function load($filename) { - // Load data into array - $xmlData= simplexml_load_file($filename); - if ($xmlData === false) { + $contents = file_get_contents($filename); + $xmlData= xml::xml2array($contents, 1); + + if (!isset($xmlData['filterdef'])) { return false; } - // Load definition - if (isset($xmlData->definition)) { - foreach ($xmlData->definition as $entry) { - if (!isset($entry->target) || !isset($entry->template)) { - return false; - } - - // Move information - $this->templatePath= (string)$entry->template; - $this->target= (string)$entry->target; - - // One is enough - break; - } - } + $xmlData= $xmlData["filterdef"]; // Load filter - if (isset($xmlData->search)) { - foreach ($xmlData->search as $entry) { - if (!isset($entry->query) || !isset($entry->base) || !isset($entry->scope)) { - return false; - } + if (isset($xmlData['search'])) { - // Move information - $this->baseMode= (string)$entry->base; - $this->scopeMode= (string)$entry->scope; - $this->query= $entry->query; - - // One is enough - break; + // Array conversion + if (!isset($xmlData['search'][0])) { + $searches= array($xmlData['search']); + } else { + $searches= $xmlData['search']; } - } - // Generate formular data - if (isset($xmlData->element)) { - foreach ($xmlData->element as $element) { + /* Store available searches */ + foreach ($searches as $search) { - // Ignore elements without type - if (!isset($element->type)) { - next; + /* Do multi conversation */ + if (!isset($search['query'][0])){ + $search['query']= array($search['query']); } - $tag= (string)$element->tag; + /* Store search */ + $this->xmlSearches[$search['tag']]= $search; - // Store element for quick access - $this->elements[$tag] = $element; + } + } else { + return false; + } - // Preset elementValues with default values if exist - if (isset($element->default)) { - $this->elementValues[$tag] = (string)$element->default; - } else { - $this->elementValues[$tag] = ""; - } + // Transfer scope + $this->scopeMode= $xmlData['definition']['scope']; + if ($this->scopeMode == "auto") { + $this->scope= "one"; + } else { + $this->scope= $this->scopeMode; + } - // Does this element react on alphabet links? - if (isset($element->alphabet) && (string)$element->alphabet == "true") { - $this->alphabetElements[]= $tag; - } - } + // Transfer attributes + $this->attributes= $xmlData['definition']['attribute']; + if (!is_array($this->attributes)) { + $this->attributes= array($this->attributes); } - // Save definition - if (isset($xmlData->definition)) { - $this->definition = $xmlData->definition; + // Transfer initial value + if (isset($xmlData['definition']['initial']) && $xmlData['definition']['initial'] == "true"){ + $this->initial= true; } - // Save search - if (isset($xmlData->search)) { - $this->search = $xmlData->search; + // Transfer category + if (isset($xmlData['definition']['category'])){ + $this->category= $xmlData['definition']['category']; + } + if (!is_array($this->category)) { + $this->category= array($this->category); } + // Initialize searches and default search mode + $this->defaultSearch= $xmlData['definition']['default']; + $this->reloadFilters(); + $this->setSearch($this->defaultSearch); + return true; } - function getTextfield($element) + function reloadFilters() { - $result= ""; - return $result; + $this->searches= array_merge($this->xmlSearches, userFilter::getFilter($this->category)); + $this->setSearch($this->search); } - function getCheckbox($element) + function setSearch($method= null) { - $checked= ""; - if ($this->elementValues[$element] == "true") { - $checked= " checked"; + $patch= null; + + // Maybe our search method has gone? + if (!isset($this->searches[$method])) { + $method= $this->defaultSearch; } - $result= ""; - return $result; + // Try to use it, but bail out if there's no help... + if (isset($this->searches[$method])) { + $this->query= $this->searches[$method]['query']; + $this->search= $method; + } else { + die ("Invalid search module!"); + } } - function getCombobox($element) + function getTextfield($tag, $value= "", $element= null) { - $result= ""; + if ($element && isset($element['autocomplete'])) { + $frequency= "0.5"; + $characters= "1"; + if (isset($element['autocomplete']['frequency'])) { + $frequency= $element['autocomplete']['frequency']; } - $result.= ""; - } - $result.= ""; + if (isset($element['autocomplete']['characters'])) { + $characters= $element['autocomplete']['characters']; + } + $result.= "
". + ""; + $this->autocompleters[$tag]= $element; + } return $result; } @@ -166,233 +196,273 @@ class filter { } - function setBases($bases) { - $this->bases= $bases; + function setConverter($hook) + { + $this->converter= $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) { + function setCurrentScope($scope) + { $this->scope= $scope; } - function renderBase() - { - $result= ""; + function render() + { + $content= "
".$this->renderFilterMenu().""; + $content.= "
".$this->getTextfield('search_filter', $this->value, $this->searches[$this->search])."
". + " 
"; - return $result; + // Return meta data + return ("".$content); } - function renderAlphabet($columns= 10) + function query() { - // Return pre-rendered alphabet if available - if ($this->alphabet) { - return ($this->alphabet); - } + global $class_mapping; + $result= array(); - $characters= _("*ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"); - $alphabet= ""; - $c= 0; + // 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."); + } - /* Fill cells with charaters */ - for ($i= 0, $l= mb_strlen($characters, 'UTF8'); $i<$l; $i++){ - if ($c == 0){ - $alphabet.= ""; + // Is backend available? + $backend= "filter".$query['backend']; + if (!isset($class_mapping["$backend"])) { + die("Invalid backend specified in search config."); } - $ch = mb_substr($characters, $i, 1, "UTF8"); - $alphabet.= " ".$ch." "; + // Load filter and attributes + $filter= $query['filter']; - if ($c++ == $columns){ - $alphabet.= ""; - $c= 0; + // 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)); + } } - } - /* Fill remaining cells */ - while ($c++ <= $columns){ - $alphabet.= " "; - } + // 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); + } - /* Save alphabet */ - $this->alphabet= "$alphabet
"; + $result= array_merge($result, call_user_func(array($backend, 'query'), $this->base, $this->scope, $filter, $this->attributes, $this->category, $this->objectStorage)); + } - return ($this->alphabet); + return ($result); } - function renderApply() + function update() { - return (""); - } + if (isset($_POST['FILTER_PID']) && $_POST['FILTER_PID'] == $this->pid) { + // Save input field + if (isset($_POST['search_filter'])) { + $this->value= validate($_POST['search_filter']); + } + // Save scope if needed + if ($this->scopeMode == "auto" && isset($_POST['act']) && $_POST['act'] == "toggle-subtree") { + $this->scope= ($this->scope == "one")?"sub":"one"; + } + + // Switch filter? + if (isset($_POST['act'])) { + foreach ($this->searches as $tag => $cfg) { + if ($_POST['act'] == "filter-$tag") { + $this->setSearch($tag); + break; + } + } + } + } - function renderScope() - { - $checked= $this->scope == "sub"?" checked":""; - return " "._("Search in subtrees"); } - function renderFilter() + function getCompletitionList($config, $value="*") { - $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) { - case "textfield": - $htmlCode = $this->getTextfield($tag); - break; + global $class_mapping; + $res= array(); - case "checkbox": - $htmlCode = $this->getCheckbox($tag); - break; + // Load result attributes + $attributes= $config['autocomplete']['attribute']; + if (!is_array($attributes)) { + $attributes= array($attributes); + } - case "combobox": - $htmlCode = $this->getCombobox($element); - break; + // Do the query + $result= array(); - default: - die ("Unknown element type specified!"); + // 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']); + + $result= array_merge($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]; + } } - $smarty->assign("$tag", $htmlCode); } - // Load template - return ("".$smarty->fetch(get_template_path("filter/$this->templatePath"))); + return $res; } - function query() + function processAutocomplete() { global $class_mapping; $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."); - } + // Introduce maximum number of entries + $max= 25; - // Is backend available? - $backend= "filter".(string)$query->backend; - if (!isset($class_mapping["$backend"])) { - die("Invalid backend specified in search config."); - } + if(isset($this->searches[$this->search]['autocomplete'])){ + $result= $this->getCompletitionList($this->searches[$this->search], $_POST['search_filter']); + $result= array_unique($result); + asort($result); - // Load filter and attributes - $filter= $query->filter; - $attributes= array(); - foreach($query->attribute as $attr) { - $attributes[]= (string)$attr; - } - - // Generate final filter - foreach ($this->elements as $tag => $element) { - $e_set= (string)$element->set; - $e_unset= (string)$element->unset; - - if ($this->elementValues[$tag] == "") { - $e_unset= preg_replace('/\$/', $this->elementValues[$tag], $e_unset); - $filter= preg_replace("/\\$$tag/", $e_unset, $filter); - } else { - $e_set= preg_replace('/\$/', $this->elementValues[$tag], $e_set); - $filter= preg_replace("/\\$$tag/", $e_set, $filter); + echo ''; } - - - return ($result); } - function isValid() + function getObjectBase($dn) { - return (false); + 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; } - function update() - { - /* React on alphabet links if needed */ - if (isset($_GET['filter'])){ - $s= mb_substr(validate($_GET['filter']), 0, 1, "UTF8")."*"; - if ($s == "**"){ - $s= "*"; - } - foreach ($this->alphabetElements as $tag) { - $this->elementValues[$tag]= $s; + function renderFilterMenu() + { + // Load shortcut + $result= "$script"; + } + + + function getFixedFilters() + { + return array_keys($this->searches); } } + +// vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: ?>