Code

Updated class_acl.inc
[gosa.git] / gosa-core / include / class_filter.inc
index ffb8789553a8db5238af8e7923345e4e586870f8..0bea6c4a69439e0d332efb044255762bf63b26fa 100644 (file)
@@ -1,4 +1,24 @@
 <?php
+/*
+ * This code is part of GOsa (http://www.gosa-project.org)
+ * Copyright (C) 2003-2008 GONICUS GmbH
+ *
+ * ID: $$Id$$
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
 
 class filter {
 
@@ -11,16 +31,18 @@ class filter {
   var $objectStorage= array();
   var $objectBase= "";
   var $base= "";
-  var $bases= array();
   var $scope= "";
   var $query;
-  var $baseMode= false;
+  var $initial= false;
   var $scopeMode= "auto";
   var $alphabet= null;
 
 
   function filter($filename)
   {
+    global $config;
+
+    // Load eventually passed filename
     if (!$this->load($filename)) {
       die("Cannot parse $filename!");
     }
@@ -46,13 +68,27 @@ class filter {
 
       // Move information
       $entry= $this->xmlData['search'];
-      $this->baseMode= $entry['base'];
       $this->scopeMode= $entry['scope'];
+      if ($entry['scope'] == "auto") {
+        $this->scope= "one";
+      } else {
+        $this->scope= $entry['scope'];
+      }
       $this->query= $entry['query'];
     } else {
       return false;
     }
 
+    // Transfer initial value
+    if (isset($this->xmlData['definition']['initial']) && $this->xmlData['definition']['initial'] == "true"){
+      $this->initial= true;
+    }
+
+    // Transfer category
+    if (isset($this->xmlData['definition']['category'])){
+      $this->category= $this->xmlData['definition']['category'];
+    }
+
     // Generate formular data
     if (isset($this->xmlData['element'])) {
       if (!isset($this->xmlData['element'][0])){
@@ -87,6 +123,17 @@ class filter {
           $this->alphabetElements[]= $tag;
         }
       }
+
+      // 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);
+      } 
+      uasort($this->elements, 'strlenSort');
+      $this->elements= array_reverse($this->elements);
+
     }
 
     return true;  
@@ -96,7 +143,15 @@ class filter {
   function getTextfield($element)
   {
     $tag= $element['tag'];
-    $result= "<input class='filter_textfield' id='$tag' name='$tag' type='text' size='30' maxlength='30' value='".$this->elementValues[$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'])) {
       $frequency= "0.5";
       $characters= "1";
@@ -133,13 +188,30 @@ class filter {
   function getCombobox($element)
   {
     $result= "<select name='".$element['tag']."' size='1' onClick='document.mainform.submit();'>";
+
+    // Fill with presets
     foreach ($element['value'] as $value) {
       $selected= "";
       if ($this->elementValues[$element['tag']] == $value['key']) {
         $selected= " selected";
       }
-      $result.= "<option value='".$value['key']."'$selected>{t}".$value['set']."{/t}</option>";
+
+      // Handle translations
+      $result.= "<option value='".$value['key']."'$selected>"._($value['label'])."</option>";
+    }
+
+    // Use autocompleter for additional data
+    if (isset($element['autocomplete'])) {
+      $list= $this->getCompletitionList($element['autocomplete'], $element['tag']);
+      foreach ($list as $value) {
+        $selected= "";
+        if ($this->elementValues[$element['tag']] == $value) {
+          $selected= " selected";
+        }
+        $result.= "<option value='$value'$selected>$value</option>";
+      }
     }
+
     $result.= "</select>";
 
     return $result;
@@ -166,11 +238,6 @@ class filter {
   }
 
 
-  function setBases($bases) {
-    $this->bases= $bases;    
-  }
-
-
   function setObjectStorage($storage) {
     $this->objectStorage= $storage;    
   }
@@ -181,12 +248,7 @@ class filter {
   }
 
 
-  function setCategory($category) {
-    $this->category= $category;    
-  }
-
-
-  function setCurrentBase($base) {
+  function setBase($base) {
     $this->base= $base;
   }
 
@@ -196,23 +258,6 @@ class filter {
   }
 
 
-  function renderBase()
-  {
-    $result= "<select name='currentMainBase' onChange='mainform.submit()' size='1'>";
-
-    foreach ($this->bases as $key=>$value) {
-      $selected= "";
-      if ($key == $this->base) {
-        $selected= " selected";
-      }
-      $result.= "<option value='".$key."'$selected>".$value."</option>";
-    }
-    $result.= "</select>";
-
-    return $result;
-  }
-
-
   function renderAlphabet($columns= 10)
   {
     // Return pre-rendered alphabet if available
@@ -265,13 +310,12 @@ class filter {
   }
 
 
-  function renderFilter()
+  function render()
   {
     $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) {
@@ -296,7 +340,7 @@ class filter {
     }
 
     // Load template
-    return ("<input type='hidden' name='FILTER_LOADED' value='1'>".$smarty->fetch(get_template_path("filter/".$this->xmlData['definition']['template'])));
+    return ("<input type='hidden' name='FILTER_LOADED' value='1'>".$smarty->fetch(get_template_path($this->xmlData['definition']['template'], true)));
   }
 
 
@@ -324,7 +368,7 @@ class filter {
       // Generate final filter
       foreach ($this->elements as $tag => $element) {
         if (!isset($element['set']) || !isset($element['unset'])) {
-          next;
+          continue;
         }
         $e_set= is_array($element['set'])?"":$element['set'];
         $e_unset= is_array($element['unset'])?"":$element['unset'];
@@ -384,20 +428,58 @@ class filter {
           $this->elementValues[$tag]= "";
         }
       }
-    }
 
-    // Save base
-    if (isset($_POST['BASE']) && $this->baseMode == "true") {
-      $base= validate($_POST['BASE']);
-      if (isset($this->bases[$base])) {
-        $this->base= $base;
+      // Save scope if needed
+      if ($this->scopeMode == "auto") {
+        $this->scope= isset($_POST['SCOPE'])?"sub":"one";
       }
     }
 
-    // Save scope if needed
-    if ($this->scopeMode == "auto") {
-      $this->scope= isset($_POST['SCOPE'])?"sub":"one";
+  }
+
+
+  function getCompletitionList($config, $tag, $value="*")
+  {
+    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'];
+    if (!is_array($attributes)) {
+      $attributes= array($attributes);
     }
+
+    // Make filter
+    $filter= preg_replace("/\\$$tag/", normalizeLDAP($value), $filter);
+    if (isset($config['base']) && isset($config['scope'])
+        && isset($config['category']) && isset($config['objectbase']) ) {
+      $result= call_user_func(array($backend, 'query'), $config['base'], $config['scope'], $filter, $attributes,
+                           $config["category"], $config["objectbase"]);
+    } else {
+      $result= call_user_func(array($backend, 'query'), $this->base, $this->scope, $filter, $attributes,
+                           $this->category, $this->objectStorage, $this->objectBase);
+    }
+
+    foreach ($result as $entry) {
+      foreach ($attributes as $attribute) {
+        if (is_array($entry[$attribute])) {
+          for ($i= 0; $i<$entry[$attribute]['count']; $i++) {
+            $res[]= $entry[$attribute][$i];
+          }
+        } else {
+          $res[]= $entry[$attribute];
+        }
+      }
+    }
+
+    return $res;
   }
 
 
@@ -408,36 +490,11 @@ class filter {
 
     foreach ($this->autocompleters as $tag => $config) {
       if(isset($_POST[$tag])){
-      
-        // 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'];
-        if (!is_array($attributes)) {
-          $attributes= array($attributes);
-        }
-
-        // Make filter
-        $filter= preg_replace("/\\$$tag/", normalizeLDAP($_POST[$tag]), $filter);
-        $result= call_user_func(array($backend, 'query'), $this->base, $this->scope, $filter, $attributes,
-                             $this->category, $this->objectStorage, $this->objectBase);
+        $result= $this->getCompletitionList($config, $tag, $_POST[$tag]);
 
         echo '<ul>';
         foreach ($result as $entry) {
-          foreach ($attributes as $attribute) {
-            if (is_array($entry[$attribute])) {
-              for ($i= 0; $i<$entry[$attribute]['count']; $i++) {
-                echo '<li>'.$entry[$attribute][$i].'</li>';
-              }
-            } else {
-              echo '<li>'.$entry[$entry][$attribute].'</li>';
-            }
-          }
+          echo '<li>'.$entry.'</li>';
         }
 
         echo '</ul>';
@@ -446,6 +503,7 @@ class filter {
     }
   }
 
+
 }
 
 ?>