X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-core%2Finclude%2Fclass_listing.inc;h=911c904f06dc254c12121b74081c25d0b17e3bc8;hb=570a78f23ea42fe930518d1b272a275e3e0032ab;hp=76c1ddef8688b2a503f9ac2f8990ba2ec162ac24;hpb=44b856295281dbe113bc27a7e4163bb6fe51afcc;p=gosa.git diff --git a/gosa-core/include/class_listing.inc b/gosa-core/include/class_listing.inc index 76c1ddef8..911c904f0 100644 --- a/gosa-core/include/class_listing.inc +++ b/gosa-core/include/class_listing.inc @@ -47,11 +47,16 @@ class listing { var $objectTypeCount= 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 +66,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 +84,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 +103,12 @@ class listing { } + function setHeight($height) + { + $this->height= $height; + } + + function setSnapshotHandler($handler) { $this->snapshotHandler= &$handler; @@ -97,7 +122,6 @@ class listing { $this->departments= $this->getDepartments(); } $this->filter->setBase($this->base); - $this->entries= $this->filter->query(); } @@ -140,6 +164,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 +188,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 +204,7 @@ class listing { function renderHeader() { $this->header= array(); + $this->plainHeader= array(); // Initialize sort? $sortInit= false; @@ -205,12 +242,14 @@ 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[]= ""; } } } @@ -224,26 +263,32 @@ class listing { } // Initialize list - $result= ""; - $result.= "
"; - $result.= " -\n"; // New table for the real list contents - $result.= "
"; + $result= "\n"; + $height= 450; + if ($this->height != 0) { + $result= "\n"; + $height= $this->height; + } + + $result.= "
\n"; + $result.= "
+"; + $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; } // Add 13px for scroller - $result.= "
 
 
"; + $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]); @@ -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++) { @@ -382,7 +446,7 @@ class listing { } // Save base - if (isset($_POST['BASE']) && $this->baseMode == true) { + if (isset($_POST['BASE']) && $this->baseMode) { $base= validate($_POST['BASE']); if (isset($this->bases[$base])) { $this->base= $base; @@ -398,6 +462,18 @@ 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'); + $instance= new $exporter['class']($this->headline.$userinfo, $this->plainHeader, $this->entries, $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']); @@ -452,6 +528,18 @@ class listing { } + function setBase($base) + { + $this->base= $base; + } + + + function getBase() + { + return $this->base; + } + + function parseLayout($layout) { $result= array(); @@ -511,12 +599,20 @@ class listing { // Watch out for filters and prepare to execute them $data= $this->processElementFilter($data, $config, $row); + // Replace all non replaced %{...} instances because they + // are non resolved attributes or filters + $data= preg_replace('/%{[^}]+}/', ' ', $data); + return $data; } function renderBase() { + if (!$this->baseMode) { + return; + } + $result= "". + $result= "
". "
  • Aktionen "; + "border=0 class='center' src='images/lists/sort-down.png'>"; // Build ul/li list $result.= $this->recurseActions($actions); @@ -922,7 +1020,7 @@ class listing { // Fill image if set $img= ""; if (isset($action['image'])){ - $img= " "; + $img= " "; } if ($action['type'] == "separator"){ @@ -957,6 +1055,10 @@ class listing { $result.= $this->renderSnapshotMenu($separator); break; + case 'exporter': + $result.= $this->renderExporterMenu($separator); + break; + case 'daemon': $result.= $this->renderDaemonMenu($separator); break; @@ -983,7 +1085,7 @@ class listing { // Every ACL has to pass foreach ($acls as $acl) { $module= $this->module; - $acllist= array(); + $aclList= array(); // Split for category and plugins if needed // match for "[rw]" style entries @@ -1081,7 +1183,7 @@ class listing { $attrs[]= $data['ATTR']; } $filter.= "))"; - $res= get_list($filter, $this->module, $this->base, $attrs, GL_NONE | GL_SIZELIMIT); + $res= get_list($filter, $this->module, $this->base, $attrs, GL_NONE); // Analyze list of departments foreach ($res as $department) { @@ -1132,13 +1234,13 @@ class listing { // Copy entry if($copy){ - $result.= " "._("Copy")."
  • "; + $result.= " "._("Copy").""; $separator= ""; } // Cut entry if($cut){ - $result.= " "._("Cut").""; + $result.= " "._("Cut").""; $separator= ""; } } @@ -1146,7 +1248,7 @@ class listing { // Draw entries that allow pasting entries if($paste){ if($this->copyPasteHandler->entries_queued()){ - $result.= " "._("Paste").""; + $result.= " "._("Paste").""; }else{ $result.= " "._("Paste").""; } @@ -1214,7 +1316,7 @@ class listing { // Draw icons according to the restore flag if($restore){ - $result.= " "._("Restore snapshots").""; + $result.= " "._("Restore snapshots").""; }else{ $result.= " "._("Restore snapshots").""; } @@ -1224,6 +1326,26 @@ class listing { } + function renderExporterMenu($separator) + { + // Presets + $result = ""; + + // Draw entries + $result.= " "._("Export list")." 
      "; + + // Export CVS as build in exporter + foreach ($this->exporter as $action => $exporter) { + $result.= "
    •  ".$exporter['label']."
    • "; + } + + // Finalize list + $result.= "
    "; + + return($result); + } + + function renderSnapshotActions($row, $dn, $category, $class, $copy= true, $cut= true) { // We can only provide information if we've got a snapshot handler @@ -1275,7 +1397,7 @@ class listing { $events= DaemonEvent::get_event_types_by_category($this->categories); if(isset($events['BY_CLASS']) && count($events['BY_CLASS'])){ foreach($events['BY_CLASS'] as $name => $event){ - $result.= " ".$event['s_Menu_Name'].""; + $result.= "".$event['MenuImage']." ".$event['s_Menu_Name'].""; $separator= ""; } }
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."