X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-core%2Finclude%2Fclass_listing.inc;h=9d9835b2b38bb74e34e181017466108b345115e3;hb=3a308e40188042fb56365af23190514a85621963;hp=e9cc5d9ebe1e19c470500bd640f9d22abb3a999b;hpb=8be0d004bb2ce4d7bac193179eba7e93c41296f2;p=gosa.git diff --git a/gosa-core/include/class_listing.inc b/gosa-core/include/class_listing.inc index e9cc5d9eb..9d9835b2b 100644 --- a/gosa-core/include/class_listing.inc +++ b/gosa-core/include/class_listing.inc @@ -45,11 +45,16 @@ class listing { var $pid; var $objectTypes= array(); var $objectTypeCount= array(); + var $copyPasteHandler= null; + var $snapshotHandler= null; + var $exporter= array(); + var $exportColumns= array(); function listing($filename) { global $config; + global $class_mapping; // Initialize pid $this->pid= preg_replace("/[^0-9]/", "", microtime(TRUE)); @@ -73,6 +78,39 @@ 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); + } + } + } + } + + + function setCopyPasteHandler($handler) + { + $this->copyPasteHandler= &$handler; + } + + + function setSnapshotHandler($handler) + { + $this->snapshotHandler= &$handler; + } + + + function setFilter($filter) + { + $this->filter= &$filter; + if ($this->departmentBrowser){ + $this->departments= $this->getDepartments(); + } + $this->filter->setBase($this->base); + $this->entries= $this->filter->query(); } @@ -113,9 +151,16 @@ class listing { "objectClass" => $data['OC'], "image" => $data['IMG']); } + $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'])){ + $this->categories[]= $this->xmlData['definition']['objectType'][$index]['category']; + } } } @@ -128,6 +173,18 @@ class listing { // Assign headline/module $this->headline= _($this->xmlData['definition']['label']); $this->module= $this->xmlData['definition']['module']; + if (!is_array($this->categories)){ + $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; } @@ -136,6 +193,7 @@ class listing { function renderHeader() { $this->header= array(); + $this->plainHeader= array(); // Initialize sort? $sortInit= false; @@ -173,12 +231,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[]= ""; } } } @@ -186,29 +246,32 @@ class listing { function render() { -echo "sizelimit, copypaste handler, snapshot handler, daemon handler
"; + // Check for exeeded sizelimit + if (($message= check_sizelimit()) != ""){ + return($message); + } // Initialize list - $result= ""; - $result.= "
"; + $result= "\n"; + $result.= "
\n"; $result.= " -\n"; // New table for the real list contents - $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) { @@ -232,11 +295,18 @@ echo "sizelimit, copypaste handler, snapshot handler, daemon handler
"; } // Render defined department columns, fill the rest with some stuff + $rest= $this->numColumns - 1; foreach ($this->xmlData['table']['department'] as $index => $config) { - $result.=""; + $colspan= 1; + if (isset($config['span'])){ + $colspan= $config['span']; + } + $result.=""; + $rest-= $colspan; } - $last= count($this->xmlData['table']['department']) + 1; - $rest= $this->numColumns - $last; + + // Fill remaining cols with nothing + $last= $this->numColumns - $rest; for ($i= 0; $i<$rest; $i++){ $result.= ""; } @@ -248,26 +318,42 @@ echo "sizelimit, copypaste handler, snapshot handler, daemon handler
"; } // 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); + 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) + count($deps) == 0)?"border:0;":""; - if (count($this->entries) + count($deps) < 22) { + $emptyListStyle= (count($this->entries) + $deps == 0)?"border:0;":""; + if ((count($this->entries) + $deps) < 22) { $result.= ""; for ($i= 0; $i<$this->numColumns; $i++) { if ($i == 0) { @@ -303,6 +389,7 @@ echo "sizelimit, copypaste handler, snapshot handler, daemon handler
"; $smarty= get_smarty(); $smarty->assign("FILTER", $this->filter->render()); + $smarty->assign("SIZELIMIT", print_sizelimit_warning()); $smarty->assign("LIST", $result); // Assign navigation elements @@ -325,22 +412,14 @@ echo "sizelimit, copypaste handler, snapshot handler, daemon handler
"; } - function setFilter($filter) - { - $this->filter= &$filter; - if ($this->departmentBrowser){ - $this->departments= $this->getDepartments(); - } - $this->filter->setBase($this->base); - $this->entries= $this->filter->query(); - } - - function update() { global $config; $ui= get_userinfo(); + // Reset object counter + $this->objectTypeCount= array(); + // Do not do anything if this is not our PID if(isset($_REQUEST['PID']) && $_REQUEST['PID'] != $this->pid) { return; @@ -363,6 +442,18 @@ echo "sizelimit, copypaste handler, snapshot handler, daemon handler
"; } } + // 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']); @@ -417,6 +508,18 @@ echo "sizelimit, copypaste handler, snapshot handler, daemon handler
"; } + function setBase($base) + { + $this->base= $base; + } + + + function getBase() + { + return $this->base; + } + + function parseLayout($layout) { $result= array(); @@ -476,6 +579,10 @@ echo "sizelimit, copypaste handler, snapshot handler, daemon handler
"; // 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; } @@ -666,19 +773,21 @@ echo "sizelimit, copypaste handler, snapshot handler, daemon handler
"; } // Handle special types - if ($action['type'] == "snapshot") { - #TODO - #echo "actiontriggers: snapshot missing
"; - } - if ($action['type'] == "copypaste") { - #TODO - #echo "actiontriggers: copypaste missing
"; - } - if ($action['type'] == "daemon") { - #TODO - #echo "actiontriggers: daemon missing
"; - } + if ($action['type'] == "copypaste" || $action['type'] == "snapshot") { + $objectType= $this->getObjectType($this->objectTypes, $this->entries[$row]['objectClass']); + $category= $class= null; + if ($objectType) { + $category= $objectType['category']; + $class= $objectType['class']; + } + + if ($action['type'] == "copypaste") { + $result.= $this->renderCopyPasteActions($row, $this->entries[$row]['dn'], $category, $class); + } else { + $result.= $this->renderSnapshotActions($row, $this->entries[$row]['dn'], $category, $class); + } + } } return $result; @@ -838,7 +947,9 @@ echo "sizelimit, copypaste handler, snapshot handler, daemon handler
"; // 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 @@ -858,9 +969,9 @@ echo "sizelimit, copypaste handler, snapshot handler, daemon handler
"; // Load shortcut $actions= &$this->xmlData['actionmenu']['action']; - $result= "". + $result= "
". "
  • Aktionen "; + "border=0 class='center' src='images/lists/sort-down.png'>"; // Build ul/li list $result.= $this->recurseActions($actions); @@ -885,7 +996,7 @@ echo "sizelimit, copypaste handler, snapshot handler, daemon handler
    "; // Fill image if set $img= ""; if (isset($action['image'])){ - $img= " "; + $img= " "; } if ($action['type'] == "separator"){ @@ -913,18 +1024,19 @@ echo "sizelimit, copypaste handler, snapshot handler, daemon handler
    "; // Check for special types switch ($action['type']) { case 'copypaste': - #TODO - #echo "actionmenu: copypaste missing
    "; + $result.= $this->renderCopyPasteMenu($separator); break; case 'snapshot': - #TODO - #echo "actionmenu: snapshot missing
    "; + $result.= $this->renderSnapshotMenu($separator); + break; + + case 'exporter': + $result.= $this->renderExporterMenu($separator); break; case 'daemon': - #TODO - #echo "actionmenu: daemon missing
    "; + $result.= $this->renderDaemonMenu($separator); break; } @@ -949,7 +1061,7 @@ echo "sizelimit, copypaste handler, snapshot handler, daemon handler
    "; // 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 @@ -1072,6 +1184,204 @@ echo "sizelimit, copypaste handler, snapshot handler, daemon handler
    "; return $departments; } + + function renderCopyPasteMenu($separator, $copy= true, $cut= true) + { + // We can only provide information if we've got a copypaste handler + // instance + if(!(isset($this->copyPasteHandler) && is_object($this->copyPasteHandler))){ + return ""; + } + + // Presets + $result= ""; + $read= $paste= false; + $ui= get_userinfo(); + + // Switch flags to on if there's at least one category which allows read/paste + foreach($this->categories as $category){ + $read= $read || preg_match('/r/', $ui->get_category_permissions($this->base, $category)); + $paste= $paste || $ui->is_pasteable($this->base, $category) == 1; + } + + + // Draw entries that allow copy and cut + if($read){ + + // Copy entry + if($copy){ + $result.= " "._("Copy")."
  • "; + $separator= ""; + } + + // Cut entry + if($cut){ + $result.= " "._("Cut").""; + $separator= ""; + } + } + + // Draw entries that allow pasting entries + if($paste){ + if($this->copyPasteHandler->entries_queued()){ + $result.= " "._("Paste").""; + }else{ + $result.= " "._("Paste").""; + } + } + + return($result); + } + + + function renderCopyPasteActions($row, $dn, $category, $class, $copy= true, $cut= true) + { + // We can only provide information if we've got a copypaste handler + // instance + if(!(isset($this->copyPasteHandler) && is_object($this->copyPasteHandler))){ + return ""; + } + + // Presets + $ui = get_userinfo(); + $result = ""; + + // Render cut entries + if($cut){ + if($ui->is_cutable($dn, $category, $class)){ + $result .= ""; + }else{ + $result.=" "; + } + } + + // Render copy entries + if($copy){ + if($ui->is_copyable($dn, $category, $class)){ + $result.= ""; + }else{ + $result.=" "; + } + } + + return($result); + } + + + function renderSnapshotMenu($separator) + { + // We can only provide information if we've got a snapshot handler + // instance + if(!(isset($this->snapshotHandler) && is_object($this->snapshotHandler))){ + return ""; + } + + // Presets + $result = ""; + $ui = get_userinfo(); + + if($this->snapshotHandler->enabled() && $ui->allow_snapshot_restore($this->base, $this->module)){ + + // Check if there is something to restore + $restore= false; + foreach($this->snapshotHandler->getSnapshotBases() as $base){ + $restore= $restore || count($this->snapshotHandler->getDeletedSnapshots($base)) > 0; + } + + // Draw icons according to the restore flag + if($restore){ + $result.= " "._("Restore snapshots").""; + }else{ + $result.= " "._("Restore snapshots").""; + } + } + + return($result); + } + + + 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 + // instance + if(!(isset($this->snapshotHandler) && is_object($this->snapshotHandler))){ + return ""; + } + + // Presets + $result= ""; + $ui = get_userinfo(); + + // Only act if enabled here + if($this->snapshotHandler->enabled()){ + + // Draw restore button + if ($ui->allow_snapshot_restore($dn, $category)){ + + // Do we have snapshots for this dn? + if($this->snapshotHandler->hasSnapshots($dn)){ + $result.= ""; + } else { + $result.= " "; + } + } + + // Draw snapshot button + if($ui->allow_snapshot_create($dn, $category)){ + $result.= ""; + }else{ + $result.= " "; + } + } + + return($result); + } + + + function renderDaemonMenu($separator) + { + $result= ""; + + // If there is a daemon registered, draw the menu entries + if(class_available("DaemonEvent")){ + $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['MenuImage']." ".$event['s_Menu_Name'].""; + $separator= ""; + } + } + } + + return $result; + } + } ?>
colprops[$index]." class='list1'>".$this->renderCell($config['value'], $entry, $row)."colprops[$index]." class='list1'>".$this->renderCell($config['value'], $entry, $row)."colprops[$last+$i-1]." class='list1'> 
colprops[$index]." class='list0'>".$this->renderCell($config['value'], $entry, $row)."colprops[$index]." class='list0'>".$renderedCell."