Code

fixed property
[gosa.git] / gosa-core / include / class_pluglist.inc
index 0cf5f9fdcbb05b118358b253e55969c68b35ff6d..0f89f3b611bb05aeda5ba7c67a386a0236578d9b 100644 (file)
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
-class pluglist {
+class pluglist 
+{
+  // The id of the last registered plugin id 
   var $index= 0;
-  var $menu= "";
-  var $iconmenu= "";
-  var $menuparts= array();
+
   var $config= NULL;
-  var $dirlist= array();
   var $ui= NULL;
-  var $current= "";
-  var $info= array();
+
+  // 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();
-  var $allowed_plugins = 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();
+  }
 
-    // Get list of plugin paths, this allows us to open the plugins main.inc if available.
-    $this->dirlist= $this->get_plugins ($this->dirlist, $this->config->data['MENU']);
+  function loadPluginList()
+  {
+    $this->pluginList = array();
 
-    // Detect installed plugins and their configuration, to be able to restrict access later.
-    $classes= get_declared_classes();
-    foreach ($classes as $cname){
-      $cmethods = get_class_methods($cname);
-      if (in_array_ics('plInfo',$cmethods)){
-        $this->info[$cname]= call_user_func(array($cname, 'plInfo'));
-      }
-    }
+               /* Fill info part of pluglist */
+               $classes= get_declared_classes();
+               foreach ($classes as $cname){
+                       $cmethods = get_class_methods($cname);
+                       if (in_array_ics('plInfo',$cmethods)){
+                               $this->info[$cname]= call_user_func(array($cname, 'plInfo'));
+                       }
+               }
 
-    // Reserve a special ACL will allows us to display plugins/addons whenever a user 
-    //  is able to login into gosa. E.g. some kind of welcome page. 
-    $this->info['all']= array();
-    $this->info['all']['plProvidedAcls']= array();
-    $this->info['all']['plDescription']= _("All objects in this category");
-    $this->info['all']['plSelfModify']= FALSE;
+    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    Detect plugin installation paths, by walking through the config. 
+  /*! \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 get_plugins($list, &$config)
+  function registerPlugin($plug)
   {
     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 (!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);
   }
 
 
@@ -111,12 +135,17 @@ class pluglist {
        */      
       if(preg_match("/:self$/",$acl_to_check)){
         $acl_to_check = preg_replace("/:self$/","",$acl_to_check);     
-        if($this->ui->get_permissions($this->ui->dn,$acl_to_check,"") != ""){
-          $this->silly_cache[$aclname]= TRUE;
-          return(TRUE);
+        if(strpos($acl_to_check,"/")){
+          if($this->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);
+          }
         }
-        $this->silly_cache[$aclname]= FALSE;
-        return(FALSE);
       }else{
 
         // No self acls. Check if we have any acls for the given ACL type 
@@ -133,60 +162,6 @@ class pluglist {
   }
 
 
-  /*! \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);
-  }
-
-
-  /*! \brief    Check the accessibility of the configured plugins.
-   *            We may simply have now permissions to access some plugins 
-   *             but some may be broken or missing!.
-   */
-  function checkMenu()
-  {
-    $cfg= &$this->config->data['MENU'];
-    foreach ($cfg as $headline => $plug){
-      $this->menuparts[_($headline)]= array();
-      foreach ($plug as $id => $info){
-        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'])){
-          unset($cfg[$headline][$id]); 
-          continue; 
-        }
-        if (!$this->check_access($info['ACL'])){
-          unset($cfg[$headline][$id]);
-          continue; 
-        }
-      }
-    }
-    if(!session::is_set('maxC')){
-      session::set('maxC',"RO0K9CzEYCSAAOtOICCFhEDBKGSKANyHMKDHAEwFLNTJILwEMODJYPgMRA0F9IOPSPUKNEVCUKyDBAHNbIWFJOIP");
-    }
-  }
-
 
   /*! \brief    Generate the GOsa Main-Menu here (The menu on the left), 
    *             this usually only done once during login.
@@ -198,48 +173,72 @@ class pluglist {
   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'];
-      $this->checkMenu();
-      $cfg= $this->config->data['MENU'];
-      $menu = "\n<div class='navigation'>";
+      $menu = "\n      <div class='navigation'>";
       foreach ($cfg as $headline => $plug){
 
         if(!count($plug)) continue;
-        $menu.= "\n<div class='menu'>";
-        $menu.= "\n <ul>";
-        $menu.= "\n  <li class='menu-header'>"._($headline)."</li>";
+
+        $menu.= "\n        <div class='menu'>";
+        $menu.= "\n          <ul>";
+        $menu.= "\n            <li class='menu-header'>"._($headline)."</li>";
         $id = 0;
         foreach ($plug as $info){
+
+          // Used to detect the last element in the menu
           $id ++;
-          $vars= get_class_vars($info['CLASS']);
-          $plHeadline = _((isset($info['NAME'])) ? $info['NAME'] : $vars['plHeadline']);
-          $plDescription= $vars['plDescription'];
-          $index= $this->get_index($info['CLASS']);
-          $href= "main.php?plug=$index&amp;reset=1";
-          if(!$vars){
-            $plHeadline        = _("Unknown");
-            $plDescription     = _("Unknown");
-            $href= "main.php?reset=1";
-          }
-          $this->allowed_plugins[$index] = $index;
+
+          list($index, $title, $desc, $icon) = $this->getPlugData($info['CLASS']);
           $class= "";
-          if($id == count($plug)) $class=" class='menu-last' \n   ";
-          $menu .=  "\n  <li $class onClick='return question(\"".
-            _("You are currently editing a database entry. Do you want to dismiss the changes?")."\", 
-            \"$href\");'>".$plHeadline."</li>";
+          if($id == count($plug)) $class=" class='menu-last' ";
+          $menu .=  "\n            <li id='plugMenuId_{$index}' $class onClick='return openPlugin({$index});'>".$title."</li>";
         }
-        $menu.= "\n </ul>";
-        $menu.= "\n <div></div>\n";
-        $menu.= "\n</div>\n";
-        $menu.= "\n<div></div>\n";
-        $menu.= "\n<div class='v-spacer'></div>\n";
+        $menu.= "\n          </ul>";
+        $menu.= "\n          <div style='font-size:0'>&nbsp;</div>";
+        $menu.= "\n        </div>\n";
+        $menu.= "\n        <div style='font-size:0'>&nbsp;</div>";
+        $menu.= "\n        <div class='v-spacer'></div>\n";
       }
-      $menu.= "\n</div>";
+      $menu.= "\n      </div>\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      <script language='javascript' type='text/javascript'>".
+        "\n        function openPlugin(id){".
+        "\n          return question(\""._("You are currently editing a database entry. Do you want to discard the changes?")."\",".
+        "\n            \"main.php?plug=\" + id + \"&amp;reset=1\");".
+        "\n        }".
+        "\n      </script>\n"; 
+    }
+  
+    // Use javascript to mark the currently selected plugin.
+    $menu = $this->menu;
+    if(isset($_GET['plug'])){
+      $menu.= 
+     "\n      <script language='javascript' type='text/javascript'>".
+     "\n        if($('plugMenuId_".$_GET['plug']."')){".
+     "\n          $('plugMenuId_".$_GET['plug']."').className= 'current'".
+     "\n        }".
+     "\n      </script>\n";
     }
 
     // Return the generated/cached gosa menu.
-    return ($this->menu);
+    return ($menu);
   }
 
 
@@ -252,111 +251,122 @@ class pluglist {
    */
   function show_iconmenu()
   {
-    global $class_mapping;
+    $add_hr =FALSE;
+    $this->iconmenu = "";
     if ($this->iconmenu == ""){
-      $cfg= $this->config->data['MENU'];
 
-      if (isset($this->config->current['ICONSIZE'])){
-        list($x, $y)= explode("x", $this->config->get_cfg_value("iconsize"));
-        $isize= "width=\"$x\" height=\"$y\"";
-      } else {
-        $isize= "";
-      }
-
-      /* Parse headlines */
+      $cfg= $this->config->data['MENU'];
       foreach ($cfg as $headline => $plug){
-        $col= 1;
-        $menu= "<h1 class=\"menuheader\">".
-          _($headline)."</h1>\n<table summary=\"\" style=\"width:100%;".
-          "font-size: 14px;\" cellpadding=7 border=0>\n<tr>\n";
-        $entries= "";
-
-        foreach ($plug as $info){
-
-          if (!plugin_available($info['CLASS'])){
-            continue;
-          }
+        $col= 0;
 
-          /* 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";
-          }
+        $this->iconmenu .= "\n        <div class='clear'></div>";
+        if($add_hr){
+          $add_hr = FALSE;
+          $this->iconmenu .= "\n        <hr>";
+        }
+        $this->iconmenu .= "\n        <h3 class='icon-menu-title'>". _($headline)."</h3>";
 
-          $index= $this->get_index($info['CLASS']);
+        foreach ($plug as $info){
 
-          $href = "main.php?plug=".$index."&amp;reset=1";
+          // Get Plugin info
+          list($index, $title, $desc, $icon) = $this->getPlugData($info['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");
-            $info['ICON'] = "error.png";
-            $href="main.php?reset=1";
+          // Add a seperating row
+          if (($col % 4) == 0){ 
+            $this->iconmenu .= "\n        <div class='clear'></div>";
           }
 
-
-          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."</tr><tr>";
-              $col = 1;
-            }
-            $entries= $entries."<td class=\"iconmenu\" style=\"width:20%;\" onClick='location.href=\"".$href."\"'".
-              ">";
-            if(session::global_get('js')){
-              $entries.= "<img $isize border=0 align=middle src=\"$image".
-                "\" alt=\"*\">&nbsp;".
-                _($plHeadline);
-            } else {
-              $entries.= "<a class=\"iconmenu\" href=\"".$href."\">".
-                "<img $isize border=0 align=middle src=\"$image".
-                "\" alt=\"*\">&nbsp;".
-                _($plHeadline)."</a>";
-            }
-            $entries.= "</td>\n";
-            $col++ ;
-
-          }
+          $this->iconmenu.= "\n        <div class='icon-menu-item' style='width: 25%;' onclick='openPlugin({$index})'>";
+          $this->iconmenu.= "\n          ".image($icon);
+          $this->iconmenu.= "\n          <div class='dsc'>";
+          $this->iconmenu.= "\n            <h1>{$title}</h1>";
+          $this->iconmenu.= "\n            <p>{$desc}</p>";
+          $this->iconmenu.= "\n          </div>";
+          $this->iconmenu.= "\n        </div>";
+          $col++ ;
         }
+        $add_hr = TRUE;
+      }
+    }
+    return ($this->iconmenu);
+  }
 
-        /* Append to menu */
-        if ($entries != ""){
-          $this->iconmenu.= $menu.$entries;
-
-          /* Fill up remaining columns */
-          if ($col != 1){
-            $col--;
-            while ($col % 5){
-              $this->iconmenu= $this->iconmenu.
-                "<td style=\"width:20%\">&nbsp;</td>\n";
-              $col++;
-            }
-          }
 
-          /* close table */
-          $this->iconmenu= $this->iconmenu."</tr>\n</table>\n";
+  /*! \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 <pathMenu> 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        <div class='plugin-path'>".
+        "\n          <ul class='path-navigation'>".
+        "\n            <li class='left' onClick=\"openPlugin('');\" title='"._("Back to main menu")."'>".
+        "\n              ".image(get_template_path("images/home.png")).
+        "\n            </li>".
+        "\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            <li class='right left-border' onClick='openPlugin({$index})'>{$title}</li>";
+        }
+      }
+      $this->pathMenu.= "\n          </ul>";
+      $this->pathMenu.= "\n        </div>";
     }
 
-    /* Write menu output */
-    return ($this->iconmenu);
+    $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));
   }
 
 
@@ -368,7 +378,6 @@ class pluglist {
     if(!isset($this->dirlist[$index])){
       return ("");
     }
-    echo "../".$this->dirlist[$index];
     return ("../".$this->dirlist[$index]);
   }
 
@@ -377,16 +386,7 @@ class pluglist {
    */
   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);
-        }
-      }
-    }
-    return (0);
+    return (array_search($class, $this->pluginList));
   }
 
 
@@ -397,7 +397,7 @@ class pluglist {
    */
   function plugin_access_allowed($plug_id)
   {
-    return(isset($this->allowed_plugins[$plug_id]));
+    return(isset($this->pluginList[$plug_id]));
   }
 
 
@@ -409,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:
 ?>