X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-core%2Finclude%2Fclass_listing.inc;h=e66ff530847801ca0e05e62f6bbf5a9548465a8f;hb=9f97e0838b447e659085ba136e50f375e885804c;hp=e1440cfc14492088f2fd2fbae0c609a8c3eb8277;hpb=676a68a8696a1bab8fb8cce592d00995a4127421;p=gosa.git diff --git a/gosa-core/include/class_listing.inc b/gosa-core/include/class_listing.inc index e1440cfc1..e66ff5308 100644 --- a/gosa-core/include/class_listing.inc +++ b/gosa-core/include/class_listing.inc @@ -30,7 +30,6 @@ class listing { var $multiSelect= false; var $template; var $headline; - var $module; var $base; var $sortDirection= null; var $sortColumn= null; @@ -42,6 +41,7 @@ class listing { var $header= array(); var $colprops= array(); var $filters= array(); + var $filter= null; var $pid; var $objectTypes= array(); var $objectTypeCount= array(); @@ -52,6 +52,8 @@ class listing { var $exportColumns= array(); var $useSpan= false; var $height= 0; + var $scrollPosition= 0; + var $baseSelector; function listing($filename) @@ -95,6 +97,9 @@ class listing { } } } + + // Instanciate base selector + $this->baseSelector= new baseSelector($this->bases, $this->base); } @@ -171,7 +176,7 @@ class listing { 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']; + $this->categories[]= $otype['category']; } } } @@ -182,9 +187,8 @@ class listing { // Prepare table headers $this->renderHeader(); - // Assign headline/module + // Assign headline/Categories $this->headline= _($this->xmlData['definition']['label']); - $this->module= $this->xmlData['definition']['module']; if (!is_array($this->categories)){ $this->categories= array($this->categories); } @@ -267,25 +271,21 @@ class listing { // Some browsers don't have the ability do do scrollable table bodies, filter them // here. $switch= false; - if (preg_match('/(Opera|Konqueror|Safari|msie)/i', $_SERVER['HTTP_USER_AGENT'])){ + if (preg_match('/(Opera|Konqueror|Safari)/i', $_SERVER['HTTP_USER_AGENT'])){ $switch= true; } // Initialize list $result= "\n"; + $result.= "\n"; $height= 450; if ($this->height != 0) { $result.= "\n"; $height= $this->height; } - $result.= ""; + $result.= "
\n"; - - $height= ""; - if ($switch){ - $height= "height:100%;"; - } - $result.= "\n"; + $result.= "
\n"; + $result.= "
\n"; $this->numColumns= count($this->colprops) + ($this->multiSelect?1:0); // Build list header @@ -380,10 +380,10 @@ class listing { // 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"; + $alt++; } // Need to fill the list if it's not full (nobody knows why this is 22 ;-)) @@ -398,18 +398,18 @@ class listing { if ($i != $this->numColumns-1) { $result.= ""; } else { - $result.= ""; + $result.= ""; } } $result.= ""; } // Close list body - $result.= "
   
