Code

Fixed multi query editor
[gosa.git] / gosa-core / include / class_filter.inc
index cb70fb4ab98fdbe9bd961f6f31a05da3bddb7efc..558c58943c4d0ade7b53bd0f26f367cff6a78443 100644 (file)
@@ -25,9 +25,6 @@ class filter {
   var $xmlData;
   var $searches= array();
   var $search;
-
-  #FIXME - Seems to be obsolete. Categories are defined in the listing.xml <objectType> 
-  #         and not in the filter.xml anymore.
   var $category= "";
   var $objectStorage= array();
   var $base= "";
@@ -39,16 +36,6 @@ class filter {
   var $converter= null;
   var $pid;
 
-  /* An editor which allows to create user defined ldap-filter.
-   * Due to the fact that it requires additional ldap schemata 
-   *  (objectClasses=gosaProperties) this is currently optional.
-   */
-  var $filterEditor = NULL;
-
-  /* The categories this filter is made for (e.g. ['users'] or. ['server','workstation']). 
-   * Since this is set we are able to create user defined filters.
-   */
-  var $categories   = array();
 
   function filter($filename)
   {
@@ -60,11 +47,6 @@ class filter {
     }
 
     $this->pid= preg_replace("/[^0-9]/", "", microtime(TRUE)); 
-
-    // Instantiate the filter editor.
-    if(class_available("filterEditor")){
-      $this->filterEditor = new filterEditor($config, $this);
-    }
   }
 
 
@@ -79,6 +61,11 @@ class filter {
 
     $this->xmlData= $this->xmlData["filterdef"];
 
+    // Transfer category
+    if (isset($this->xmlData['definition']['category'])){
+      $this->category= $this->xmlData['definition']['category'];
+    }
+
     // Load filter
     if (isset($this->xmlData['search'])) {
 
@@ -89,6 +76,11 @@ class filter {
         $searches= $this->xmlData['search'];
       }
 
+      // Fix problem with only one defined query.
+      if(isset($this->xmlData['search']['query'])){
+        $this->xmlData['search'] = array($this->xmlData['search']);
+      }
+
       /* Store available searches */
       foreach ($this->xmlData['search'] as $search) {
 
@@ -98,9 +90,12 @@ class filter {
         }
 
         /* Store search */
-        $this->searches[$search['label']]= $search;
-
+        $search['fixed'] = TRUE;
+        $this->searches[$search['tag']]= $search;
       }
+
+      $this->reloadUserFilter();
+
     } else {
       return false;
     }
@@ -118,26 +113,51 @@ class filter {
       $this->initial= true;
     }
 
-    // Transfer category
-    if (isset($this->xmlData['definition']['category'])){
-      $this->category= $this->xmlData['definition']['category'];
-    }
-
     // Set default search mode
     $this->setSearch($this->xmlData['definition']['default']);
 
     return true;  
   }
 
+  function reloadUserFilter()
+  {
+    // 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;
+    }
+  }
+
 
   function setSearch($method)
   {
+    $patch= null;
+
     // Move information
     if (isset($this->searches[$method])) {
-      $this->query= $this->searches[$method]['query'];
+      $this->query= array_merge($this->searches[$method]['query']);
       if (!isset($this->query[0])) {
         $this->query= array($this->query);
       }
       $this->search= $method;
     } else {
       die ("Invalid search module!");
@@ -145,19 +165,12 @@ class filter {
   }
 
 
-  function getTextfield($element)
+  function getTextfield($tag, $value= "", $element= null)
   {
-    $tag= $element['tag'];
     $size= 30;
-    if (isset($element['size'])){
-      $size= $element['size'];
-    }
     $maxlength= 30;
-    if (isset($element['maxlength'])){
-      $maxlength= $element['maxlength'];
-    }
-    $result= "<input class='filter_textfield' id='$tag' name='$tag' type='text' size='$size' maxlength='{$maxlength}' value='".$this->elementValues[$tag]."'>";
-    if (isset($element['autocomplete'])) {
+    $result= "<input class='filter_textfield' id='$tag' name='$tag' type='text' size='$size' maxlength='{$maxlength}' value='".$value."'>";
+    if ($element && isset($element['autocomplete'])) {
       $frequency= "0.5";
       $characters= "1";
       if (isset($element['autocomplete']['frequency'])) {
@@ -171,7 +184,7 @@ class filter {
         "new Ajax.Autocompleter('$tag', 'autocomplete$tag', 'autocomplete.php', { minChars: $characters, frequency: $frequency });".
         "</script>";
 
-      $this->autocompleters[$tag]= $element['autocomplete'];
+      $this->autocompleters[$tag]= $element;
     }
     return $result;
   }
@@ -221,23 +234,14 @@ class filter {
   }
 
 
-  function renderApply()
-  {
-    return ("<input type='submit' name='apply' value='"._("Apply filter")."'>");
-  }
 
-
-  function renderScope()
+  function render()
   {
-    $checked= $this->scope == "sub"?" checked":"";
-    return "<input type='checkbox' id='SCOPE' name='SCOPE' value='1' onClick='document.mainform.submit();'$checked>&nbsp;<LABEL for='SCOPE'>"._("Search in subtrees")."</LABEL>";
-  }
 
+    $this->reloadUserFilter();
 
-  function render()
-  {
     $content= "<table class='filter-wrapper'><tr><td>".$this->renderFilterMenu()."</td><td>";
-    $content.= "<div class='search-filter'><input type='text' name='search_filter' value='".$this->value."'></div>".
+    $content.= "<div class='search-filter'>".$this->getTextfield('search_filter', $this->value, $this->searches[$this->search])."</div>".
       "&nbsp;<button class='search-filter' type='submit' title='"._("Search")."'>".image("images/find.png")."</button></td></tr></table>";
 
     // Return meta data
@@ -285,7 +289,7 @@ class filter {
         $filter= preg_replace("/\\$/", "*".normalizeLdap($this->value)."*", $filter);
       }
 
-      $result= array_merge($result, call_user_func(array($backend, 'query'), $this->base, $this->scope, $filter, $attributes, $this->categories, $this->objectStorage));
+      $result= array_merge($result, call_user_func(array($backend, 'query'), $this->base, $this->scope, $filter, $attributes, $this->category, $this->objectStorage));
     }
 
     return ($result);
@@ -302,8 +306,17 @@ class filter {
       }
 
       // Save scope if needed
-      if ($this->scopeMode == "auto") {
-        $this->scope= isset($_POST['SCOPE'])?"sub":"one";
+      if ($this->scopeMode == "auto" && isset($_POST['act']) && $_POST['act'] == "toggle-subtree") {
+        $this->scope= ($this->scope == "one")?"sub":"one";
+      }
+
+      if (isset($_POST['act'])){
+        foreach ($this->searches as $tag => $cfg) {
+          if ($_POST['act'] == "filter-$tag") {
+            $this->setSearch($tag);
+            break;
+          }
+        }
       }
     }
 
@@ -315,27 +328,29 @@ class filter {
     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'];
+    // Load result attributes
+    $attributes= $config['autocomplete']['attribute'];
     if (!is_array($attributes)) {
       $attributes= array($attributes);
     }
 
-    // Make filter
-    $filter= preg_replace("/\\$/", 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->categories, $this->objectStorage);
+    // Do the query
+    $result= array();
+
+    // Is backend available?
+    $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) {
@@ -365,7 +380,7 @@ class filter {
     $max= 25;
 
     if(isset($this->searches[$this->search]['autocomplete'])){
-      $result= $this->getCompletitionList($this->searches[$this->search]['autocomplete'], $_POST['search_filter']);
+      $result= $this->getCompletitionList($this->searches[$this->search], $_POST['search_filter']);
       $result= array_unique($result);
       asort($result);
 
@@ -411,15 +426,52 @@ class filter {
   {
     // 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")._("...")."&nbsp;".image("images/lists/sort-down.png")."</a>";
+      "<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'>";
-    $result.= "<li><a href='#'>Dummy placeholder</a></li>";
-    $result.= "<li><a href='#'>Dummy placeholder</a></li>";
-#$result.= "<li$separator><a href='#' onClick='document.getElementById(\"actionmenu\").value= \"".$action['name']."\";mainform.submit();'>$img"._($action['label'])."</a></li>";
 
-# AUTOCOMPLETER and getTextbox
+    // Build in filters
+    foreach ($this->searches as $tag => $config) {
+
+      if(!$config['fixed']) continue;  
+
+      if ($tag == $this->search) {
+        $result.= "<li><a href='#'>".image("images/checked.png")."&nbsp;"._($config['label'])."</a></li>";
+      } else {
+        $result.= "<li><a href='#' onClick='document.getElementById(\"filter\").value= \"filter-$tag\";mainform.submit();'>".image("images/empty.png")."&nbsp;"._($config['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;  
+
+      if ($tag == $this->search) {
+        $result.= "<li".($first?$separator:"")."><a href='#'>".image("images/checked.png")."&nbsp;"._($config['label'])."</a></li>";
+      } else {
+        $result.= "<li".($first?$separator:"")."><a href='#' onClick='document.getElementById(\"filter\").value= \"filter-$tag\";mainform.submit();'>".image("images/empty.png")."&nbsp;"._($config['label'])."</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"))."&nbsp;"._("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")."&nbsp;"._("Edit filters")."...</a></li>";
 
     $result.= "</ul>";
 
@@ -429,14 +481,11 @@ class filter {
   }
 
 
-  
-  function setCategories($categories)
+  function getFixedFilters()
   {
-    if(!is_array($categories) && !empty($categories)){
-      $categories = array($categories)  ;
-    }
-    $this->categories = $categories;
+    return array_keys($this->searches);
   }
+
 }