load($filename)) { die("Cannot parse $filename!"); } $this->pid= preg_replace("/[^0-9]/", "", microtime(TRUE)); } function load($filename) { $contents = file_get_contents($filename); $xmlData= xml::xml2array($contents, 1); if (!isset($xmlData['filterdef'])) { return false; } $xmlData= $xmlData["filterdef"]; // Load filter if (isset($xmlData['search'])) { // Array conversion if (!isset($xmlData['search'][0])) { $searches= array($xmlData['search']); } else { $searches= $xmlData['search']; } /* Store available searches */ foreach ($searches as $search) { /* Do multi conversation */ if (!isset($search['query'][0])){ $search['query']= array($search['query']); } /* Store search */ $this->xmlSearches[$search['tag']]= $search; } } else { return false; } // Transfer scope $this->scopeMode= $xmlData['definition']['scope']; if ($this->scopeMode == "auto") { $this->scope= "one"; } else { $this->scope= $this->scopeMode; } // Transfer attributes $this->attributes= $xmlData['definition']['attribute']; if (!is_array($this->attributes)) { $this->attributes= array($this->attributes); } // 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); } // Initialize searches and default search mode $this->defaultSearch= $xmlData['definition']['default']; $this->reloadFilters(); $this->setSearch($this->defaultSearch); return true; } function reloadFilters() { $this->searches= array_merge($this->xmlSearches, userFilter::getFilter($this->category)); $this->setSearch($this->search); } function setSearch($method= null) { $patch= null; // Maybe our search method has gone? if (!isset($this->searches[$method])) { $method= $this->defaultSearch; } // 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 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.= "
". ""; $this->autocompleters[$tag]= $element; } return $result; } function getCurrentBase() { if (isset($this->search->base) && (string)$this->search->scope != "auto") { return false; } return $this->base; } function getCurrentScope() { if (isset($this->search->scope) && (string)$this->search->scope != "auto") { return (string)$this->search->scope; } return $this->scope; } function setConverter($hook) { $this->converter= $hook; } function setObjectStorage($storage) { $this->objectStorage= $storage; } function setBase($base) { $this->base= $base; } function setCurrentScope($scope) { $this->scope= $scope; } function render() { $content= "
".$this->renderFilterMenu().""; $content.= "
".$this->getTextfield('search_filter', set_post($this->value), $this->searches[$this->search])."
". " 
"; // Return meta data return ("".$content); } 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."); } // 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']; // 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); } $result= array_merge($result, call_user_func(array($backend, 'query'), $this->base, $this->scope, $filter, $this->attributes, $this->category, $this->objectStorage)); } return ($result); } 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'); } // 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 getCompletitionList($config, $value="*") { global $class_mapping; $res= array(); // Load result attributes $attributes= $config['autocomplete']['attribute']; if (!is_array($attributes)) { $attributes= array($attributes); } // Do the query $result= array(); // 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]; } } } return $res; } function processAutocomplete() { global $class_mapping; $result= array(); // 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= ""; // 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 renderFilterMenu() { // Load shortcut $result= "$script"; } function getFixedFilters() { return array_keys($this->searches); } } // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: ?>