Code

Fixed layout
[gosa.git] / gosa-core / include / class_pluglist.inc
index 989a54338b84102f49003b34eed05313a45f527a..6e1c059a76836d7cd55364a359649213835cc8b2 100644 (file)
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
-class pluglist {
+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();
 
+  var $pluginList = array();
+
+  var $pathMenu = "";
+  var $menu= "";
+  var $iconmenu= "";
+
   function pluglist(&$config, &$ui)
   {
     $this->ui= &$ui;
     $this->config= &$config;
 
-    // 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']);
+    // 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;
+    
+    $this->loadPluginList();
+  }
+
+  function loadPluginList()
+  {
+    $this->pluginList = array();
 
     // Detect installed plugins and their configuration, to be able to restrict access later.
     $classes= get_declared_classes();
@@ -50,36 +63,57 @@ class pluglist {
         $this->info[$cname]= call_user_func(array($cname, 'plInfo'));
       }
     }
+    
+    // First load Menu Plugins 
+    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]); 
+          }
+        }
+      }
+    }
+    
+    // Now register pathMenu plugins
+    if(isset($this->config->data['PATHMENU'])){
+      foreach($this->config->data['PATHMENU'] as $id => $plugin){
+        if(!$this->registerPlugin($plugin)){
+          unset($this->config->data['PATHMENU'][$id]); 
+        } 
+      }
+    }
 
-    // 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");
+    }
+    $this->gen_menu();
+    $this->show_iconmenu();
+    $this->genPathMenu();
   }
 
 
-  /*! \brief    Detect plugin installation paths, by walking through the config. 
-   */
-  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 re-run setup!"),
+          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);
   }
 
 
@@ -133,38 +167,6 @@ class pluglist {
   }
 
 
-  /*! \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.
@@ -176,32 +178,25 @@ class pluglist {
   function gen_menu()
   {
     if ($this->menu == ""){
-      $this->checkMenu();
       $cfg= $this->config->data['MENU'];
       $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>";
         $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 openPlugin({$index});'>".$plHeadline."</li>";
+          $menu .=  "\n  <li id='plugMenuId_{$index}' $class onClick='return openPlugin({$index});'>".$title."</li>";
         }
         $menu.= "\n </ul>";
         $menu.= "\n <div></div>\n";
@@ -223,9 +218,21 @@ class pluglist {
       </script>
         "; 
     }
+  
+    // Use javascript to mark the currently selected plugin.
+    $menu = $this->menu;
+    if(isset($_GET['plug'])){
+      $menu.= "
+        <script language='javascript' type='text/javascript'>
+          if($('plugMenuId_".$_GET['plug']."')){
+            $('plugMenuId_".$_GET['plug']."').className= 'current'
+          }
+        </script>
+        "; 
+    }
 
     // Return the generated/cached gosa menu.
-    return ($this->menu);
+    return ($menu);
   }
 
 
@@ -238,78 +245,103 @@ class pluglist {
    */
   function show_iconmenu()
   {
-    global $class_mapping;
-
-    $this->iconmenu = "";
+    $add_hr =FALSE;
     if ($this->iconmenu == ""){
       $cfg= $this->config->data['MENU'];
-
-
       foreach ($cfg as $headline => $plug){
-        $col= 1;
+        $col= 0;
 
-       $this->iconmenu .= "\n  <div class='clear'></div>\n";
-       $this->iconmenu .= "\n  <h3>". _($headline)."</h3>\n";
+        $this->iconmenu .= "\n  <div class='clear'></div>\n";
+        if($add_hr){
+          $add_hr = FALSE;
+          $this->iconmenu .= "\n  <hr>\n";
+        }
+        $this->iconmenu .= "\n  <h3 class='icon-menu-title'>". _($headline)."</h3>\n";
 
         foreach ($plug as $info){
 
+          // Get Plugin info
+          list($index, $title, $desc, $icon) = $this->getPlugData($info['CLASS']);
 
-          /* 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";
-          }
-
-          $index= $this->get_index($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";
-          }
-
-
-          /* 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) == 0){
+          // Add a seperating row
+          if (($col % 4) == 0){ 
             $this->iconmenu .= "\n  <div class='clear'></div>\n";
-            $col = 1;
           }
 
 
-          $this->iconmenu.= 
-"
-  <div class='container-element' style='width: 25%;' onclick='alert('clicked')'> 
-   <div class='icon-menu-item' style='background-image: url(".$image.");'>
-    <h1>".$plHeadline."</h1>
-    <p>".$plDescription."</p>
-   </div>
-  </div>
-";
+          $this->iconmenu.= "\n  <div class='icon-menu-item' style='width: 25%;' onclick='openPlugin({$index})'>";
+          /* $this->iconmenu.= "\n   ".image($icon); */
+          $this->iconmenu.= "\n   <div class='img' style='width:48px;height:48px;background-image: url({$icon});'></div>";
+          $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;
       }
     }
-
-    /* Write menu output */
     return ($this->iconmenu);
   }
 
 
+  function genPathMenu()
+  {
+    if(empty($this->pathMenu)){
+      $this->pathMenu = 
+        "\n    <div class='plugin-path'>".
+        "\n     <ul class='path-navigation'>".
+        "\n      <li class='left right-border' onClick=\"openPlugin('');\">".
+        "\n       <div class='nav-home'></div>".
+        "\n      </li>".
+        "\n      <li class='left'>Welcome to GOsa</li>";
+
+      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>";
+    } 
+    return($this->pathMenu); 
+  }
+  
+
+  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'
    */
@@ -326,16 +358,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));
   }
 
 
@@ -346,7 +369,7 @@ class pluglist {
    */
   function plugin_access_allowed($plug_id)
   {
-    return(isset($this->allowed_plugins[$plug_id]));
+    return(isset($this->pluginList[$plug_id]));
   }