index 1247ad781b62997165444711a8d4efc2d4368145..64cfded3d8a600559b97bcd076b296cd3ed418fa 100644 (file)
var $autocompleter= array();
var $category= "";
var $objectStorage= array();
- var $objectBase= "";
var $base= "";
var $scope= "";
var $query;
var $initial= false;
var $scopeMode= "auto";
var $alphabet= null;
+ var $converter= array();
+ var $pid;
function filter($filename)
if (!$this->load($filename)) {
die("Cannot parse $filename!");
}
+
+ $this->pid= preg_replace("/[^0-9]/", "", microtime(TRUE));
}
$contents = file_get_contents($filename);
$this->xmlData= xml::xml2array($contents, 1);
- if (!isset($this->xmlData['filter'])) {
+ if (!isset($this->xmlData['filterdef'])) {
return false;
}
- $this->xmlData= $this->xmlData["filter"];
+ $this->xmlData= $this->xmlData["filterdef"];
// Load filter
if (isset($this->xmlData['search'])) {
$this->alphabetElements[]= $tag;
}
}
+
+ uasort($this->elements, 'strlenSort');
+ $this->elements= array_reverse($this->elements);
+
}
return true;
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";
$checked= " checked";
}
- $result= "<input class='filter_checkbox' name='$tag' type='checkbox' onClick='document.mainform.submit();' value='true'$checked>";
+ $result= "<input class='filter_checkbox' id='$tag' name='$tag' type='checkbox' onClick='document.mainform.submit();' value='true'$checked>";
return $result;
}
}
- function setObjectStorage($storage) {
- $this->objectStorage= $storage;
+ function setConverter($field, $hook)
+ {
+ $this->converter[$field]= $hook;
}
- function setObjectBase($base) {
- $this->objectBase= $base;
+ function setObjectStorage($storage)
+ {
+ $this->objectStorage= $storage;
}
- function setBase($base) {
+ function setBase($base)
+ {
$this->base= $base;
}
- function setCurrentScope($scope) {
+ function setCurrentScope($scope)
+ {
$this->scope= $scope;
}
function renderScope()
{
$checked= $this->scope == "sub"?" checked":"";
- return "<input type='checkbox' name='SCOPE' value='1' onClick='document.mainform.submit();'$checked> "._("Search in subtrees");
+ return "<input type='checkbox' id='SCOPE' name='SCOPE' value='1' onClick='document.mainform.submit();'$checked> <LABEL for='SCOPE'>"._("Search in subtrees")."</LABEL>";
}
}
// Load template
- return ("<input type='hidden' name='FILTER_LOADED' value='1'>".$smarty->fetch(get_template_path($this->xmlData['definition']['template'], true)));
+ return ("<input type='hidden' name='FILTER_PID' value='".$this->pid."'>".$smarty->fetch(get_template_path($this->xmlData['definition']['template'], true)));
}
global $class_mapping;
$result= array();
+ // Return empty list if initial is not set
+ if (!$this->initial) {
+ $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($element['set']) || !isset($element['unset'])) {
continue;
}
- $e_set= is_array($element['set'])?"":$element['set'];
- $e_unset= is_array($element['unset'])?"":$element['unset'];
+
+ // 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'];
+ }
if ($this->elementValues[$tag] == "") {
$e_unset= preg_replace('/\$/', normalizeLdap($this->elementValues[$tag]), $e_unset);
}
}
- $result= array_merge($result, call_user_func(array($backend, 'query'), $this->base, $this->scope, $filter, $attributes,
- $this->category, $this->objectStorage, $this->objectBase));
+ $result= array_merge($result, call_user_func(array($backend, 'query'), $this->base, $this->scope, $filter, $attributes, $this->category, $this->objectStorage));
}
-
return ($result);
}
function update()
{
-
/* React on alphabet links if needed */
if (isset($_GET['filter'])){
- $s= mb_substr(validate($_GET['filter']), 0, 1, "UTF8")."*";
- if ($s == "**"){
- $s= "*";
- }
+ $s= mb_substr(validate($_GET['filter']), 0, 1, "UTF8");
foreach ($this->alphabetElements as $tag) {
$this->elementValues[$tag]= $s;
}
}
- if (isset($_POST['FILTER_LOADED'])) {
+ 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) {
}
// Make filter
- $filter= preg_replace("/\\$$tag/", normalizeLDAP($value), $filter);
- if (isset($config['base']) && isset($config['scope'])
- && isset($config['category']) && isset($config['objectbase']) ) {
+ $filter= preg_replace("/\\$$tag/", 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["objectbase"]);
+ $config["category"], $config["objectStorage"]);
} else {
$result= call_user_func(array($backend, 'query'), $this->base, $this->scope, $filter, $attributes,
- $this->category, $this->objectStorage, $this->objectBase);
+ $this->category, $this->objectStorage);
}
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];
+ if (mb_stristr($entry[$attribute][$i], $value)) {
+ $res[]= $entry[$attribute][$i];
+ }
}
} else {
$res[]= $entry[$attribute];
global $class_mapping;
$result= array();
+ // 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>'.$entry.'</li>';
+ if ($max-- == 0) {
+ break;
+ }
}
echo '</ul>';
}
+ }
+ }
+
+ function getObjectBase($dn)
+ {
+ global $config;
+ $base= "";
+
+ // Try every object storage
+ $storage= $this->objectStorage;
+ if (!is_array($storage)){
+ $storage= array($storage);
+ }
+ foreach ($storage as $location) {
+ $pattern= "/^[^,]+,".preg_quote($location, '/')."/i";
+ $base= preg_replace($pattern, '', $dn);
+ }
+
+ /* Set to base, if we're not on a correct subtree */
+ if (!isset($config->idepartments[$base])){
+ $base= $config->current['BASE'];
}
+
+ 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);
+}
+
?>