"; // Add the footer if requested if ($this->showFooter) { - $result.= ""; + $result.= "
"; foreach ($this->objectTypes as $objectType) { if (isset($this->objectTypeCount[$objectType['label']])) { @@ -418,13 +418,18 @@ class listing { } } - $result.= ""; + $result.= "
"; } // Close list - $result.= ""; $result.= $switch?"":""; + // Add scroll positioner + $result.= ''; + $smarty= get_smarty(); $smarty->assign("usePrototype", "true"); $smarty->assign("FILTER", $this->filter->render()); @@ -447,7 +452,15 @@ class listing { // Assign summary $smarty->assign("HEADLINE", $this->headline); - return ($smarty->fetch(get_template_path($this->xmlData['definition']['template'], true))); + // 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']); + } + + return ($smarty->fetch($file)); } @@ -456,92 +469,114 @@ class listing { global $config; $ui= get_userinfo(); + // Take care of base selector + if ($this->baseMode) { + $this->baseSelector->update(); + // Check if a wrong base was supplied + if(!$this->baseSelector->checkLastBaseUpdate()){ + msg_dialog::display(_("Error"), msgPool::check_base(), ERROR_DIALOG); + } + } + + // Save base + $refresh= false; + if ($this->baseMode) { + $this->base= $this->baseSelector->getBase(); + session::global_set("CurrentMainBase", $this->base); + $refresh= true; + } + + // 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) { - return; - } + if($refresh || !(isset($_REQUEST['PID']) && $_REQUEST['PID'] != $this->pid)) { - // Save 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); + // Save position if set + if (isset($_POST['position_'.$this->pid]) && is_numeric($_POST['position_'.$this->pid])) { + $this->scrollPosition= $_POST['position_'.$this->pid]; } - } - // Override the base if we got a message from the browser navigation - if ($this->departmentBrowser && isset($_GET['act'])) { - if (preg_match('/^department_([0-9]+)$/', validate($_GET['act']), $match)){ - if (isset($this->departments[$match[1]])){ - $this->base= $this->departments[$match[1]]['dn']; - session::global_set("CurrentMainBase", $this->base); + // Override the base if we got a message from the browser navigation + if ($this->departmentBrowser && isset($_GET['act'])) { + if (preg_match('/^department_([0-9]+)$/', validate($_GET['act']), $match)){ + if (isset($this->departments[$match[1]])){ + $this->base= $this->departments[$match[1]]['dn']; + if ($this->baseMode) { + $this->baseSelector->setBase($this->base); + } + session::global_set("CurrentMainBase", $this->base); + } } } - } - // 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; + // 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']); } - $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']); - if (preg_match('/^SORT_([0-9]+)$/', $key, $match)) { - // Switch to new column or invert search order? - $column= $match[1]; - if ($this->sortColumn != $column) { - $this->sortColumn= $column; - } else { - $this->sortDirection[$column]= !$this->sortDirection[$column]; - } + // Filter GET with "act" attributes + if (isset($_GET['act'])) { + $key= validate($_GET['act']); + if (preg_match('/^SORT_([0-9]+)$/', $key, $match)) { + // Switch to new column or invert search order? + $column= $match[1]; + if ($this->sortColumn != $column) { + $this->sortColumn= $column; + } else { + $this->sortDirection[$column]= !$this->sortDirection[$column]; + } - // Allow header to update itself according to the new sort settings - $this->renderHeader(); + // Allow header to update itself according to the new sort settings + $this->renderHeader(); + } } - } - // Override base if we got signals from the navigation elements - $action= ""; - foreach ($_POST as $key => $value) { - if (preg_match('/^(ROOT|BACK|HOME)_x$/', $key, $match)) { - $action= $match[1]; - break; + // Override base if we got signals from the navigation elements + $action= ""; + foreach ($_POST as $key => $value) { + if (preg_match('/^(ROOT|BACK|HOME)_x$/', $key, $match)) { + $action= $match[1]; + break; + } } - } - // Navigation handling - if ($action == 'ROOT') { - $deps= $ui->get_module_departments($this->module); - $this->base= $deps[0]; - } - if ($action == 'BACK') { - $deps= $ui->get_module_departments($this->module); - $base= preg_replace("/^[^,]+,/", "", $this->base); - if(in_array_ics($base, $deps)){ - $this->base= $base; + // Navigation handling + if ($action == 'ROOT') { + $deps= $ui->get_module_departments($this->categories); + $this->base= $deps[0]; + $this->baseSelector->setBase($this->base); + session::global_set("CurrentMainBase", $this->base); + } + if ($action == 'BACK') { + $deps= $ui->get_module_departments($this->categories); + $base= preg_replace("/^[^,]+,/", "", $this->base); + if(in_array_ics($base, $deps)){ + $this->base= $base; + $this->baseSelector->setBase($this->base); + session::global_set("CurrentMainBase", $this->base); + } + } + if ($action == 'HOME') { + $ui= get_userinfo(); + $this->base= get_base_from_people($ui->dn); + $this->baseSelector->setBase($this->base); + session::global_set("CurrentMainBase", $this->base); } - } - if ($action == 'HOME') { - $ui= get_userinfo(); - $this->base= $this->filter->getObjectBase($ui->dn); } // Reload departments @@ -552,12 +587,20 @@ class listing { // Update filter and refresh entries $this->filter->setBase($this->base); $this->entries= $this->filter->query(); + + // Fix filter if querie returns NULL + if ($this->entries == null) { + $this->entries= array(); + } } function setBase($base) { $this->base= $base; + if ($this->baseMode) { + $this->baseSelector->setBase($this->base); + } } @@ -572,12 +615,12 @@ class listing { $result= array(); $layout= preg_replace("/^\|/", "", $layout); $layout= preg_replace("/\|$/", "", $layout); - $cols= split("\|", $layout); + $cols= explode("|", $layout); foreach ($cols as $index => $config) { if ($config != "") { $res= ""; - $components= split(';', $config); + $components= explode(';', $config); foreach ($components as $part) { if (preg_match("/^r$/", $part)) { $res.= "text-align:right;"; @@ -602,15 +645,18 @@ class listing { $res.= "min-width:200px;"; } - $result[$index]= " style='$res' "; + $result[$index]= " style='$res'"; } else { - $result[$index]= " style='min-width:100px'"; + $result[$index]= " style='min-width:100px;'"; } } // Save number of columns for later use $this->numColumns= count($cols); + // Add no border to the last column + $result[$this->numColumns-1]= preg_replace("/'$/", "border-right:0;'", $result[$this->numColumns-1]); + return $result; } @@ -646,35 +692,7 @@ class listing { return; } - $result= ""; - - // Reset the currently used base to the first DN we found if there - // was no match. - if(!$found){ - $this->base = $firstDN; - } - - return $result; + return $this->baseSelector->render(); } @@ -821,14 +839,14 @@ class listing { $actions= $this->xmlData['actiontriggers']['action']; foreach($actions as $action) { // Skip the entry completely if there's no permission to execute it - if (!$this->hasActionPermission($action, $dn)) { + if (!$this->hasActionPermission($action, $dn, $classes)) { $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']); + list($fa, $fv)= explode('=', $action['filter']); if (preg_match('/^(.*)!$/', $fa, $m)){ $fa= $m[1]; if (isset($this->entries[$row][$fa]) && $this->entries[$row][$fa][0] == $fv) { @@ -854,11 +872,16 @@ class listing { $result.= " "; continue; } - } else { + } elseif (is_string($objectclass)) { if(!in_array($objectclass, $classes)) { $result.= " "; continue; } + } elseif (is_array($objectclass)) { + if(count(array_intersect($objectclass, $classes)) != count($objectclass)){ + $result.= " "; + continue; + } } } @@ -945,7 +968,7 @@ class listing { $ui = get_userinfo(); /* Check if base = first available base */ - $deps = $ui->get_module_departments($this->module); + $deps = $ui->get_module_departments($this->categories); if(!count($deps) || $deps[0] == $this->filter->base){ $enableBack = false; @@ -955,7 +978,7 @@ class listing { $listhead =""; /* Check if we are in users home department */ - if(!count($deps) || $this->filter->base == $this->filter->getObjectBase($ui->dn)){ + if(!count($deps) || $this->filter->base == get_base_from_people($ui->dn)){ $enableHome = false; } @@ -998,6 +1021,11 @@ class listing { return; } + // Save position if set + if (isset($_POST['position_'.$this->pid]) && is_numeric($_POST['position_'.$this->pid])) { + $this->scrollPosition= $_POST['position_'.$this->pid]; + } + $result= array("targets" => array(), "action" => ""); // Filter GET with "act" attributes @@ -1146,7 +1174,9 @@ class listing { // Check for special types switch ($action['type']) { case 'copypaste': - $result.= $this->renderCopyPasteMenu($separator); + $cut = !isset($action['cut']) || $action['cut'] != "false"; + $copy = !isset($action['copy']) || $action['copy'] != "false"; + $result.= $this->renderCopyPasteMenu($separator, $copy , $cut); break; case 'snapshot': @@ -1170,7 +1200,7 @@ class listing { } - function hasActionPermission($action, $dn) + function hasActionPermission($action, $dn, $classes= null) { $ui= get_userinfo(); @@ -1182,9 +1212,15 @@ class listing { // Every ACL has to pass foreach ($acls as $acl) { - $module= $this->module; + $module= $this->categories; $aclList= array(); + // Replace %acl if available + if ($classes) { + $otype= $this->getObjectType($this->objectTypes, $classes); + $acl= str_replace('%acl', $otype['category']."/".$otype['class'], $acl); + } + // Split for category and plugins if needed // match for "[rw]" style entries if (preg_match('/^\[([rwcdm]+)\]$/', $acl, $match)){ @@ -1206,7 +1242,7 @@ class listing { // match "users/user[userPassword:rw(,...)*]" style entries if (preg_match('/^([a-zA-Z0-9]+\/[a-zA-Z0-9]+)\[([a-zA-Z0-9]+:[rwcdm]+(,[a-zA-Z0-9]+:[rwcdm]+)*)\]$/', $acl, $match)){ $module= $match[1]; - $aclList= split(',', $match[2]); + $aclList= explode(',', $match[2]); } // Walk thru prepared ACL by using $module @@ -1214,7 +1250,7 @@ class listing { $checkAcl= ""; // Category or detailed permission? - if (strpos('/', $module) === false) { + if (strpos($module, '/') !== false) { if (preg_match('/([a-zA-Z0-9]+):([rwcdm]+)/', $sAcl, $m) ) { $checkAcl= $ui->get_permissions($dn, $module, $m[1]); $sAcl= $m[2]; @@ -1249,7 +1285,7 @@ class listing { // Do some array munching to get it user friendly $ids= $config->idepartments; - $d= $ui->get_module_departments($this->module); + $d= $ui->get_module_departments($this->categories); $k_ids= array_keys($ids); $deps= array_intersect($d,$k_ids); @@ -1258,6 +1294,11 @@ class listing { foreach($k_ids as $department){ $this->bases[$department] = $ids[$department]; } + + // Populate base selector if already present + if ($this->baseSelector && $this->baseMode) { + $this->baseSelector->setBases($this->bases); + } } @@ -1270,7 +1311,7 @@ class listing { $types = departmentManagement::get_support_departments(); // Load departments allowed by ACL - $validDepartments = $ui->get_module_departments($this->module); + $validDepartments = $ui->get_module_departments($this->categories); // Build filter and look in the LDAP for possible sub departments // of current base @@ -1281,7 +1322,7 @@ class listing { $attrs[]= $data['ATTR']; } $filter.= "))"; - $res= get_list($filter, $this->module, $this->base, $attrs, GL_NONE); + $res= get_list($filter, $this->categories, $this->base, $attrs, GL_NONE); // Analyze list of departments foreach ($res as $department) { @@ -1404,7 +1445,7 @@ class listing { $result = ""; $ui = get_userinfo(); - if($this->snapshotHandler->enabled() && $ui->allow_snapshot_restore($this->base, $this->module)){ + if($this->snapshotHandler->enabled() && $ui->allow_snapshot_restore($this->base, $this->categories)){ // Check if there is something to restore $restore= false; @@ -1516,6 +1557,12 @@ class listing { } + function getEntries() + { + return $this->entries; + } + + function getType($dn) { if (isset($this->objectDnMapping[$dn])) {