Code

Updated filtering. Warning: breaks all headpages except the user one!
authorcajus <cajus@594d385d-05f5-0310-b6e9-bd551577e9d8>
Fri, 5 Mar 2010 16:51:10 +0000 (16:51 +0000)
committercajus <cajus@594d385d-05f5-0310-b6e9-bd551577e9d8>
Fri, 5 Mar 2010 16:51:10 +0000 (16:51 +0000)
git-svn-id: https://oss.gonicus.de/repositories/gosa/trunk@16313 594d385d-05f5-0310-b6e9-bd551577e9d8

gosa-core/include/class_filter.inc
gosa-core/include/class_management.inc
gosa-core/plugins/admin/users/user-filter.tpl [deleted file]
gosa-core/plugins/admin/users/user-filter.xml
gosa-core/plugins/admin/users/user-list.tpl

index 84da1b5f2e2bbdda6e4ee8cb2f8bd4ecf96c750e..8a0a9dfc13abf12efef2246ae0c459aeccaceb5e 100644 (file)
 class filter {
 
   var $xmlData;
-  var $elements= array();
-  var $elementValues= array();
-  var $alphabetElements= array();
-  var $autocompleter= array();
+  var $searches= array();
+  var $search;
   var $category= "";
   var $objectStorage= array();
   var $base= "";
   var $scope= "";
   var $query;
+  var $value= "";
   var $initial= false;
   var $scopeMode= "auto";
-  var $alphabet= null;
-  var $converter= array();
+  var $converter= null;
   var $pid;
 
 
@@ -65,23 +63,38 @@ class filter {
 
     // Load filter
     if (isset($this->xmlData['search'])) {
-      if (!isset($this->xmlData['search']['query'][0])){
-        $this->xmlData['search']['query']= array($this->xmlData['search']['query']);
-      }
 
-      // Move information
-      $entry= $this->xmlData['search'];
-      $this->scopeMode= $entry['scope'];
-      if ($entry['scope'] == "auto") {
-        $this->scope= "one";
+      // Array conversion
+      if (!is_array($this->xmlData['search'])) {
+        $searches= array($this->xmlData['search']);
       } else {
-        $this->scope= $entry['scope'];
+        $searches= $this->xmlData['search'];
+      }
+
+      /* Store available searches */
+      foreach ($this->xmlData['search'] as $search) {
+
+        /* Do multi conversation */ 
+        if (!is_array($search['query'])){
+          $search['query']= array($search['query']);
+        }
+
+        /* Store search */
+        $this->searches[$search['label']]= $search;
+
       }
-      $this->query= $entry['query'];
     } else {
       return false;
     }
 
+    // Transfer scope
+    $this->scopeMode= $this->xmlData['definition']['scope'];
+    if ($this->scopeMode == "auto") {
+      $this->scope= "one";
+    } else {
+      $this->scope= $this->scopeMode;
+    }
+
     // Transfer initial value
     if (isset($this->xmlData['definition']['initial']) && $this->xmlData['definition']['initial'] == "true"){
       $this->initial= true;
@@ -92,47 +105,25 @@ class filter {
       $this->category= $this->xmlData['definition']['category'];
     }
 
-    // Generate formular data
-    if (isset($this->xmlData['element'])) {
-      if (!isset($this->xmlData['element'][0])){
-        $this->xmlData['element']= array($this->xmlData['element']);
-      }
-      foreach ($this->xmlData['element'] as $element) {
+    // Set default search mode
+    $this->setSearch($this->xmlData['definition']['default']);
 
-        // Ignore elements without type
-        if (!isset($element['type']) || !isset($element['tag'])) {
-          next;
-        }
-
-        $tag= $element['tag'];
-
-        // Fix arrays
-        if (isset($element['value']) && !isset($element['value'][0])) {
-          $element['value']= array($element['value']);
-        }
+    return true;  
+  }
 
-        // Store element for quick access
-        $this->elements[$tag] = $element;
 
-        // Preset elementValues with default values if exist
-        if (isset($element['default']) && !is_array($element['default'])) {
-          $this->elementValues[$tag] = $element['default'];
-        } else {
-          $this->elementValues[$tag] = "";
-        }
-
-        // Does this element react on alphabet links?
-        if (isset($element['alphabet']) && $element['alphabet'] == "true") {
-          $this->alphabetElements[]= $tag;
-        }
+  function setSearch($method)
+  {
+    // Move information
+    if (isset($this->searches[$method])) {
+      $this->query= $this->searches[$method]['query'];
+      if (!isset($this->query[0])) {
+        $this->query= array($this->query);
       }
-
-      uasort($this->elements, 'strlenSort');
-      $this->elements= array_reverse($this->elements);
-
+      $this->search= $method;
+    } else {
+      die ("Invalid search module!");
     }
-
-    return true;  
   }
 
 
@@ -168,64 +159,6 @@ class filter {
   }
 
 
-  function getCheckbox($element)
-  {
-    $tag= $element['tag'];
-    $checked= "";
-    if ($this->elementValues[$tag] == "true") {
-      $checked= " checked";
-    }
-
-    $result= "<input class='filter_checkbox' id='$tag' name='$tag' type='checkbox' onClick='document.mainform.submit();' value='true'$checked>";
-    return $result;
-  }
-
-
-  function getCombobox($element)
-  {
-    $result= "<select name='".$element['tag']."' size='1' onChange='document.mainform.submit();'>";
-
-    // Fill with presets
-    foreach ($element['value'] as $value) {
-      $selected= "";
-      if ($this->elementValues[$element['tag']] == $value['key']) {
-        $selected= " selected";
-      }
-
-      // 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;
-  }
-
-
-  function setComboBoxOptions($tag, $options)
-  {
-    if (isset($this->elements[$tag]) && $this->elements[$tag]['type'] == "combobox") {
-      
-      $this->elements[$tag]['value']= array();
-      foreach ($options as $key => $label) {
-        $this->elements[$tag]['value'][]= array('label' => $label, 'key' => $key);
-      }
-    }
-  }
-
-
   function getCurrentBase()
   {
     if (isset($this->search->base) && (string)$this->search->scope != "auto") {
@@ -246,9 +179,9 @@ class filter {
   }
 
 
-  function setConverter($field, $hook)
+  function setConverter($hook)
   {
-    $this->converter[$field]= $hook;
+    $this->converter= $hook;
   }
 
 
@@ -270,45 +203,6 @@ class filter {
   }
 
 
-  function renderAlphabet($columns= 10)
-  {
-    // Return pre-rendered alphabet if available
-    if ($this->alphabet) {
-      return ($this->alphabet);
-    }
-
-    $characters= _("*ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");
-    $alphabet= "";
-    $c= 0;
-
-    /* Fill cells with charaters */
-    for ($i= 0, $l= mb_strlen($characters, 'UTF8'); $i<$l; $i++){
-      if ($c == 0){
-        $alphabet.= "<tr>";
-      }
-
-      $ch = mb_substr($characters, $i, 1, "UTF8");
-      $alphabet.= "<td><a class=\"alphaselect\" href=\"main.php?plug=".
-        validate($_GET['plug'])."&amp;filter=".$ch."\">&nbsp;".$ch."&nbsp;</a></td>";
-
-      if ($c++ == $columns){
-        $alphabet.= "</tr>";
-        $c= 0;
-      }
-    }
-
-    /* Fill remaining cells */
-    while ($c++ <= $columns){
-      $alphabet.= "<td>&nbsp;</td>";
-    }
-
-    /* Save alphabet */
-    $this->alphabet= "<table width='100%'>$alphabet</table>";
-
-    return ($this->alphabet);
-  }
-
-
   function renderApply()
   {
     return ("<input type='submit' name='apply' value='"._("Apply filter")."'>");
@@ -324,43 +218,10 @@ class filter {
 
   function render()
   {
-    $smarty= get_smarty();
-    $smarty->assign("ALPHABET", $this->renderAlphabet());
-    $smarty->assign("APPLY", $this->renderApply());
-    $smarty->assign("SCOPE", $this->renderScope());
-
-    // Load template and replace elementsHtml[]
-    foreach ($this->elements as $tag => $element) {
-      $htmlCode= "";
-      switch ($element['type']) {
-        case "textfield":
-          $htmlCode = $this->getTextfield($element);
-          break;
-
-        case "checkbox":
-          $htmlCode = $this->getCheckbox($element);
-          break;
-
-        case "combobox":
-          $htmlCode = $this->getCombobox($element);
-          break;
+    $content= "Search comes here...";
 
-        default:
-          die ("Unknown element type specified!");
-      }
-      $smarty->assign("$tag", $htmlCode);
-    }
-
-    // Try to load template from plugin the folder first...
-    $file = get_template_path($this->xmlData['definition']['template'], true);
-
-    // ... if this fails, try to load the file from the theme folder.
-    if(!file_exists($file)){
-      $file = get_template_path($this->xmlData['definition']['template']);
-    }
-
-    // Load template
-    return ("<input type='hidden' name='FILTER_PID' value='".$this->pid."'>".$smarty->fetch($file));
+    // Return meta data
+    return ("<input type='hidden' name='FILTER_PID' value='".$this->pid."'>".$content);
   }
 
 
@@ -391,32 +252,17 @@ class filter {
       $filter= $query['filter'];
       $attributes= $query['attribute'];
 
-      // Generate final filter
-      foreach ($this->elements as $tag => $element) {
-        if (!isset($element['set']) || !isset($element['unset'])) {
-          continue;
-        }
-
-        // Handle converters if present
-        if (isset($this->converter[$tag])) {
-          preg_match('/([^:]+)::(.*)$/', $this->converter[$tag], $m);
-          $e_set= call_user_func(array($m[1], $m[2]), preg_replace('/\$/', $this->elementValues[$tag], is_array($element['set'])?"":$element['set']));
-          $e_unset= call_user_func(array($m[1], $m[2]), preg_replace('/\$/', $this->elementValues[$tag], is_array($element['unset'])?"":$element['unset']));
-        } else {
-          $e_set= is_array($element['set'])?"":$element['set'];
-          $e_unset= is_array($element['unset'])?"":$element['unset'];
-        }
+      // 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));
+      }
 
-        // Do not replace escaped \$ - This is required to be able to search for e.g. windows machines.
-        if ($this->elementValues[$tag] == "") {
-          $e_unset= preg_replace('/([^\\\\])\$/', '${1}'.normalizeLdap($this->elementValues[$tag]), $e_unset);
-          $e_unset= preg_replace('/\\\\\$/','$', $e_unset);
-          $filter= preg_replace("/\\$$tag/", $e_unset, $filter);
-        } else {
-          $e_set= preg_replace('/([^\\\\])\$/', '${1}'.normalizeLdap($this->elementValues[$tag]), $e_set);
-          $e_set= preg_replace('/\\\\\$/','$', $e_set);
-          $filter= preg_replace("/\\$$tag/", $e_set, $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, $attributes, $this->category, $this->objectStorage));
@@ -426,38 +272,13 @@ class filter {
   }
 
 
-  function isValid()
-  {
-    foreach ($this->elements as $tag => $element) {
-      if (isset($element->regex)){
-        if (!preg_match('/'.(string)$element->regex.'/', $this->elementValues[$tag])){
-          return false;
-        }
-      }
-    }
-    return true;
-  }
-
-
   function update()
   {
-    /* React on alphabet links if needed */
-    if (isset($_GET['filter'])){
-      $s= mb_substr(validate($_GET['filter']), 0, 1, "UTF8");
-      foreach ($this->alphabetElements as $tag) {
-        $this->elementValues[$tag]= $s;
-      }
-    }
-
     if (isset($_POST['FILTER_PID']) && $_POST['FILTER_PID'] == $this->pid) {
-      // Load post values and adapt filter, base and scope accordingly - but
-      // only if we didn't get a _GET
-      foreach ($this->elements as $tag => $element) {
-        if (isset($_POST[$tag])){
-          $this->elementValues[$tag]= validate($_POST[$tag]);
-        } else {
-          $this->elementValues[$tag]= "";
-        }
+
+      // Save input field
+      if (isset($_POST['search_filter'])) {
+        $this->value= validate($_POST['search_filter']);
       }
 
       // Save scope if needed
@@ -469,7 +290,7 @@ class filter {
   }
 
 
-  function getCompletitionList($config, $tag, $value="*")
+  function getCompletitionList($config, $value="*")
   {
     global $class_mapping;
     $res= array();
@@ -488,7 +309,7 @@ class filter {
     }
 
     // Make filter
-    $filter= preg_replace("/\\$$tag/", normalizeLdap($value), $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"]);
@@ -523,22 +344,20 @@ class filter {
     // Introduce maximum number of entries
     $max= 25;
 
-    foreach ($this->autocompleters as $tag => $config) {
-      if(isset($_POST[$tag])){
-        $result= $this->getCompletitionList($config, $tag, $_POST[$tag]);
-        $result= array_unique($result);
-        asort($result);
-
-        echo '<ul>';
-        foreach ($result as $entry) {
-          echo '<li>'.mark($_POST[$tag], $entry).'</li>';
-          if ($max-- == 0) {
-            break;
-          }
-        }
+    if(isset($this->searches[$this->search]['autocomplete'])){
+      $result= $this->getCompletitionList($this->searches[$this->search]['autocomplete'], $_POST['search_filter']);
+      $result= array_unique($result);
+      asort($result);
 
-        echo '</ul>';
+      echo '<ul>';
+      foreach ($result as $entry) {
+        echo '<li>'.mark($_POST['search_filter'], $entry).'</li>';
+        if ($max-- == 0) {
+          break;
+        }
       }
+
+      echo '</ul>';
     }
   }
 
@@ -565,16 +384,7 @@ class filter {
 
     return $base;
   }
-
-
 }
 
-// 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);
-} 
 
 ?>
index 8f9827a2f2c01019952d3681c90fdb8f143dacb3..60eb713e84fb19439e8a95c32765c2f9b261cd9a 100644 (file)
@@ -141,9 +141,6 @@ class management
       $this->filter->update();
       session::global_set(get_class($this)."_filter", $this->filter);
       session::set('autocomplete', $this->filter);
-      if (!$this->filter->isValid()){
-        msg_dialog::display(_("Filter error"), _("The filter is incomplete!"), ERROR_DIALOG);
-      }
     }
 
     // Handle actions (POSTs and GETs)
diff --git a/gosa-core/plugins/admin/users/user-filter.tpl b/gosa-core/plugins/admin/users/user-filter.tpl
deleted file mode 100644 (file)
index 347dc4f..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-<div class="filter">
-
-   <h3>Filter
-
-
-  {$TEMPLATES}&nbsp;<LABEL for='TEMPLATES'>{t}Show templates{/t}</LABEL><br>
-  {$POSIX}&nbsp;<LABEL for='POSIX'>{t}Show POSIX users{/t}</LABEL><br>
-  {$MAIL}&nbsp;<LABEL for='MAIL'>{t}Show Mail users{/t}</LABEL><br>
-  {$SAMBA}&nbsp;<LABEL for='SAMBA'>{t}Show Samba users{/t}</LABEL><br>
-
-  <hr>
-
-  {$SCOPE}
-
-  <table>
-   <tr>
-    <td>
-     <label for="NAME">
-      <img src="images/lists/search.png" align=middle>&nbsp;Name
-     </label>
-    </td>
-    <td>
-     {$NAME}
-    </td>
-   </tr>
-  </table>
-
-  <table>
-   <tr>
-    <td width="100%" align="right">
-     {$APPLY}
-    </td>
-   </tr>
-  </table>
-
-</div>
index 5b42c1853a71fc42021092176036f0a2ec08e3a4..90ae3ee3c96625e02d62da4e03940ea743ece585 100644 (file)
@@ -3,14 +3,16 @@
 <filterdef>
   <definition>
     <category>users</category>
-    <template>user-filter.tpl</template>
     <initial>true</initial>
+    <default>All</default>
+    <scope>auto</scope>
   </definition>
 
   <search>
+    <label>All</label>
     <query>
       <backend>LDAP</backend>
-      <filter>(&amp;(objectClass=gosaAccount)$TEMPLATES$NAME$SAMBA$POSIX$MAIL)</filter>
+      <filter>(&amp;(objectClass=gosaAccount)(|(cn=$)(sn=$)(uid=$)))</filter>
       <attribute>dn</attribute>
       <attribute>objectClass</attribute>
       <attribute>givenName</attribute>
       <attribute>uid</attribute>
       <attribute>userPassword</attribute>
     </query>
-    <scope>auto</scope>
+    <autocomplete>
+      <attribute>cn</attribute>
+      <frequency>0.5</frequency>
+      <characters>3</characters>
+    </autocomplete>
   </search>
 
-  <element>
-    <type>textfield</type>
-    <tag>NAME</tag>
-    <size>20</size>
-    <maxlength>60</maxlength>
-    <default></default>
-    <unset></unset>
-    <set>(|(cn=*$*)(sn=*$*)(givenName=*$*))</set>
-    <alphabet>true</alphabet>
-    <autocomplete>
+  <search>
+    <label>POSIX</label>
+    <query>
       <backend>LDAP</backend>
-      <filter>(&amp;(objectClass=gosaAccount)(|(cn=*$NAME*)(sn=*$NAME*)(givenName=*$NAME*)))</filter>
+      <filter>(&amp;(objectClass=gosaAccount)(objectClass=posixAccount)(|(cn=$)(sn=$)(uid=$)))</filter>
+      <attribute>dn</attribute>
+      <attribute>objectClass</attribute>
+      <attribute>givenName</attribute>
+      <attribute>sn</attribute>
+      <attribute>uid</attribute>
+      <attribute>userPassword</attribute>
+    </query>
+    <autocomplete>
       <attribute>cn</attribute>
       <frequency>0.5</frequency>
       <characters>3</characters>
     </autocomplete>
-  </element>
-
-  <element>
-    <type>checkbox</type>
-    <tag>TEMPLATES</tag>
-    <default></default>
-    <unset>(!(objectClass=gosaUserTemplate))</unset>
-    <set></set>
-  </element>
-
-  <element>
-    <type>checkbox</type>
-    <tag>POSIX</tag>
-    <default>true</default>
-    <unset>(!(objectClass=posixAccount))</unset>
-    <set></set>
-  </element>
-
-  <element>
-    <type>checkbox</type>
-    <tag>MAIL</tag>
-    <default>true</default>
-    <unset>(!(objectClass=gosaMailAccount))</unset>
-    <set></set>
-  </element>
+  </search>
 
-  <element>
-    <type>checkbox</type>
-    <tag>SAMBA</tag>
-    <default>true</default>
-    <unset>(!(objectClass=sambaSamAccount))</unset>
-    <set></set>
-  </element>
+  <search>
+    <label>Mail</label>
+    <query>
+      <backend>LDAP</backend>
+      <filter>(&amp;(objectClass=gosaAccount)(objectClass=gosaMailAccount)(|(cn=$)(sn=$)(uid=$)(mail=$)))</filter>
+      <attribute>dn</attribute>
+      <attribute>objectClass</attribute>
+      <attribute>givenName</attribute>
+      <attribute>sn</attribute>
+      <attribute>uid</attribute>
+      <attribute>userPassword</attribute>
+    </query>
+    <autocomplete>
+      <attribute>mail</attribute>
+      <frequency>0.5</frequency>
+      <characters>3</characters>
+    </autocomplete>
+  </search>
 
 </filterdef>
index cab19e704469ecbae06d23a9e173f3457643d0cb..7cbddbd0c8de408a6c58ed2dbe98411bb43169e6 100644 (file)
@@ -13,6 +13,7 @@
       <td>{$RELOAD}</td>
       <td class="left-border">{t}Base{/t} {$BASE}</td>
       <td class="left-border">{$ACTIONS}</td>
+      <td class="left-border">{$FILTER}</td>
      </tr>
     </table>
    </div>
   {$LIST}
 </div>
 
-<!--<div id="filter">
-  {$FILTER}
-</div>-->
-
 <div class="clear"></div>
 
 <input type="hidden" name="ignore">