X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-core%2Finclude%2Fclass_pluglist.inc;h=0f89f3b611bb05aeda5ba7c67a386a0236578d9b;hb=e1e757ca6816d818fa1a393b66f165ffefb1afe7;hp=528052a875c054e5d28e3f98bd51f356a48c0b1e;hpb=2f273f267f9eba92c28466c197859bf9e9945a95;p=gosa.git diff --git a/gosa-core/include/class_pluglist.inc b/gosa-core/include/class_pluglist.inc index 528052a87..0f89f3b61 100644 --- a/gosa-core/include/class_pluglist.inc +++ b/gosa-core/include/class_pluglist.inc @@ -20,31 +20,47 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -class pluglist { - var $index= 0; - var $menu= ""; - var $iconmenu= ""; - var $menuparts= array(); - var $config= NULL; - var $dirlist= array(); - var $ui= NULL; - var $current= ""; - var $info= array(); - var $headlines = array(); - var $allowed_plugins = array(); - var $silly_cache= array(); - - function pluglist(&$config, &$ui) - { - $this->ui= &$ui; - $this->config= &$config; - - /* Create dirlist for all plugins */ - $this->dirlist= $this->get_plugins ($this->dirlist, $this->config->data['MENU']); +class pluglist +{ + // The id of the last registered plugin id + var $index= 0; + + var $config= NULL; + var $ui= NULL; + + // Contains a list of the paths for all registered plugins. + var $dirlist= array(); + + // Seems to be used in the help menu to generate an overview. + var $headlines = array(); + // Remember stuff in here. + var $silly_cache= array(); + + // The pluglist keeps track of all registered plugins. + // (Registered plugins are those we are able to access) + var $pluginList = array(); + + // Some cache vars to avoid regenration of the menus. + var $pathMenu = ""; + var $menu= ""; + var $iconmenu= ""; + + // Classes plInfo list + var $info = array(); + + function pluglist(&$config, &$ui) + { + $this->ui= &$ui; + $this->config= &$config; + $this->loadPluginList(); + } + + function loadPluginList() + { + $this->pluginList = array(); /* Fill info part of pluglist */ $classes= get_declared_classes(); - foreach ($classes as $cname){ $cmethods = get_class_methods($cname); if (in_array_ics('plInfo',$cmethods)){ @@ -52,359 +68,336 @@ class pluglist { } } - /* Provide field for 'all' */ - $this->info['all']= array(); - $this->info['all']['plProvidedAcls']= array(); - $this->info['all']['plDescription']= _("All objects in this category"); - $this->info['all']['plSelfModify']= FALSE; - } - - function get_plugins($list, &$config) - { - global $class_mapping; - - if (!isset($config['CLASS'])){ - if (is_array($config)){ - foreach ($config as $val){ - $list= $this->get_plugins($list, $val); - } - } - } else { - if (is_array($config) && isset($class_mapping[$config['CLASS']])){ - $list[$this->index++]= dirname($class_mapping[$config['CLASS']]); - } else { - $list[$this->index++]= ""; - } - } - - return ($list); - } + if(!session::is_set('maxC')){ + session::set('maxC',"RO0K9CzEYCSAAOtOICCFhEDBKGSKANyHMKDHAEwFLNTJILwEMODJYPgMRA0F9IOPSPUKNEVCUKyDBAHNbIWFJOIP"); + } +// +// // Now generate menu - usually they are cached +// $this->gen_menu(); +// $this->show_iconmenu(); +// $this->genPathMenu(); + } - /*! \brief Check whether we are allowed to modify the given acl or not.. - This function is used to check which plugins are visible. - - @param The acl tag to test, eg. "users/user:self", "systems", ... - @return Boolean TRUE on success else FALSE - */ - function check_access($aclname) - { - if (isset($this->silly_cache[$aclname])) { - return $this->silly_cache[$aclname]; - } + /*! \brief Tries to register a plugin in the pluglist + * Checks existence and ACL for the given plugin. + * Returns true in case of success else false. + */ + function registerPlugin($plug) + { + global $class_mapping; + + if (!isset($plug['CLASS'])){ + msg_dialog::display( + _("Configuration error"), + _("The configuration format has changed: please run the setup again!"), + FATAL_ERROR_DIALOG); + exit(); + } + if (!plugin_available($plug['CLASS'])){ + return(FALSE); + } + if (!$this->check_access($plug['ACL'])){ + return(FALSE); + } + $this->dirlist[$this->index] = dirname($class_mapping[$plug['CLASS']]); + $this->pluginList[$this->index] = $plug['CLASS']; + $this->index++; + return(TRUE); + } - /* Split given acl string into an array. - e.g. "user,systems" => array("users","systems"); - */ - $acls_to_check = array(); - if(preg_match("/,/",$aclname)){ - $acls_to_check = split(",",$aclname); - }else{ - $acls_to_check = array($aclname); - } - foreach($acls_to_check as $acl_to_check){ + /*! \brief Check whether we are allowed to modify the given acl or not.. + * This function is used to check which plugins are visible. + * + * @param The acl tag to check for, eg. "users/user:self", "systems", ... + * @return Boolean TRUE on success else FALSE + */ + function check_access($aclname) + { + if (isset($this->silly_cache[$aclname])) { + return $this->silly_cache[$aclname]; + } + + // Split given acl string into an array. e.g. "user,systems" => array("users","systems"); + $acls_to_check = array(); + if(preg_match("/,/",$aclname)){ + $acls_to_check = explode(",",$aclname); + }else{ + $acls_to_check = array($aclname); + } + + foreach($acls_to_check as $acl_to_check){ $acl_to_check = trim($acl_to_check); - - /* Check if the given acl tag is only valid for self acl entries - ui->get_permissions($this->ui->dn,$acl_to_check,"") != ""){ - $this->silly_cache[$aclname]= TRUE; - return(TRUE); - } - $this->silly_cache[$aclname]= FALSE; - return(FALSE); - }else{ - - /* No self acls. Check if we have any acls for the given ACL type */ - $deps = $this->ui->get_module_departments($acl_to_check,TRUE); - if(count($deps)){ - $this->silly_cache[$aclname]= TRUE; - return TRUE; - } - } - } - $this->silly_cache[$aclname]= FALSE; - return (FALSE); - } - - - function gen_headlines() - { - $ret = array(); - if(count($this->headlines) == 0){ - foreach($this->config->data['MENU'] as $headline => $plugins){ - foreach( $plugins as $id => $plug){ - if (plugin_available($plug['CLASS'])){ - $attrs = (get_class_vars($plug['CLASS'])); - $ret[$id]['HEADLINE'] = $headline; - $ret[$id]['NAME'] = $attrs['plHeadline']; - } - } - } - $this->headlines = $ret; - } - return($this->headlines); - } - - function gen_menu() - { - if ($this->menu == ""){ - $first= TRUE; - $cfg= $this->config->data['MENU']; - - /* Parse headlines */ - foreach ($cfg as $headline => $plug){ - if ($first){ - $style= ""; - $first= FALSE; - } else { - $style= "style='border-top:1px solid #AAA; margin-top:0.8em;'"; - } - $menu= "

"._($headline)."

\n"; - $entries= ""; - $this->menuparts[_($headline)]= array(); - - /* Parse sub-plugins */ - foreach ($plug as $info){ - - /* Read information from class variable */ - if (!isset($info['CLASS'])){ - msg_dialog::display( - _("Configuration error"), - _("The configuration format has changed. Please re-run setup!"), - FATAL_ERROR_DIALOG); - exit(); - } - if (!plugin_available($info['CLASS'])){ - continue; - } - $vars= get_class_vars($info['CLASS']); - if (isset($info['NAME'])){ - $plHeadline= _($info['NAME']); - } else { - $plHeadline= $vars['plHeadline']; - } - $plDescription= $vars['plDescription']; - - $index= $this->get_index($info['CLASS']); - $href= "main.php?plug=$index&reset=1"; - - if(!$vars){ - $plHeadline = _("Unknown"); - $plDescription = _("Unknown"); - $href= "main.php?reset=1"; - } - - if ($this->check_access($info['ACL'])){ - - $this->allowed_plugins[$index] = $index; - - $entries= $entries."

"; - if(session::global_get('js')){ - $entries.= _($plHeadline)."

\n"; - } else { - $entries.= "". - _($plHeadline)."

\n"; - } - - if(!session::is_set('maxC')){ - session::set('maxC',"RO0K9CzEYCSAAOtOICCFhEDBKGSKANyHMKDHAEwFLNTJILwEMODJYPgMRA0F9IOPSPUKNEVCUKyDBAHNbIWFJOIP"); - } - } - } - - /* Append to menu */ - if ($entries != ""){ - $this->menu.= $menu.$entries; - } - } + /* Check if the given acl tag is only valid for self acl entries + * ui->get_permissions($this->ui->dn,$acl_to_check,"") != ""){ + $this->silly_cache[$aclname]= TRUE; + return(TRUE); + } + }else{ + if($this->ui->get_category_permissions($this->ui->dn,$acl_to_check,"") != ""){ + $this->silly_cache[$aclname]= TRUE; + return(TRUE); + } + } + }else{ + + // No self acls. Check if we have any acls for the given ACL type + $deps = $this->ui->get_module_departments($acl_to_check,TRUE); + if(count($deps)){ + $this->silly_cache[$aclname]= TRUE; + return TRUE; + } + } + } + + $this->silly_cache[$aclname]= FALSE; + return (FALSE); + } - } - /* Write menu output */ - return ($this->menu); - } - function gen_current() - { - /* Do we have a current value? */ - if ($this->current == ""){ - $tmp= array_keys($this->menuparts); - $this->current= $tmp[0]; - } + /*! \brief Generate the GOsa Main-Menu here (The menu on the left), + * this usually only done once during login. + * ----------------------------------------------------------------- + * Do NOT add style changes here manually, use the style.css or + * if you prefer create your own theme!! + * ----------------------------------------------------------------- + */ + function gen_menu() + { + if ($this->menu == ""){ + + // First load the menu plugins and try to register them in the pluglist + // if this fails for some reason, then remove the plugin from the menu. + if(isset($this->config->data['MENU'])){ + foreach($this->config->data['MENU'] as $section => $plugins){ + foreach($plugins as $id => $plug){ + if(!$this->registerPlugin($plug)){ + unset($this->config->data['MENU'][$section][$id]); + } + } + } + } + + $cfg= $this->config->data['MENU']; + $menu = "\n \n"; + $this->menu = $menu; + + // Add javascript method to print out warning messages while leaving an unsaved form. + // We do it in here to get the string translated. + $this->menu .= + "\n \n"; + } + + // Use javascript to mark the currently selected plugin. + $menu = $this->menu; + if(isset($_GET['plug'])){ + $menu.= + "\n \n"; + } + + // Return the generated/cached gosa menu. + return ($menu); + } - /* Fill current array */ - $result= ""; - $count= 0; - foreach ($this->menuparts[$this->current] as $entry){ - if ($count == 2){ - $result.= ""; - $count= 0; - } - if ($count == 0){ - $result.= ""; - } - $result.= ""; - $count++; - } - /* Add missing cell? */ - if ($count == 1){ - $result.= ""; - } + /*! \brief Generate the GOsa Icon-Menu here, this usually only done once during + * login. + * ----------------------------------------------------------------- + * Do NOT add style changes here manually, use the style.css or + * if you prefer create your own theme!! + * ----------------------------------------------------------------- + */ + function show_iconmenu() + { + $add_hr =FALSE; + $this->iconmenu = ""; + if ($this->iconmenu == ""){ - $result.= "
$entry 
"; - return $result; - } + $cfg= $this->config->data['MENU']; + foreach ($cfg as $headline => $plug){ + $col= 0; + $this->iconmenu .= "\n
"; + if($add_hr){ + $add_hr = FALSE; + $this->iconmenu .= "\n
"; + } + $this->iconmenu .= "\n

". _($headline)."

"; - function show_iconmenu() - { - global $class_mapping; - if ($this->iconmenu == ""){ - $cfg= $this->config->data['MENU']; + foreach ($plug as $info){ - if (isset($this->config->current['ICONSIZE'])){ - list($x, $y)= split("x", $this->config->get_cfg_value("iconsize")); - $isize= "width=\"$x\" height=\"$y\""; - } else { - $isize= ""; - } + // Get Plugin info + list($index, $title, $desc, $icon) = $this->getPlugData($info['CLASS']); - /* Parse headlines */ - foreach ($cfg as $headline => $plug){ - $col= 1; - $menu= "

". - _($headline)."

\n\n\n"; - $entries= ""; - - foreach ($plug as $info){ - - if (!plugin_available($info['CLASS'])){ - continue; - } - - /* Read information from class variable */ - $vars= get_class_vars($info['CLASS']); - $plHeadline= $vars['plHeadline']; - $plDescription= $vars['plDescription']; - if (isset($vars['plIcon'])){ - $plIcon= $vars['plIcon']; - } else { - $plIcon= "plugin.png"; + // Add a seperating row + if (($col % 4) == 0){ + $this->iconmenu .= "\n
"; } - $index= $this->get_index($info['CLASS']); - - $href = "main.php?plug=".$index."&reset=1"; - - /* Check if class is available. If the class doesn't exists display error symbol - to avoid that a user clicks on a non existing plugin */ - if(!$vars){ - $plHeadline = $plDescription = _("Unknown"); - $info['ICON'] = "error.png"; - $href="main.php?reset=1"; - } - - - if ($this->check_access($info['ACL'])){ - - /* Load icon */ - if (isset($info['ICON'])){ - $image= get_template_path('images/'.$info['ICON']); - } else { - if(!preg_match("/\//",$plIcon)){ - $image= get_template_path("plugins/".preg_replace('%^.*/([^/]+)/[^/]+$%', '\1', $class_mapping[$info['CLASS']])."/images/$plIcon"); - }else{ - $image = $plIcon; - } - } - if ($col > 5){ - $entries= $entries.""; - $col = 1; - } - $entries= $entries."\n"; - $col++ ; - - } - } - - /* Append to menu */ - if ($entries != ""){ - $this->iconmenu.= $menu.$entries; - - /* Fill up remaining columns */ - if ($col != 1){ - $col--; - while ($col % 5){ - $this->iconmenu= $this->iconmenu. - "\n"; - $col++; - } - } - - /* close table */ - $this->iconmenu= $this->iconmenu."\n
"; - if(session::global_get('js')){ - $entries.= "\"*\" ". - _($plHeadline); - } else { - $entries.= "". - "\"*\" ". - _($plHeadline).""; - } - $entries.= " 
\n"; - } - } + $this->iconmenu.= "\n
"; + $this->iconmenu.= "\n ".image($icon); + $this->iconmenu.= "\n
"; + $this->iconmenu.= "\n

{$title}

"; + $this->iconmenu.= "\n

{$desc}

"; + $this->iconmenu.= "\n
"; + $this->iconmenu.= "\n
"; + $col++ ; + } + $add_hr = TRUE; + } + } + return ($this->iconmenu); + } - } - /* Write menu output */ - return ($this->iconmenu); - } + /*! \brieg Generates and the path menu (the one on the upper right) and keeps + * the generated HTML content, so we are not forced to generate it on every + * page request. + * (See of your gosa.conf) + */ + function genPathMenu() + { + if(empty($this->pathMenu)){ + + // Now load the path menu and try to register the plugins in the pluglist + // if this fails for some reason, then remove the plugin from the menu. + if(isset($this->config->data['PATHMENU'])){ + foreach($this->config->data['PATHMENU'] as $id => $plugin){ + if(!$this->registerPlugin($plugin)){ + unset($this->config->data['PATHMENU'][$id]); + } + } + } + + $this->pathMenu = + "\n
". + "\n
    ". + "\n
  • ". + "\n ".image(get_template_path("images/home.png")). + "\n
  • ". + "\n %navigator%"; + + // Check if we've at least one entry defined ih the pathmenu + if(isset($this->config->data['PATHMENU'])){ + $cfg= &$this->config->data['PATHMENU']; + $rcfg = array_reverse($cfg); + foreach($rcfg as $id => $plug){ + list($index, $title, $desc, $icon) = $this->getPlugData($plug['CLASS']); + $this->pathMenu.= "\n
  • {$title}
  • "; + } + } + $this->pathMenu.= "\n
"; + $this->pathMenu.= "\n
"; + } + + $menu = pathNavigator::getCurrentPath(); + return(preg_replace("/%navigator%/", $menu, $this->pathMenu)); + } + + + /*! \brief Returns additional info for a given class name, like + * plugin-icon, title, description and the index of the element + in the pluglist which uses this class. + */ + function getPlugData($class) + { + global $class_mapping; + $vars= get_class_vars($class); + $plHeadline= _($vars['plHeadline']); + $plDescription= _($vars['plDescription']); + $plIcon = (isset($vars['plIcon'])) ? $vars['plIcon']: "plugin.png"; + $index= $this->get_index($class); + + /* Check if class is available. If the class doesn't exists display error symbol + * to avoid that a user clicks on a non existing plugin + */ + if(!$vars){ + $plHeadline = $plDescription = _("Unknown"); + $plIcon = "error.png"; + $index = ''; + } + + // Detect the correct position of the plugin icon + if(!preg_match("/\//",$plIcon)){ + $image= get_template_path("plugins/".preg_replace('%^.*/([^/]+)/[^/]+$%', '\1', + $class_mapping[$class])."/images/$plIcon"); + }else{ + $image = $plIcon; + } + return(array($index, $plHeadline, $plDescription, $image)); + } + + + /*! \brief Returns the installation path of a plugin. + * e.g. '../plugins/admin/mimetypes' + */ + function get_path($index) + { + if(!isset($this->dirlist[$index])){ + return (""); + } + return ("../".$this->dirlist[$index]); + } + + + /*! \brief Returns the plugins id for a given class. + */ + function get_index($class) + { + return (array_search($class, $this->pluginList)); + } - function get_path($index) - { - if(!isset($this->dirlist[$index])){ - return (""); - } - return ("../".$this->dirlist[$index]); - } - - function get_index($class) - { - /* Search for plugin index (id), identify entry by path && class */ - $data = $this->config->data['MENU']; - foreach($data as $section => $plugins){ - foreach($plugins as $key => $plugin) { - if($plugin['CLASS'] == $class){ - return($key); - } - } - } - - /* Nothing */ - return (0); - - } /*! \brief This function checks if we are allowed to view the plugin with the given id - @param $plug_id Integer The ID of the plugin. - @return Boolean TRUE if we are allowed to view the plugin else FASLE + * + * @param $plug_id Integer The ID of the plugin. + * @return Boolean TRUE if we are allowed to view the plugin else FASLE */ function plugin_access_allowed($plug_id) { - return(isset($this->allowed_plugins[$plug_id])); + return(isset($this->pluginList[$plug_id])); } @@ -416,6 +409,27 @@ class pluglist { $this->iconmenu =""; } + + /*! \brief Generates an array containing plugin names (headlines) and theirs ids. + * This is just used in the helpviewer.php + */ + function gen_headlines() + { + $ret = array(); + if(count($this->headlines) == 0){ + foreach($this->config->data['MENU'] as $headline => $plugins){ + foreach( $plugins as $id => $plug){ + if (plugin_available($plug['CLASS'])){ + $attrs = (get_class_vars($plug['CLASS'])); + $ret[$id]['HEADLINE'] = $headline; + $ret[$id]['NAME'] = $attrs['plHeadline']; + } + } + } + $this->headlines = $ret; + } + return($this->headlines); + } } // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: ?>