summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: f7047b0)
raw | patch | inline | side by side (parent: f7047b0)
author | cajus <cajus@594d385d-05f5-0310-b6e9-bd551577e9d8> | |
Fri, 5 Mar 2010 16:51:10 +0000 (16:51 +0000) | ||
committer | cajus <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
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;
// 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;
$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;
}
}
- 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") {
}
- function setConverter($field, $hook)
+ function setConverter($hook)
{
- $this->converter[$field]= $hook;
+ $this->converter= $hook;
}
}
- 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'])."&filter=".$ch."\"> ".$ch." </a></td>";
-
- if ($c++ == $columns){
- $alphabet.= "</tr>";
- $c= 0;
- }
- }
-
- /* Fill remaining cells */
- while ($c++ <= $columns){
- $alphabet.= "<td> </td>";
- }
-
- /* Save alphabet */
- $this->alphabet= "<table width='100%'>$alphabet</table>";
-
- return ($this->alphabet);
- }
-
-
function renderApply()
{
return ("<input type='submit' name='apply' value='"._("Apply 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);
}
$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));
}
- 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
}
- function getCompletitionList($config, $tag, $value="*")
+ function getCompletitionList($config, $value="*")
{
global $class_mapping;
$res= array();
}
// 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"]);
// 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>';
}
}
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)
$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
+++ /dev/null
@@ -1,36 +0,0 @@
-<div class="filter">
-
- <h3>Filter
-
-
- {$TEMPLATES} <LABEL for='TEMPLATES'>{t}Show templates{/t}</LABEL><br>
- {$POSIX} <LABEL for='POSIX'>{t}Show POSIX users{/t}</LABEL><br>
- {$MAIL} <LABEL for='MAIL'>{t}Show Mail users{/t}</LABEL><br>
- {$SAMBA} <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> Name
- </label>
- </td>
- <td>
- {$NAME}
- </td>
- </tr>
- </table>
-
- <table>
- <tr>
- <td width="100%" align="right">
- {$APPLY}
- </td>
- </tr>
- </table>
-
-</div>
diff --git a/gosa-core/plugins/admin/users/user-filter.xml b/gosa-core/plugins/admin/users/user-filter.xml
index 5b42c1853a71fc42021092176036f0a2ec08e3a4..90ae3ee3c96625e02d62da4e03940ea743ece585 100644 (file)
<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>(&(objectClass=gosaAccount)$TEMPLATES$NAME$SAMBA$POSIX$MAIL)</filter>
+ <filter>(&(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>(&(objectClass=gosaAccount)(|(cn=*$NAME*)(sn=*$NAME*)(givenName=*$NAME*)))</filter>
+ <filter>(&(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>(&(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>
diff --git a/gosa-core/plugins/admin/users/user-list.tpl b/gosa-core/plugins/admin/users/user-list.tpl
index cab19e704469ecbae06d23a9e173f3457643d0cb..7cbddbd0c8de408a6c58ed2dbe98411bb43169e6 100644 (file)
<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">