]> git.llucax.com Git - mecon/meconlib.git/blobdiff - lib/MECON/HTML/Tabla.php
Se corrigen los ALT para que se vea bien con navegadores de texto.
[mecon/meconlib.git] / lib / MECON / HTML / Tabla.php
index ca725900b2f1e104172f902444791014a9600508..2a0f67e5725c541485e6ae8db713ba52b951f72a 100644 (file)
@@ -25,47 +25,62 @@ $Id$
 -----------------------------------------------------------------------------*/
 
 require_once 'HTML/Table.php';
+require_once 'MECON/HTML/Image.php';
+require_once 'MECON/HTML/Link.php';
 
 /**
- * Manejo de tablas.
- *
  * Libreria para le manejo de las tablas de los sistemas de intranet.
  *
- * @version $Rev$
- * @author  $Author$
  */
-
-class Tabla extends HTML_Table {
-
+class MECON_HTML_Tabla extends HTML_Table {
+    
     /**
      * Valores de Configuracion particular
      *
-     * @var array
+     * @var array() $conf
+     * @access protected
      */
     var $_conf;
 
     /**
      * Atributos de las tablas.
      *
-     * @var array
+     * @var array() attrs
+     * @access protected
      */
     var $_attrs;
 
     /**
-     * Constructor. 
+     * Íconos e información que va arriba de la tabla.
+     *
+     * @var array()
+     * @access private.
+     */
+    var $_cabecera = array();
+
+    /**
+     * Íconos e información que va abajo de la tabla.
      *
+     * @var array()
+     * @access private.
+     */
+    var $_pie = array();
+
+    /**
+     * Constructor. 
      * Puede recibir como parametro un string con los atributos que se 
      * quieren dar a la tabla en cuestion. Estos atributos estan
      * seteados por default segun el archivo de configuracion.
+     * Ademas puede recibir la indicacion de algun estilo en particular.
      *
-     * @param $atributos Atributos diferentes a los estandares para la
-     * tabla
+     * @param mixed $attrs Atributos diferentes a los estandares para la tabla
+     * @param string $estilo Tipo de tabla
      * 
      * @access public
      */
-    function Tabla($attrs = null) 
-    {
-        $this->_conf = include 'MECON/HTML/Tabla/conf_Tabla.php'; // Obtengo los valores particulares de configuracion
+    function MECON_HTML_Tabla($attrs = null, $estilo = 'comun') {
+        // Obtengo los valores particulares de configuracion.
+        $this->_conf = include(dirname(__FILE__) . '/Tabla/estilo_' . $estilo . '.php');
         // Seteo los atributos para la tabla
         $this->_attrs = $this->_conf['atributos']['tabla_comun'];
         //Genero el objeto HTML_Table
@@ -87,165 +102,11 @@ class Tabla extends HTML_Table {
             }            
         }        
         $this->HTML_Table($this->_attrs);
-    }    
-
-    /**                 
-     * Agrega una fila del tipo Cabecera
-     *
-     * Agrega una fila del tipo cabecera, tomando colores y demas del  
-     * archivo de configuracion. Recibe como parametro un array con 
-     * los datos a incluir en la linea. Agrega tantas columnas como
-     * elementos tenga el array. Si no recibe parametro alguno, 
-     * inserta una fila en blanco. Devuelve el identificador de la
-     * fila en donde inserto los datos.
-     *
-     * @param $contenido Contenido de la fila
-     *
-     * @return int Identificador de Linea
-     * 
-     * @access public
-     * @deprecated
-     */
-    function agregarFilaCabecera($contenido = '', $atributos = '')
-    {
-        return $this->addRow($contenido, 'cabecera');
-    }
-
-    /**                 
-     * Agrega una fila del tipo Comun
-     *
-     * Agrega una fila del tipo comun, tomando colores y demas del  
-     * archivo de configuracion. Recibe como parametro un array con 
-     * los datos a incluir en la linea. Agrega tantas columnas como
-     * elementos tenga el array. Si no recibe parametro alguno, 
-     * inserta una fila en blanco. Devuelve el identificador de la
-     * fila en donde inserto los datos.
-     *
-     * @param $contenido Contenido de la fila
-     *
-     * @return int Identificador de Linea
-     * 
-     * @access public
-     * @deprecated
-     */
-    function agregarFila($contenido = '')
-    {
-        return $this->addRow($contenido, 'comun');
-    }
-
-    /**                 
-     * Modifica el atributo rowSpan a la celda pasada por parametro
-     *
-     * @param int $fila
-     * @param int $columna
-     * @param int $valor
-     * 
-     * @access public
-     * @deprecated
-     */
-    function rowSpan($fila, $columna, $valor)
-    {
-        return $this->updateCellAttributes($fila, $columna, 'rowspan="'.$valor.'"');
-    }
-
-    /**                 
-     * Modifica el atributo colSpan a la celda pasada por parametro
-     *
-     * @param int $fila
-     * @param int $columna
-     * @param int $valor
-     * 
-     * @access public
-     * @deprecated
-     */
-    function colSpan($fila, $columna, $valor)
-    {
-        return $this->updateCellAttributes($fila, $columna, 'colspan="'.$valor.'"');
-    }
-
-    /**                 
-     * Modifica el atributo aling de la celda pasada por parametro
-     *
-     * @param int $fila
-     * @param int $columna
-     * @param string $valor (left, center, right...)
-     * 
-     * @access public
-     * @deprecated
-     */
-    function align($fila, $columna, $valor)
-    {
-        return $this->updateCellAttributes($fila, $columna, 'align="'.$valor.'"');
-    }
-
-    /**
-     * Setea una columna como del tipo cabecera    
-     *
-     * @param int $columna
-     * 
-     * @access public
-     * @deprecated
-     */
-    function setColCabecera($columna)
-    {
-        return $this->updateColAttributes($columna, 'cabecera');
-    }
-
-    /**                 
-     * Setea una columna como del tipo titulo
-     *
-     * @param int $columna
-     * 
-     * @access public
-     * @deprecated
-     */
-    function setColTitulo($columna)
-    {
-        return $this->updateColAttributes($columna, 'titulo');
-    }
-
-    /**                 
-     * Alinea una columna entera  
-     *
-     * @param int $columna
-     * @param string $valor
-     * 
-     * @access public
-     * @deprecated
-     */
-    function setColAlign($columna, $valor)
-    {
-        return $this->updateColAttributes($columna,'align="'.$valor.'"');
-    }
-
-    /**                 
-     * Cambia el tamanio de una columna entera  
-     *
-     * @param int $columna
-     * @param string $valor
-     * 
-     * @access public
-     * @deprecated
-     */
-    function setColWidth($columna, $valor)
-    {
-        return $this->updateColAttributes($columna,'width="'.$valor.'"');
-    }
+            if (isset($attrs['align'])) {
+                $this->_attrs['align'] = $attrs['align'];
+            }
 
-    /**                 
-     * Cambia el color de fondo de una celda  
-     *
-     * @param int $fila
-     * @param int $columna
-     * @param string $valor
-     *
-     * @access public
-     * @deprecated
-     */
-    function setCellBgcolor($fila, $columna, $valor)
-    {
-        return $this->updateCellAttributes($fila, $columna,'bgcolor="'.$valor.'"');
-    }
+    }    
 
     /**                 
      * Devuelve el html de la tabla
@@ -255,28 +116,72 @@ class Tabla extends HTML_Table {
      * Si $simple es falso, devuelve el html comun y corriente (con 2
      * tablas), si es false devuelve una tabla sola.
      *
-     * @param bool $simple
+     * @param bool $simple Tipo de tabla que se quiere recibir.
      *
      * @return string Html
      * 
      * @access public
      */
-    function toHtml($simple = 0)
-    {
-        // Agregar la tabla de fondo.
+    function toHtml($simple = 0) {
         if ($simple) {
             $result = parent::toHtml();
+        // Agregar la tabla de fondo.
         } else {
             $contenedora = $this->_conf['atributos']['tabla_contenedora'];
             $contenedora['width'] = $this->getAttribute('width');
+            $contenedora['align'] = $this->_attrs['align'];
             $this->updateAttributes(array('width' => '100%'));
             $tabla_externa =  new HTML_Table($contenedora);
             $tabla_externa->addRow(array(parent::toHtml()),
                 $this->_conf['atributos']['celda_contenedora']);
             $result = $tabla_externa->toHtml();    
         }
+        // Si tiene pie o cabecera, crea tabla.
+        if ($this->_cabecera or $this->_pie) {
+            $tabla_externa = new HTML_Table(array('width'=>'100%','border'=>0));
+        }
+        // Si tiene cabecera, la agrega.
+        $this->_addSpecialRow($this->_cabecera, $tabla_externa);
+        // Si tiene cabecera o pie, agrega la tabla original.
+        if ($this->_cabecera or $this->_pie) {
+            //$id = $tabla_externa->addRow($result);
+            $tabla_externa->addRow(array($result), array(
+                'align'   => 'center',
+                'valign'  => 'middle',
+                'width'   => '100%',
+                'colspan' => '3',
+            ));
+        }
+        // Si tiene pie, lo agrega.
+        $this->_addSpecialRow($this->_pie, $tabla_externa);
+        return ($this->_cabecera or $this->_pie) ? $tabla_externa->toHtml() : $result;
+    }
 
-        return $result;
+    function _addSpecialRow($array, &$tabla) {
+        if ($array) {
+            $row = array();
+            foreach ($array as $key => $val) {
+                $row[$key] = $val ? $val : ' ';
+            }
+            $id = $tabla->addRow($row, array(
+                'valign' => 'middle',
+                'width'  => '33%',
+            ));
+            // Si no hay celda central, hace colspan.
+            if ($array[0] and !$array[1]) {
+                $tabla->updateCellAttributes($id, 0, array(
+                    'colspan' => 2,
+                    'width' => '67%'));
+            /* } XXX se complica hacer el colspan para atras:
+              elseif ($array[2] and !$array[1]) {
+                $tabla->updateCellAttributes($id, 1, array(
+                    'colspan' => 2,
+                    'width' => '67%')); */
+            }
+            $tabla->updateCellAttributes($id, 0, array('align' => 'left'));
+            $tabla->updateCellAttributes($id, 1, array('align' => 'center'));
+            $tabla->updateCellAttributes($id, 2, array('align' => 'right'));
+        }
     }
 
     /**
@@ -286,15 +191,14 @@ class Tabla extends HTML_Table {
      * asociativo, se setean los atributos representados por las claves
      * con los valores.
      *
-     * @param int $row
-     * @param int $col
-     * @param mixed $attrs
+     * @param int $row     Identificador de la fila que se quiere modificar    
+     * @param int $col     Identificador de la columna que se quiere modificar
+     * @param mixed $attrs Atributo a modificar                               
      *
      * @access public
      */
-    function updateCellAttributes($row, $col, $attrs)
-    {
-        return parent::updateCellAttributes($row, $col, $this->_translateAttributes($attrs));
+    function updateCellAttributes($row, $col, $attrs) {
+        return parent::updateCellAttributes($row, $col, $this->_translateAttributes($attrs, false));
     }
 
     /**
@@ -304,15 +208,14 @@ class Tabla extends HTML_Table {
      * asociativo, se setean los atributos representados por las claves
      * con los valores.
      *
-     * @param int $row
-     * @param int $col
-     * @param mixed $attrs
+     * @param int $row     Identificador de la fila que se quiere modificar     
+     * @param int $col     Identificador de la columna que se quiere modificar
+     * @param mixed $attrs Atributo a modificar                               
      *
      * @access public
      */
-    function setCellAttributes($row, $col, $attrs)
-    {
-        return parent::setCellAttributes($row, $col, $this->_translateAttributes($attrs));
+    function setCellAttributes($row, $col, $attrs) {
+        return parent::setCellAttributes($row, $col, $this->_translateAttributes($attrs, true));
     }
 
     /**
@@ -321,15 +224,14 @@ class Tabla extends HTML_Table {
      * Agrega una fila. El contenido es el que viene representado por 
      * el array $content. Recibe los atributos en la variable $attrs
      *
-     * @param mixed $content
-     * @param mixed $attrs
+     * @param mixed $content Contenido
+     * @param mixed $attrs Atributos
      *
-     * @return int $rowId
+     * @return int $rowId Identificador de la fila
      *
      * @access public
      */
-    function addRow($content, $attrs = 'comun')
-    {
+    function addRow($content, $attrs = 'comun') {
         return parent::addRow($content, $attrs);
     }
     
@@ -339,22 +241,24 @@ class Tabla extends HTML_Table {
      * Convierte un atributo HTML al string para pasar a los metodos de HTML_Table
      * Recibe en $attrs los atributos a modificar.
      *
-     * @param string $attrs
+     * @param mixed $attrs Atributos.
+     * @param bool  $isSet Indica si hay que setear.
      *
-     * @return string
+     * @return array
      * @access private
      */
-    function _translateAttributes($attrs) 
-    {
+    function _translateAttributes($attrs, $isSet) {
         if (!$attrs) {
             return array();
         }
         if (is_string($attrs)) {
             $attrs = $this->_parseAttributes($attrs);
         }
-        #$rta = array();
-        $rta = $this->_conf['atributos']['celda_comun'];
-        #$sin_estilo = true;
+        if ($isSet) {
+            $rta = $this->_conf['atributos']['celda_comun'];
+        } else {
+            $rta = array();
+        }
         foreach ($attrs as $attr => $val) {
             $attr = strtolower($attr);
             switch ($attr) {
@@ -362,8 +266,9 @@ class Tabla extends HTML_Table {
                 case 'comun':
                 case 'cabecera':
                 case 'titulo':
-                    #$sin_estilo = false;
-                    $rta = array_merge($rta, $this->_conf['atributos']["celda_$attr"]);
+                    $rta = array_merge($rta,
+                            $this->_conf['atributos']["celda_$attr"]);
+                    $rta[$attr] = $attr;
                     break;
                 case 'align':
                 case 'valign':
@@ -376,27 +281,221 @@ class Tabla extends HTML_Table {
                 case 'border':
                 case 'cellspacing':
                 case 'cellpadding':
+                case 'nowrap':
                     $rta[$attr] = $val;
                     break;
                 case 'spacing':
                 case 'padding':
                     $rta["cell$attr"] = $val;
                     break;
-                case 'nowrap':
                 case 'th':
                     $rta[$attr] = '';
                     break;
+                case 'clara': 
+                    $tmp = $this->_conf['atributos']['celda_comun'];
+                    $tmp['bgcolor'] = $this->_conf['atributos']['celda_titulo']['bgcolor'];
+                    $tmp['class'] = $this->_conf['atributos']['celda_titulo']['class'];
+                    $rta = array_merge($rta, $tmp);
+                    $rta[$attr] = $attr;
+                    break;
+                case 'oscura':
+                    $tmp = $this->_conf['atributos']['celda_comun'];
+                    $tmp['bgcolor'] = $this->_conf['atributos']['celda_cabecera']['bgcolor'];
+                    $tmp['class'] = $this->_conf['atributos']['celda_cabecera']['class'];
+                    $rta = array_merge($rta, $tmp);
+                    $rta[$attr] = $attr;
+                    break;
                 default:
                     trigger_error("No se permite setear el atributo $attr", E_USER_ERROR);
             }
         }
-        // Si no tiene estilo, agrego estilo comun.
-        #if ($sin_estilo) {
-            #$rta = $this->_conf['atributos']['celda_comun'];
-        #}
         return $rta;
     }
 
+    /**
+     * Obtiene la Cascade Style Sheet para esta tabla.
+     *
+     * @return string Path 'web' a la css.
+     */
+    function getCSS() {
+        return $this->_conf['css'];
+    }
+
+    /**
+     * Setea la cabecera.
+     * Ejemplo:
+     * @code
+     * $tabla->setCabecera(array('Hola', '', 'mundo!'));
+     * @endcode
+     *
+     * @param array $cabecera Array de 3 elementos, que son la celda izquierda,
+     *                        central y derecha de la cabecera (en ese órden).
+     */
+    function setCabecera($cabecera) {
+        if (count($cabecera) != 3) {
+            $this->raiseError('Parámetro incorrecto: debe ser un array de 3 elementos.');
+        }
+        $this->_cabecera = $cabecera;
+    }
+
+    /**
+     * Agrega información a la cabecera de la tabla.
+     * Ejemplo:
+     * @code
+     * $tabla->updateCabecera('Hola', 'izquierda');
+     * $tabla->updateCabecera('mundo!', 'derecha');
+     * @endcode
+     *
+     * @param mixed $cabecera Celda a agregar a la cabecera. Puede ser un string
+     *                        o un objeto con un método toHtml().
+     * @param string $lugar   Lugar en donde poner la cabecera. Puede ser
+     *                       'izquierda', 'centro' o 'derecha'.
+     */
+    function updateCabecera($cabecera, $lugar) {
+        if (!$this->_cabecera) {
+            $this->_cabecera = array('', '', '');
+        }
+        if ($lugar == 'izquierda') {
+            $this->_cabecera[0] = $cabecera;
+        } elseif ($lugar == 'centro') {
+            $this->_cabecera[1] = $cabecera;
+        } elseif ($lugar == 'derecha') {
+            $this->_cabecera[2] = $cabecera;
+        } else {
+            $this->raiseError('Parámetro incorrecto: lugar debe ser izquierda, centro o derecha.');
+        }
+    }
+
+    /**
+     * Setea el pie.
+     *
+     * @param array $pie Array de 3 elementos, que son la celda izquierda,
+     *                   central y derecha del pie (en ese órden).
+     *
+     * @see Ejemplo en setCabecera().
+     */
+    function setPie($pie) {
+        if (count($pie) != 3) {
+            $this->raiseError('Parámetro incorrecto: debe ser un array de 3 elementos.');
+        }
+        $this->_pie = $pie;
+    }
+
+    /**
+     * Agrega información al pie de la tabla.
+     *
+     * @param mixed $pie Celda a agregar al pie. Puede ser un string
+     *                        o un objeto con un método toHtml().
+     * @param string $lugar   Lugar en donde poner el pie. Puede ser
+     *                       'izquierda', 'centro' o 'derecha'.
+     *
+     * @see Ejemplo en updateCabecera().
+     */
+    function updatePie($pie, $lugar) {
+        if (!$this->_pie) {
+            $this->_pie = array('', '', '');
+        }
+        if ($lugar == 'izquierda') {
+            $this->_pie[0] = $pie;
+        } elseif ($lugar == 'centro') {
+            $this->_pie[1] = $pie;
+        } elseif ($lugar == 'derecha') {
+            $this->_pie[2] = $pie;
+        } else {
+            $this->raiseError('Parámetro incorrecto: lugar debe ser izquierda, centro o derecha.');
+        }
+    }
+
+    /**
+     * Agrega un link predefinido a la cabecera o pie de la tabla.
+     * Ejemplo:
+     * @code
+     * if ($muchos) {
+     *      $tabla->addLink('nuevo');
+     * } else {
+     *      $tabla->addLink('nuevos', 'nuevos.php');
+     * }
+     * $tabla->addLink('volver',
+     *      new MECON_HTML_Link('atras.php'));
+     * $tabla->addLink('anterior',
+     *      new MECON_HTML_Link('previo.php', 'Persona Anterior'));
+     * $tabla->addLink('siguiente',
+     *      new MECON_HTML_Link('previo.php', 'Siguiente persona',
+     *          array('pers' => 'prox')));
+     * @endcode
+     *
+     * @param string $id Identificador del link predefinido. Puede ser 'volver',
+     *                   'nuevo', 'nuevos', 'buscar', 'anterior' y 'siguiente'.
+     * @param MECON_HTML_Link $link Link a usar. Si no tiene contenidos, se pone
+     *                              uno por defecto. Si es null, se pone como
+     *                              link la página actual.
+     * 
+     */
+    function addLink($id, $link = null) {
+        if (!$link) {
+            $link = @$_SERVER['PHP_SELF'];
+        }
+        if (is_string($link)) {
+            $link = new MECON_HTML_Link($link, '');
+        }
+        switch ($id) {
+            case 'nuevo':
+                $img = new MECON_HTML_Image('/MECON/images/general_nuevo', ' >>');
+                // Si no tiene titulo, le pone titulo por defecto.
+                if (!$link->getContents()) {
+                    $link->setContents('Nuevo');
+                }
+                $link->addContents($img);
+                $this->updateCabecera($link, 'derecha');
+                break;
+            case 'nuevos':
+                $img = new MECON_HTML_Image('/MECON/images/general_muchos_nuevo', ' >>');
+                // Si no tiene titulo, le pone titulo por defecto.
+                if (!$link->getContents()) {
+                    $link->setContents('Nuevos');
+                }
+                $link->addContents($img);
+                $this->updateCabecera($link, 'derecha');
+                break;
+            case 'buscar':
+                $img = new MECON_HTML_Image('/MECON/images/general_lupa', ' ?>');
+                // Si no tiene titulo, le pone titulo por defecto.
+                if (!$link->getContents()) {
+                    $link->setContents('Buscar');
+                }
+                $link->addContents($img);
+                $this->updateCabecera($link, 'derecha');
+                break;
+            case 'siguiente':
+                $img = new MECON_HTML_Image('/MECON/images/general_posterior', ' >>');
+                // Si no tiene titulo, le pone titulo por defecto.
+                if (!$link->getContents()) {
+                    $link->setContents('Siguiente');
+                }
+                $link->addContents($img);
+                $this->updatePie($link, 'derecha');
+                break;
+            case 'volver':
+                $img = new MECON_HTML_Image('/MECON/images/general_anterior', '<< ');
+                // Si no tiene titulo, le pone titulo por defecto.
+                $cont = $link->getContents() ? $link->getContents() : 'Volver';
+                $link->setContents($img);
+                $link->addContents($cont);
+                $this->updateCabecera($link, 'izquierda');
+                break;
+            case 'anterior':
+                $img = new MECON_HTML_Image('/MECON/images/general_anterior', '<< ');
+                // Si no tiene titulo, le pone titulo por defecto.
+                $cont = $link->getContents() ? $link->getContents() : 'Anterior';
+                $link->setContents($img);
+                $link->addContents($cont);
+                $this->updatePie($link, 'izquierda');
+                break;
+            default:
+                $this->raiseError("No hay un link predefinido llamado '$id'.");
+        }
+    }
+
 }
 
 ?>