";
$c= 0;
}
}
/* Fill remaining cells */
while ($c++ <= $columns){
$alphabet.= "
";
}
/* Save alphabet */
$this->alphabet= "
$alphabet
";
return ($this->alphabet);
}
function renderApply()
{
return ("");
}
function renderScope()
{
$checked= $this->scope == "sub"?" checked":"";
return " ";
}
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;
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 ("".$smarty->fetch($file));
}
function query()
{
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'])) {
die("No backend specified in search config.");
}
// Is backend available?
$backend= "filter".$query['backend'];
if (!isset($class_mapping["$backend"])) {
die("Invalid backend specified in search config.");
}
// Load filter and attributes
$filter= $query['filter'];
$attributes= $query['attribute'];
// ObjectClass is required to check permissions later.
if(!in_array_strict('objectClass', $attributes)) $attributes[] = 'objectClass';
// 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'];
}
// 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);
}
}
// Now call filter method and merge resulting entries.
$result= array_merge($result, call_user_func(array($backend, 'query'),
$this, $this->base, $this->scope, $filter, $attributes, $this->category, $this->objectStorage));
}
return ($result);
}
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 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);
}
// ObjectClass is required to check permissions later.
if(!in_array_strict('objectClass', $attributes)) $attributes[] = 'objectClass';
// Make filter
$filter= preg_replace("/\\$$tag/", normalizeLdap($value), $filter);
if (isset($config['base']) && isset($config['scope']) && isset($config['category'])) {
$result= call_user_func(array($backend, 'query'), $this,$config['base'], $config['scope'], $filter, $attributes,
$config["category"], $config["objectStorage"]);
} else {
$result= call_user_func(array($backend, 'query'), $this,$this->base, $this->scope, $filter, $attributes,
$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++) {
if (mb_stristr($entry[$attribute][$i], $value)) {
$res[]= $entry[$attribute][$i];
}
}
} else {
$res[]= $entry[$attribute];
}
}
}
return $res;
}
function processAutocomplete()
{
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 '
';
foreach ($result as $entry) {
echo '
'.mark($_POST[$tag], $entry).'
';
if ($max-- == 0) {
break;
}
}
echo '
';
}
}
}
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);
}
?>