X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-core%2Finclude%2Fclass_listing.inc;h=485a0aff701a6efe14df28591ed4a046dc78fcbe;hb=d5f42389530849d171b1dc22de1c591c5feedd38;hp=838377921b1509b6079aa7dd11a3734df44e0a9c;hpb=8b93421ede159098711830e41ed4ad1c46361992;p=gosa.git diff --git a/gosa-core/include/class_listing.inc b/gosa-core/include/class_listing.inc index 838377921..485a0aff7 100644 --- a/gosa-core/include/class_listing.inc +++ b/gosa-core/include/class_listing.inc @@ -45,13 +45,19 @@ class listing { var $pid; var $objectTypes= array(); var $objectTypeCount= array(); + var $objectDnMapping= array(); var $copyPasteHandler= null; var $snapshotHandler= null; + var $exporter= array(); + var $exportColumns= array(); + var $useSpan= false; + var $height= 0; function listing($filename) { global $config; + global $class_mapping; // Initialize pid $this->pid= preg_replace("/[^0-9]/", "", microtime(TRUE)); @@ -61,11 +67,15 @@ class listing { } // Set base for filter - $this->base= session::global_get("CurrentMainBase"); - if ($this->base == null) { + if ($this->baseMode) { + $this->base= session::global_get("CurrentMainBase"); + if ($this->base == null) { + $this->base= $config->current['BASE']; + } + $this->refreshBasesList(); + } else { $this->base= $config->current['BASE']; } - $this->refreshBasesList(); // Move footer information $this->showFooter= ($config->get_cfg_value("listSummary") == "true"); @@ -75,6 +85,16 @@ class listing { $this->registerElementFilter("departmentLink", "listing::filterDepartmentLink"); $this->registerElementFilter("link", "listing::filterLink"); $this->registerElementFilter("actions", "listing::filterActions"); + + // Load exporters + foreach($class_mapping as $class => $dummy) { + if (preg_match('/Exporter$/', $class)) { + $info= call_user_func(array($class, "getInfo")); + if ($info != null) { + $this->exporter= array_merge($this->exporter, $info); + } + } + } } @@ -84,6 +104,12 @@ class listing { } + function setHeight($height) + { + $this->height= $height; + } + + function setSnapshotHandler($handler) { $this->snapshotHandler= &$handler; @@ -97,7 +123,6 @@ class listing { $this->departments= $this->getDepartments(); } $this->filter->setBase($this->base); - $this->entries= $this->filter->query(); } @@ -140,6 +165,9 @@ class listing { } $this->categories= array(); if (isset($this->xmlData['definition']['objectType'])) { + if(isset($this->xmlData['definition']['objectType']['label'])) { + $this->xmlData['definition']['objectType']= array($this->xmlData['definition']['objectType']); + } foreach ($this->xmlData['definition']['objectType'] as $index => $otype) { $this->objectTypes[]= $this->xmlData['definition']['objectType'][$index]; if (isset($this->xmlData['definition']['objectType'][$index]['category'])){ @@ -161,6 +189,15 @@ class listing { $this->categories= array($this->categories); } + // Evaluate columns to be exported + if (isset($this->xmlData['table']['column'])){ + foreach ($this->xmlData['table']['column'] as $index => $config) { + if (isset($config['export']) && $config['export'] == "true"){ + $this->exportColumns[]= $index; + } + } + } + return true; } @@ -168,6 +205,7 @@ class listing { function renderHeader() { $this->header= array(); + $this->plainHeader= array(); // Initialize sort? $sortInit= false; @@ -205,17 +243,20 @@ class listing { } else { $this->header[$index]= "colprops[$index].">"._($config['label']).""; } + $this->plainHeader[]= _($config['label']); } else { if ($sortable) { $this->header[$index]= "colprops[$index]."> $sorter"; } else { $this->header[$index]= "colprops[$index]."> "; } + $this->plainHeader[]= ""; } } } } + function render() { // Check for exeeded sizelimit @@ -224,26 +265,30 @@ class listing { } // Initialize list - $result= ""; - $result.= "
"; - $result.= " -"; // Add the footer if requested if ($this->showFooter) { - $result.= ""; + $result.= ""; } - $result.= "
"; + $result= "\n"; + $height= 450; + if ($this->height != 0) { + $result.= "\n"; + $height= $this->height; + } + + $result.= "
"; - - // New table for the real list contents - $result.= ""; + // Close list body + $result.= "
\n"; + + $result.= "\n"; $this->numColumns= count($this->colprops) + ($this->multiSelect?1:0); // Build list header - $result.= ""; + $result.= "\n"; if ($this->multiSelect) { - $result.= ""; + $result.= "\n"; } foreach ($this->header as $header) { $result.= $header; } + $result.= "\n"; - // Add 13px for scroller - $result.= "
 
"; + // Build list body + $result.= "\n"; // No results? Just take an empty colspanned row if (count($this->entries) + count($this->departments) == 0) { @@ -255,6 +300,7 @@ class listing { $deps= 0; // Draw department browser if configured and we're not in sub mode + $this->useSpan= false; if ($this->departmentBrowser && $this->filter->scope != "sub") { // Fill with department browser if configured this way $departmentIterator= new departmentSortIterator($this->departments, $this->sortDirection[$this->sortColumn]); @@ -263,7 +309,7 @@ class listing { // Render multi select if needed if ($this->multiSelect) { - $result.=""; + $result.=""; } // Render defined department columns, fill the rest with some stuff @@ -272,6 +318,7 @@ class listing { $colspan= 1; if (isset($config['span'])){ $colspan= $config['span']; + $this->useSpan= true; } $result.=""; $rest-= $colspan; @@ -290,25 +337,42 @@ class listing { } // Fill with contents, sort as configured - $entryIterator= new listingSortIterator($this->entries, $this->sortDirection[$this->sortColumn], $this->sortAttribute, $this->sortType); - foreach ($entryIterator as $row => $entry){ - $result.=""; + foreach ($this->entries as $row => $entry) { + $trow= ""; // Render multi select if needed if ($this->multiSelect) { - $result.=""; + $trow.="\n"; } foreach ($this->xmlData['table']['column'] as $index => $config) { - $result.=""; + $renderedCell= $this->renderCell($config['value'], $entry, $row); + $trow.="\n"; + + // Save rendered column + $sort= preg_replace('/.*>([^<]+)<.*$/', '$1', $renderedCell); + $sort= preg_replace('/ /', '', $sort); + if (preg_match('/entries[$row]["_sort$index"]= $sort; } - $result.=""; + // Save rendered entry + $this->entries[$row]['_rendered']= $trow; + } + + // Complete list by sorting entries for _sort$index and appending them to the output + $entryIterator= new listingSortIterator($this->entries, $this->sortDirection[$this->sortColumn], "_sort".$this->sortColumn, $this->sortType); + foreach ($entryIterator as $row => $entry){ $alt++; + $result.="\n"; + $result.= $entry['_rendered']; + $result.="\n"; } // Need to fill the list if it's not full (nobody knows why this is 22 ;-)) - $emptyListStyle= (count($this->entries) + $deps == 0)?"border:0;":""; + $emptyListStyle= (count($this->entries) + (($this->useSpan && count($this->entries))?$deps:0) == 0)?"border:0;":""; if ((count($this->entries) + $deps) < 22) { $result.= ""; for ($i= 0; $i<$this->numColumns; $i++) { @@ -325,11 +389,12 @@ class listing { $result.= ""; } - $result.= "
  colprops[$index]." class='list1'>".$this->renderCell($config['value'], $entry, $row)."
colprops[$index]." class='list0'>".$this->renderCell($config['value'], $entry, $row)."colprops[$index]." class='list0'>".$renderedCell."
"; + $result.= "
"; foreach ($this->objectTypes as $objectType) { if (isset($this->objectTypeCount[$objectType['label']])) { @@ -338,12 +403,14 @@ class listing { } } - $result.= " 
"; + // Close list + $result.= ""; $smarty= get_smarty(); + $smarty->assign("usePrototype", "true"); $smarty->assign("FILTER", $this->filter->render()); $smarty->assign("SIZELIMIT", print_sizelimit_warning()); $smarty->assign("LIST", $result); @@ -373,8 +440,9 @@ class listing { global $config; $ui= get_userinfo(); - // Reset object counter + // Reset object counter / DN mapping $this->objectTypeCount= array(); + $this->objectDnMapping= array(); // Do not do anything if this is not our PID if(isset($_REQUEST['PID']) && $_REQUEST['PID'] != $this->pid) { @@ -382,10 +450,11 @@ class listing { } // Save base - if (isset($_POST['BASE']) && $this->baseMode == true) { - $base= validate($_POST['BASE']); + if (isset($_POST['BASE']) && $this->baseMode) { + $base= get_post('BASE'); if (isset($this->bases[$base])) { $this->base= $base; + session::global_set("CurrentMainBase", $this->base); } } @@ -398,6 +467,23 @@ class listing { } } + // Filter POST with "act" attributes -> posted from action menu + if (isset($_POST['exec_act']) && $_POST['act'] != '') { + if (preg_match('/^export.*$/', $_POST['act']) && isset($this->exporter[$_POST['act']])) { + $exporter= $this->exporter[$_POST['act']]; + $userinfo= ", "._("created by")." ".$ui->cn." - ".strftime('%A, %d. %B %Y, %H:%M:%S'); + $entryIterator= new listingSortIterator($this->entries, $this->sortDirection[$this->sortColumn], "_sort".$this->sortColumn, $this->sortType); + $sortedEntries= array(); + foreach ($entryIterator as $entry){ + $sortedEntries[]= $entry; + } + $instance= new $exporter['class']($this->headline.$userinfo, $this->plainHeader, $sortedEntries, $this->exportColumns); + $type= call_user_func(array($exporter['class'], "getInfo")); + $type= $type[$_POST['act']]; + send_binary_content($instance->query(), $type['filename'], $type= $type['mime']); + } + } + // Filter GET with "act" attributes if (isset($_GET['act'])) { $key= validate($_GET['act']); @@ -438,7 +524,7 @@ class listing { } if ($action == 'HOME') { $ui= get_userinfo(); - $this->base= get_base_from_people($ui->dn); + $this->base= $this->filter->getObjectBase($ui->dn); } // Reload departments @@ -452,38 +538,56 @@ class listing { } + function setBase($base) + { + $this->base= $base; + } + + + function getBase() + { + return $this->base; + } + + function parseLayout($layout) { $result= array(); $layout= preg_replace("/^\|/", "", $layout); $layout= preg_replace("/\|$/", "", $layout); $cols= split("\|", $layout); + foreach ($cols as $index => $config) { if ($config != "") { + $res= ""; $components= split(';', $config); - $config= ""; foreach ($components as $part) { if (preg_match("/^r$/", $part)) { - $config.= "text-align:right;"; + $res.= "text-align:right;"; continue; } if (preg_match("/^l$/", $part)) { - $config.= "text-align:left;"; + $res.= "text-align:left;"; continue; } if (preg_match("/^c$/", $part)) { - $config.= "text-align:center;"; + $res.= "text-align:center;"; continue; } if (preg_match("/^[0-9]+(|px|%)$/", $part)) { - $config.= "width:$part;"; + $res.= "width:$part;min-width:$part;"; continue; } } - $result[$index]= " style='$config' "; + // Add minimum width for scalable columns + if (!preg_match('/width:/', $res)){ + $res.= "min-width:200px;"; + } + + $result[$index]= " style='$res' "; } else { - $result[$index]= null; + $result[$index]= " style='min-width:100px'"; } } @@ -521,6 +625,10 @@ class listing { function renderBase() { + if (!$this->baseMode) { + return; + } + $result= ""; // Reset the currently used base to the first DN we found if there @@ -556,11 +666,18 @@ class listing { preg_match_all("/%\{filter:([^(]+)\((.*)\)\}/", $data, $matches, PREG_SET_ORDER); foreach ($matches as $match) { - if (!isset($this->filters[$match[1]])) { - continue; + $cl= ""; + $method= ""; + if (preg_match('/::/', $match[1])) { + $cl= preg_replace('/::.*$/', '', $match[1]); + $method= preg_replace('/^.*::/', '', $match[1]); + } else { + if (!isset($this->filters[$match[1]])) { + continue; + } + $cl= preg_replace('/::.*$/', '', $this->filters[$match[1]]); + $method= preg_replace('/^.*::/', '', $this->filters[$match[1]]); } - $cl= preg_replace('/::.*$/', '', $this->filters[$match[1]]); - $method= preg_replace('/^.*::/', '', $this->filters[$match[1]]); // Prepare params for function call $params= array(); @@ -577,6 +694,11 @@ class listing { $params[]= $this->pid; } + // base is replaced by the current base + if ($param == "base") { + $params[]= $this->getBase(); + } + // Fixie with "" is passed directly if (preg_match('/^".*"$/', $param)){ $params[]= preg_replace('/"/', '', $param); @@ -652,12 +774,14 @@ class listing { $objectType= $this->getObjectType($this->objectTypes, $classes); if ($objectType) { + $this->objectDnMapping[$dn]= $objectType["objectClass"]; $result= ""; if (!isset($this->objectTypeCount[$objectType['label']])) { $this->objectTypeCount[$objectType['label']]= 0; } $this->objectTypeCount[$objectType['label']]++; } + return $result; } @@ -675,9 +799,28 @@ class listing { foreach($actions as $action) { // Skip the entry completely if there's no permission to execute it if (!$this->hasActionPermission($action, $dn)) { + $result.= " "; continue; } + // Skip entry if the pseudo filter does not fit + if (isset($action['filter']) && preg_match('/^[a-z0-9_]+!?=[a-z0-9_]+$/i', $action['filter'])) { + list($fa, $fv)= split('=', $action['filter']); + if (preg_match('/^(.*)!$/', $fa, $m)){ + $fa= $m[1]; + if (isset($this->entries[$row][$fa]) && $this->entries[$row][$fa][0] == $fv) { + $result.= " "; + continue; + } + } else { + if (!isset($this->entries[$row][$fa]) && !$this->entries[$row][$fa][0] == $fv) { + $result.= " "; + continue; + } + } + } + + // If there's an objectclass definition and we don't have it // add an empty picture here. if (isset($action['objectclass'])){ @@ -787,7 +930,7 @@ class listing { $listhead =""; /* Check if we are in users home department */ - if(!count($deps) ||$this->filter->base == get_base_from_people($ui->dn)){ + if(!count($deps) || $this->filter->base == $this->filter->getObjectBase($ui->dn)){ $enableHome = false; } @@ -825,8 +968,8 @@ class listing { function getAction() { - // Do not do anything if this is not our PID - if(isset($_REQUEST['PID']) && $_REQUEST['PID'] != $this->pid) { + // Do not do anything if this is not our PID, or there's even no PID available... + if(!isset($_REQUEST['PID']) || $_REQUEST['PID'] != $this->pid) { return; } @@ -879,7 +1022,9 @@ class listing { // Filter POST with "act" attributes -> posted from action menu if (isset($_POST['act']) && $_POST['act'] != '') { - $result['action']= validate($_POST['act']); + if (!preg_match('/^export.*$/', $_POST['act'])){ + $result['action']= validate($_POST['act']); + } } // Drop targets if empty @@ -897,10 +1042,15 @@ class listing { return ""; } + // Array? + if (isset($this->xmlData['actionmenu']['action']['type'])){ + $this->xmlData['actionmenu']['action']= array($this->xmlData['actionmenu']['action']); + } + // Load shortcut $actions= &$this->xmlData['actionmenu']['action']; - $result= "". - "