index f28f400c209e2b2f78dae8ea5ed98a05143eaff8..04de2dae2c5cb13fce48ef21f3638fe6ce823937 100644 (file)
class filter {
- var $xmlData;
var $searches= array();
+ var $xmlSearches= array();
+ var $attributes= array();
var $search;
+ var $defaultSearch;
var $category= "";
var $objectStorage= array();
var $base= "";
function load($filename)
{
$contents = file_get_contents($filename);
- $this->xmlData= xml::xml2array($contents, 1);
+ $xmlData= xml::xml2array($contents, 1);
- if (!isset($this->xmlData['filterdef'])) {
+ if (!isset($xmlData['filterdef'])) {
return false;
}
- $this->xmlData= $this->xmlData["filterdef"];
-
- // Transfer category
- if (isset($this->xmlData['definition']['category'])){
- $this->category= $this->xmlData['definition']['category'];
- }
+ $xmlData= $xmlData["filterdef"];
// Load filter
- if (isset($this->xmlData['search'])) {
+ if (isset($xmlData['search'])) {
// Array conversion
- if (!is_array($this->xmlData['search'])) {
- $searches= array($this->xmlData['search']);
+ if (!isset($xmlData['search'][0])) {
+ $searches= array($xmlData['search']);
} else {
- $searches= $this->xmlData['search'];
- }
-
- // Fix problem with only one defined query.
- if(isset($this->xmlData['search']['query'])){
- $this->xmlData['search'] = array($this->xmlData['search']);
+ $searches= $xmlData['search'];
}
/* Store available searches */
- foreach ($this->xmlData['search'] as $search) {
+ foreach ($searches as $search) {
/* Do multi conversation */
- if (!is_array($search['query'])){
+ if (!isset($search['query'][0])){
$search['query']= array($search['query']);
}
/* Store search */
- $search['fixed'] = TRUE;
- $this->searches[$search['tag']]= $search;
- }
-
- $this->reloadUserFilter();
+ $this->xmlSearches[$search['tag']]= $search;
+ }
} else {
return false;
}
// Transfer scope
- $this->scopeMode= $this->xmlData['definition']['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($this->xmlData['definition']['initial']) && $this->xmlData['definition']['initial'] == "true"){
+ if (isset($xmlData['definition']['initial']) && $xmlData['definition']['initial'] == "true"){
$this->initial= true;
}
- // Set default search mode
- $this->setSearch($this->xmlData['definition']['default']);
+ // 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 reloadUserFilter()
+
+ function reloadFilters()
{
- // First remove all user filters
- foreach($this->searches as $k => $s) {
- if(!$s['fixed']) unset($this->searches[$k]);
- }
-
- // Readd user filter.
- foreach(userFilter::getFilter(array($this->category)) as $filter){
- $tmp = array();
- $tmp['tag'] = $filter['name'];
- $tmp['label'] = $filter['description'];
- $tmp['query'] = array();
- foreach($filter['queries'] as $query){
- if(isset($this->searches[$filter['parent']]['query']['attribute'])){
- $query['attribute'] = $this->searches[$filter['parent']]['query']['attribute'];
- }else{
- $query['attribute'] = $this->searches[$filter['parent']]['query'][0]['attribute'];
- }
- $tmp['query'][] = $query;
- }
- $tmp['autocomplete'] = $this->searches[$filter['parent']]['autocomplete'];
- $tmp['fixed'] = FALSE;
- $this->searches[$tmp['tag']] = $tmp;
- }
+ $this->searches= array_merge($this->xmlSearches, userFilter::getFilter($this->category));
+ $this->setSearch($this->search);
}
- function setSearch($method)
+ function setSearch($method= null)
{
$patch= null;
- // Move information
+ // 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'];
- if (!isset($this->query[0])) {
- $this->query= array($this->query);
- }
-
$this->search= $method;
} else {
die ("Invalid search module!");
{
$size= 30;
$maxlength= 30;
- $result= "<input class='filter_textfield' id='$tag' name='$tag' type='text' size='$size' maxlength='{$maxlength}' value='".$value."'>";
+ $result= "<input class='filter_textfield' placeholder='"._("Search")."...' id='$tag' name='$tag' type='text' size='$size' maxlength='{$maxlength}' value='".$value."'>";
if ($element && isset($element['autocomplete'])) {
$frequency= "0.5";
$characters= "1";
function render()
{
-
- $this->reloadUserFilter();
-
- $content= "<table class='filter-wrapper'><tr><td>".$this->renderFilterMenu()."</td><td>";
+ $content= "<table class='filter-wrapper' summary='"._("Search filter")."'><tr><td>".$this->renderFilterMenu()."</td><td>";
$content.= "<div class='search-filter'>".$this->getTextfield('search_filter', $this->value, $this->searches[$this->search])."</div>".
" <button class='search-filter' type='submit' title='"._("Search")."'>".image("images/find.png")."</button></td></tr></table>";
$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'])) {
+ if (!isset($query['backend']) || !isset($query['filter'])) {
die("No backend specified in search config.");
}
// Load filter and attributes
$filter= $query['filter'];
- $attributes= $query['attribute'];
// Handle converters if present
if ($this->converter) {
preg_match('/([^:]+)::(.*)$/', $this->converter, $m);
- $filter= call_user_func(array($m[1], $m[2]), preg_replace('/\$/', $this->value, $filter));
+ 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.
$filter= preg_replace("/\\$/", "*".normalizeLdap($this->value)."*", $filter);
}
- $result= array_merge($result, call_user_func(array($backend, 'query'), $this->base, $this->scope, $filter, $attributes, $this->category, $this->objectStorage));
+ $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= validate($_POST['search_filter']);
$this->scope= ($this->scope == "one")?"sub":"one";
}
- if (isset($_POST['act'])){
+ // Switch filter?
+ if (isset($_POST['act'])) {
foreach ($this->searches as $tag => $cfg) {
if ($_POST['act'] == "filter-$tag") {
$this->setSearch($tag);
$result= array();
// Is backend available?
+ # FIXME
$queries= $config['query'];
if (!isset($queries[0])){
$queries= array($queries);
function renderFilterMenu()
{
// Load shortcut
- $result= "<input type='hidden' name='act' id='filter' value=''><div style='display:none'><input type='submit' name='exec_filter' id='exec_filter' value=''></div>".
- "<ul class='level1' id='filter-root'><li><a href='#'>".image("images/filter.png").image("images/lists/sort-down.png")."</a>";
+ $result= "<ul class='level1' id='filter-root'><li><a href='#'>".image("images/filter.png").image("images/lists/sort-down.png")."</a>";
// Build ul/li list
$separator= " style='border-top:1px solid #AAA' ";
$result.= "<ul class='level2'>";
// Build in filters
- foreach ($this->searches as $tag => $config) {
-
- if(!$config['fixed']) continue;
-
+ foreach ($this->xmlSearches as $tag => $config) {
+ $label = htmlentities(_($config['label']),ENT_COMPAT,'UTF-8');
if ($tag == $this->search) {
- $result.= "<li><a href='#'>".image("images/checked.png")." "._($config['label'])."</a></li>";
+ $result.= "<li><a href='#'>".image("images/checked.png")." ".$label."</a></li>";
} else {
- $result.= "<li><a href='#' onClick='document.getElementById(\"filter\").value= \"filter-$tag\";mainform.submit();'>".image("images/empty.png")." "._($config['label'])."</a></li>";
+ $result.= "<li><a href='#' onClick='\$(\"act\").value= \"filter-$tag\";\$(\"exec_act\").click();'>".image("images/empty.png")." ".$label."</a></li>";
}
}
// User defined filters
$first= true;
- if (is_array($this->category)) {
- $categories= $this->category;
- } else {
- $categories= array($this->category);
- }
-
- foreach ($this->searches as $tag => $config) {
- if($config['fixed']) continue;
-
+ foreach (userFilter::getFilter($this->category) as $tag => $config) {
if ($tag == $this->search) {
- $result.= "<li".($first?$separator:"")."><a href='#'>".image("images/checked.png")." "._($config['label'])."</a></li>";
+ $result.= "<li".($first?$separator:"")."><a href='#'>".image("images/checked.png")." "._($config['description'])."</a></li>";
} else {
- $result.= "<li".($first?$separator:"")."><a href='#' onClick='document.getElementById(\"filter\").value= \"filter-$tag\";mainform.submit();'>".image("images/empty.png")." "._($config['label'])."</a></li>";
+ $result.= "<li".($first?$separator:"")."><a href='#' onClick='\$(\"act\").value= \"filter-$tag\";\$(\"exec_act\").click();'>".image("images/empty.png")." "._($config['description'])."</a></li>";
}
$first= false;
// Render scope if set to auto
if ($this->scopeMode == "auto") {
- $result.= "<li$separator><a href='#' onClick='document.getElementById(\"filter\").value= \"toggle-subtree\";mainform.submit();'>".($this->scope=="one"?image("images/empty.png"):image("images/checked.png"))." "._("Search in subtrees")."</a></li>";
+ $result.= "<li$separator><a href='#' onClick='\$(\"act\").value= \"toggle-subtree\";\$(\"exec_act\").click();'>".($this->scope=="one"?image("images/empty.png"):image("images/checked.png"))." "._("Search in subtrees")."</a></li>";
}
// Edit filter menu
- $result.= "<li$separator><a href='#' onClick='document.getElementById(\"filter\").value= \"config-filter\";mainform.submit();'>".image("images/configure.png")." "._("Edit filters")."...</a></li>";
+ $result.= "<li$separator><a href='#' onClick='\$(\"act\").value= \"config-filter\";\$(\"exec_act\").click();'>".image("images/configure.png")." "._("Edit filters")."...</a></li>";
$result.= "</ul>";
$script= '<script type="text/javascript" language="JavaScript">var menu2; menu2= new Menu("filter-root", "menu2", configMenu)</script>';
- return "<div id='filtermenu'>".$result."</li></ul><div>$script";
+ return "<div id='filtermenu'>".$result."</li></ul></div>$script";
}