Code

Removed debug content.
[gosa.git] / include / class_ObjectListViewport.inc
index 09cdc47f852e714cacfc4e82248e3b1d30e2be9f..8de6494ce09d4bcac183b61632881e280edefa25 100644 (file)
@@ -23,15 +23,23 @@ class ObjectListViewportException extends Exception {
 
     \sa ObjectList
  */
-class ObjectListViewport {
+class ObjectListViewport implements GOsaGuiElement {
+
+  /* Internal variable for color alternation */
+  protected $colorAlternator= 0;
 
-  /* Dummy here ----> */
   private $headline;
   private $footer;
   private $entryFormat;
+
+  /* Dummy here ----> */
   private $attributes= array('cn', '_icon', '_actions', 'dn');
   /* <---- Dummy here */
 
+  private $displayHeaderFlag= TRUE;
+  private $displayFooterFlag= TRUE;
+  private $numberOfCols= 0;
+
   /*!
     \brief Container for objects
 
@@ -39,26 +47,43 @@ class ObjectListViewport {
    */
        private $objects;
 
+  /*!
+    \brief Switch to handle multiselect or not
+   */
+       private $multiselect;
 
+  /*! \brief ID used to identify objects of same list */
+  private $id = "";
+
+  
   /*! \brief ObjectListViewport constructor
 
     The ObjectListViewport class renders/handles the ObjectList defined by $config.
 
     \param config Config section that is used to configure this ObjectListViewport
    */
-       public function __construct($config){
+       public function __construct($config, $multiselect= TRUE, $displayHeader= TRUE, $displayFooter= FALSE){
+
+    /* Transfer initialization values */
+    $this->displayFooterFlag= $displayFooter;
+    $this->displayHeaderFlag= $displayHeader;
+    $this->multiselect= $multiselect;
 
-    /* Dummy here */
+    /* Load list configuration from ConfigManager */
     $cr= Registry::getInstance("ConfigManager");
     $cr->setSection($config);
-    $this->headline= $cr->getValue("headline");
+    $this->parseHeadline($cr->getValue("headline"));
     $this->footer= $cr->getValue("footer");
     $this->entryFormat= $cr->getValue("entryFormat");
 
     /* Load and instanciate classes, extract filter, icons, view hooks, etc. */
     $this->objects= new ObjectList($config);
+
+    /* generate an unique id */
+    $this->id= uniqid();
   }
 
+
        /*! \brief Handles _POST / _GET events
 
            Processes the list of registered plugins to do their eventHandler and adapt
@@ -70,40 +95,71 @@ class ObjectListViewport {
   }
 
 
-       /*! \brief Renders headline into a string
+       /*! \brief Processes post events
 
-           Gets the headline description from the ObjectList object and renders it.
+           Processes all post events and acts as needed.
 
-      \return HTML rendered headline
+      \return bool for if changes are present or not
         */
-  private function renderHeadline(){
-    # Dummy implementation. Use pre-defined headline.
-    $buffer= $this->headline."\n";
+  public function process(){
 
-    #TODO: Make $buffer a proper HTML table output
-    return $buffer;
+    /* TODO: process input */
+    return FALSE;
   }
 
 
-       /*! \brief Renders footer into a string
-
-           Gets the footer description from the ObjectList object and renders it.
-
-      \return HTML rendered footer
-        */
-  private function renderFooter(){
-    # Dummy implementation. Use pre-defined footer.
-    $buffer= "|".$this->footer."|";
-
-    #TODO: Make $buffer a proper HTML table output
-    return $buffer."|\n";
+#/*! \brief Renders headline into a string
+#
+#    Gets the headline description from the ObjectList object and renders it.
+#
+#    \return HTML rendered headline
+# */
+#private function renderHeadline(){
+#  $tpl =" <tr>
+#            <td class='ObjectListViewport_TD_Header' id='ObjectListViewport_TD_Header_".$this->id."'>
+#              <table class='ObjectListViewport_Header_Table' id='ObjectListViewport_Header_Table_".$this->id."'>
+#                <tr>
+#                  {content}
+#                </tr>
+#              </table>
+#           </td>
+#         </tr>";
+#  $buffer ="";
+#  foreach($this->headline as $key => $value){
+#    $buffer .= "<td class='ObjectListViewport_Header_Cell' style='".$value['style']."'>".$value['name']."</td>\n";
+#  }
+#  return(preg_replace("/\{content\}/", $buffer,$tpl));
+#}
+
+
+#/*! \brief Renders footer into a string
+#
+#    Gets the footer description from the ObjectList object and renders it.
+#
+#    \return HTML rendered footer
+# */
+#private function renderFooter(){
+#  $buffer ="<tr>
+#            <td class='ObjectListViewport_TD_Footer' id='ObjectListViewport_TD_Footer_".$this->id."'>
+#              <table class='ObjectListViewport_Footer_Table'>
+#                <tr>
+#                  <td class='ObjectListViewport_Footer_Cell' colspan='".count($this->headline)."'>".$this->footer."</td>
+#                </tr>
+#              </table>     
+#            </td>
+#         </tr>";
+#  return $buffer;
+#}
+
+
+  /* TODO: replace this -> not our task */
+  private function getEntryIcon($entry,$alt = ""){
+    return("<img src='images/".$entry['_icon']."' alt='".$alt."' class='center'>");
   }
 
 
        /*! \brief Renders entries from the ObjectList iterator into a string
-
            Gets the entry descriptions from the ObjectList object and renders them.
-
       \return HTML rendered list entries
         */
   private function renderEntry($entry){
@@ -116,7 +172,12 @@ class ObjectListViewport {
       if (!isset($entry[$attribute])){
         throw new ObjectListViewportException(sprintf(_("Can't locate attribute '%s' to replace in entry!"), $attribute));
       } else {
-        $buffer= preg_replace('/\{'.$attribute.'\}/', $entry[$attribute],$buffer);
+
+        if(preg_match("/_icon/i",$attribute)){
+          $buffer= preg_replace('/\{'.$attribute.'\}/', $this->getEntryIcon($entry),$buffer); 
+        }else{
+          $buffer= preg_replace('/\{'.$attribute.'\}/', $entry[$attribute],$buffer);
+        }
       }
     }
 
@@ -125,12 +186,44 @@ class ObjectListViewport {
     foreach ($matches as $match){
       $filterName= preg_replace('/,.+$/', '', $match[1]);
       $filterParameter= preg_replace('/^[^,]+,/', '', $match[1]);
-      $buffer= preg_replace('/\{_filter\('.$match[1].'\)\}/', $this->applyEntryFilter($filterName, $filterParameter), $buffer);
+      $buffer= preg_replace('/\{_filter\('.normalizePreg($match[1]).'\)\}/', $this->applyEntryFilter($filterName, $filterParameter), $buffer);
     }
 
     #TODO: Make $buffer a proper HTML table output
+    $tmp = split("\|",trim($buffer,"|"));  
+
+    /* define entry template */
+    $tpl = "<td class='ObjectListViewport_Entry_Cell' style='{style_1}'>
+              <div style='{style_2}'>
+                {content}
+              </div>
+            </td>
+            ";
+    /* Template vriables to replace */
+    $attrs = array("/\{style_1\}/","/\{style_2\}/","/\{content\}/");
+
+    /* Append template for each given col */
+    $buffer ="";
+    for($i= 0; $i < $this->numberOfCols; $i++){
+
+      /* If current entry is the last to appen, then skip adding styles */
+      if($i == ($this->numberOfCols-1)){
+        $buffer.= preg_replace( $attrs,
+            array($this->headline[$i]['style'],"width:100%;overflow:hidden;",$tmp[$i]),$tpl);
+      }else{
+        $buffer.= preg_replace( $attrs,
+            array($this->headline[$i]['style'],"width:100%;overflow:hidden;".$this->headline[$i]['style'],$tmp[$i]),$tpl);
+      }
+    }
 
-    return $buffer."\n";
+    /* Add class depending on given id, to alternate background colors */
+    if($this->colorAlternator++ & 1){
+      $a = "class='ObjectListViewport_Entry_Row1'";
+    }else{
+      $a = "class='ObjectListViewport_Entry_Row2'";
+    }
+
+    return "<tr ".$a.">\n".$buffer."</tr>\n";
   }
 
 
@@ -153,19 +246,91 @@ class ObjectListViewport {
       \return HTML rendered list
         */
   public function render() {
-    /* Generate fixed headline */
-    $buffer= $this->renderHeadline();
 
     /* Apply current filter */
+    $entries = "";
     $objects= new ObjectListFilterIterator($this->objects->getIterator());
     foreach ($objects as $value){
-      $buffer.= $this->renderEntry($value);
+      $entries .= $this->renderEntry($value);
     }
 
-    /* Generate footer */
-    $buffer.= $this->renderFooter();
+    $smarty = get_smarty();
+    $smarty->assign("OLV_Entries",$objects);
+    $smarty->assign("OLV_List_Id",$this->id);
 
-    return ($buffer);
+    /* Footer variables */
+    $smarty->assign("OLV_Footer_Enabled",$this->displayFooterFlag);
+    $smarty->assign("OLV_Footer_Message",$this->footer);
+    $smarty->assign("OLV_Num_Cols",$this->numberOfCols);
+
+    /* Assign Headline values */
+    $smarty->assign("OLV_Header_Enabled",$this->displayHeaderFlag);
+    $smarty->assign("OLV_Header",$this->headline);
+    return($smarty->fetch("ObjectListViewport.tpl"));
+  }
+
+
+       /*! \brief Parses the given headline format string 
+
+      \return Array with cell properties (width, alignment,name)
+        */
+  private function parseHeadline($data)
+  {
+    /* Each cell definition is seperated by | 
+     *  split by and go through each definition
+     */
+    $this->headline= array();
+    $this->numberOfCols= 0;
+    $tmp= split("\|", trim($data, "|")); 
+    $cell_formats= array();
+
+    foreach($tmp as $key => $dta){
+
+      $width= "";
+      $alignment= "";
+      $name= preg_replace("/\{[^\}]*+\}/", "", $dta);
+      $style= "";
+    
+      /* Parse format string and detect width & alignment */
+      if(preg_match("/\{.*\}/", $dta)){
+        $format= preg_replace("/^[^\{]*+\{([^\}]*).*$/", "\\1", $dta);
+    
+        /* Get aligment */
+        if(preg_match("/:/",$format)){
+          $al= preg_replace("/^[^:]*+:([a-z]*).*$/i", "\\1", $format);
+
+          if(preg_match("/T/i", $al)){
+            $alignment.= "top-";
+            $style.= "vertical-align: top;";
+          }
+          if(preg_match("/B/i", $al)){
+            $alignment.= "bottom-";
+            $style.= "vertical-align: bottom;";
+          }
+          if(preg_match("/R/i", $al)){
+            $alignment.= "right";
+            $style.= "text-align: right;";
+          }elseif(preg_match("/L/i", $al)){
+            $alignment.= "left";
+            $style.= "text-align: left;";
+          }elseif(preg_match("/C/i", $al) || preg_match("/M/i", $al) ){
+            $alignment.= "center";
+            $style.= "text-align: center;";
+          }
+        }
+
+        /* Get width */
+        $width = preg_replace("/^([^:]*).*$/","\\1", $format);
+        if(!empty($width)){
+          $style.= "width: ".$width.";";
+        }
+      }
+
+      $cell_formats[$key]= array("name" => $name, "width" => $width, "alignment" => $alignment, "style" => $style);
+      $this->numberOfCols++;
+    }
+    $this->headline= $cell_formats;
   }
 
 }