]> git.llucax.com Git - mecon/meconlib.git/commitdiff
Se agrega un objeto que permite armar tablas html a partir de templates.
authorMartín Marrese <marrese@gmail.com>
Sat, 13 Aug 2005 20:21:28 +0000 (20:21 +0000)
committerMartín Marrese <marrese@gmail.com>
Sat, 13 Aug 2005 20:21:28 +0000 (20:21 +0000)
lib/MLIB/Tpl/HTML/Table.php [new file with mode: 0644]

diff --git a/lib/MLIB/Tpl/HTML/Table.php b/lib/MLIB/Tpl/HTML/Table.php
new file mode 100644 (file)
index 0000000..83377ad
--- /dev/null
@@ -0,0 +1,486 @@
+<?php /* vim: set binary expandtab tabstop=4 shiftwidth=4 textwidth=80:
+-------------------------------------------------------------------------------
+                                    mlib
+-------------------------------------------------------------------------------
+This file is part of mlib.
+
+mlib is free software; you can redistribute it and/or modify it under
+the terms of the GNU Lesser General Public License as published by the Free
+Software Foundation; either version 2 of the License, or (at your option)
+any later version.
+
+mlib is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more 
+details.
+You should have received a copy of the GNU Lesser General Public License; if 
+not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+Boston, MA  02111-1307  USA
+-------------------------------------------------------------------------------
+Created: sáb sep  4 23:58:37 ART 2004
+Authors: Martín Marrese <martin@marrese.com.ar>
+-------------------------------------------------------------------------------
+$Id$
+-----------------------------------------------------------------------------*/
+
+require_once 'MLIB/HTML/TablaDB.php';
+
+/**
+ * Clase para armar Tablas HTML a partir de templates.
+ * Se cambio el enfoque respecto de MLIB_HTML_Tabla y MLIB_HTML_TablaDB. Ahora
+ * se utiliza UN solo objeto el cual puede utilizarse de manera tal que permite
+ * armar tablas simples o agregarle la funcionalidad de TablaDB.
+ *
+ * Necesita para funcionar que se encuentren en el directorio pasado como
+ * parametro los siguientes templates con las siguientes claves:
+ *
+ * - tabla   Tabla general. Esta misma se usa para el paginador.
+ *    - ROWS Obligatorio. Es reemplazado por las filas con información.
+ *    - ATTR Opcional. Atributos dinamicos que se quieren asignar a la tabla.
+ *
+ * - row      Fila con celdas de información.
+ *    - CELLS Obligatorio. Es reemplazado por las celdas con información.
+ *    - ATTR  Opcional. Atributos dinamicos que se quieren asignar a la celda.
+ *
+ * - cellCabecera Encabezado de la tabla.
+ * - cellComun    Celdas comunes.
+ * - cellTItulo   Celdas titulo de columna.
+ *    - CELL      Obligatorio. Dato de la celda.
+ *    - ATTR      Opcional. Atributos dinamicos de las celdas.
+ *
+ * Para el paginador se utiliza
+ * 
+ * - tabla El mismo de arriba con las mismas claves.
+ * - row   Idem.
+ * - cell  Idem.
+ *
+ * - anterior Celda que contendra la opción para volver hacia atras.
+ *    - SRC   Href hacia donde apunta el link.
+ * - siguiente Celda que contendra la opción de avanzar.
+ *    - SRC    Href hacia donde apunta el link.
+ * - paginas    Contendra la información de las paginas.
+ *    - CURRENT Sera reemplazada con el numero de pagina actual.
+ *    - LAST    Sera reemplazada con el numero de la ultima pagina.
+ *
+ * @author Martín Marrese <martin@marrese.com.ar>
+ */
+class MLIB_Tpl_HTML_Table extends MLIB_HTML_TablaDB {
+    
+    /**
+     * Template Engine a utilizar.
+     *
+     * @protected
+     */
+    var $tpl = '';
+
+    /**
+     * Constructor.
+     *
+     * @param Object MLIB_Tpl Engine de template a utilizar.
+     * @param mixed tpl_dir Directorio en donde se encuentran los templates de
+     * la tabla.
+     * @param mixed attr Atributos de la tabla.
+     * @param string desc Descripcion de los elementos listados.
+     * @return void
+     * @access public
+     */
+    function MLIB_Tpl_HTML_Table($tpl, $tpl_dir = null, $attr = null, $desc = null)
+    {
+        $this->__constructor($tpl, $tpl_dir, $attr, $desc);
+    }
+
+    /**
+     * Constructor.
+     *
+     * @param Object MLIB_Tpl Engine de template a utilizar
+     * @param mixed tpl_dir Directorio en donde se encuentran los templates de
+     * la tabla.
+     * @param mixed attr Atributos de la tabla.
+     * @param sring desc Descripcion de los elementos listados.
+     * @return void
+     * @access public
+     */
+    function __constructor($tpl, $tpl_dir = null, $attr = null, $desc = null)
+    {
+        $this->tpl       = $tpl;
+        $this->tpl->root = ($tpl_dir) ? $tpl_dir :
+            $_SERVER['DOCUMENT_ROOT'] . '/MLIB//templates/html/table';
+        parent::MLIB_HTML_TablaDB($desc, $attr);
+        //Esto es para overrunnear el constuctor de MLIB_HTML_Tabla que asigna
+        //unos atributos por defecto a la tabla.
+        $this->setAttributes($attr);
+    }
+
+    /**
+     * Método que devuelve una representacion textual del objeto para que sea
+     * mostrado al usuario.
+     *
+     * @return El string correspondiente al objeto.
+     * @access public
+     */
+    function __toString()
+    {
+        $rows = '';
+        for ($row = 0; $row < $this->getRowCount(); $row++)
+        {
+            $cell = '';
+            for ($col = 0; $col < $this->getColCount(); $col ++)
+            {
+                //Verifico si la celda esta col/row spaneada
+                if (!$this->getCellContents($row, $col))
+                {
+                    continue;
+                }
+                $content = $this->getStringCellContent($row, $col);
+                $cellAttr = $this->getCellAttributes($row, $col);
+                if (!$cellAttr)
+                {
+                    $cellAttr = '';
+//                    $cellAttr['celltype'] = 'cellComun';
+                }
+                //Agrego las celdas a la fila parseada
+                $cell.= $this->tpl->parse($cellAttr['celltype'],
+                        array (
+                            'CELL' => $content,
+                            'ATTR' => $this->_getAttrString(
+                                $cellAttr
+                                )
+                            )
+                        );       
+            }
+            $rowAttr = $this->getRowAttributes($row);
+            if (!$rowAttr)
+            {
+                $rowAttr = '';
+            }
+            //Agrego las filas a la tabla parseada
+            $rows.= $this->tpl->parse('row', array (
+                        'CELLS' => $cell,
+                        'ATTR' => $this->_getAttrString($rowAttr)
+                        )
+                    );
+        }
+
+        //Armo el template de la tabla
+        $result = $this->tpl->parse('tabla',
+                array (
+                    'ROWS' => $rows,
+                    'ATTR' => $this->getAttributes(true)
+                    )
+                );
+
+        //Armo el pager si corresponde
+        $result.= $this->pagerToString();
+        
+        return $result;
+    }
+
+    /*
+     * Funcion que devuelve el pie en caso de estar definido este.
+     *
+     * @return mixed Pie.
+     */
+    function pagerToString()
+    {
+        if ($this->_pie)
+        {
+            $cell = '';
+            //Veo si tengo que agregar el link a anterior.
+            if (@$this->_pie['0'])
+            {
+                $cell.= $this->tpl->parse('cellPaginador',
+                        array (
+                            'CELL' => @$this->_pie['0']->toHtml(),
+                            'ATTR' => 'align="left" width="33%" valign="middle"'
+                            )
+                        );       
+            }
+            else
+            {
+                $cell.= $this->tpl->parse('cellPaginador',
+                        array (
+                            'CELL' => '&nbsp;',
+                            'ATTR' => 'align="center" width="33%" valign="middle"'
+                            )
+                        );       
+                  
+            }
+            //Veo si tengo que agregar el total de paginas.
+            if (@$this->_pie['1'])
+            {
+                $cell.= $this->tpl->parse('cellPaginador',
+                        array (
+                            'CELL' => @$this->_pie['1'],
+                            'ATTR' => 'align="center" width="33%" valign="middle"'
+                            )
+                        );       
+            }
+            else
+            {
+                $cell.= $this->tpl->parse('cellPaginador',
+                        array (
+                            'CELL' => '&nbsp;',
+                            'ATTR' => 'align="center" width="33%" valign="middle"'
+                            )
+                        );       
+                  
+            }
+            //Veo si tengo que agregar el link a siguiente.
+            if (@$this->_pie['2'])
+            {
+                $cell.= $this->tpl->parse('cellPaginador',
+                        array (
+                            'CELL' => @$this->_pie['2']->toHtml(),
+                            'ATTR' => 'align="right" width="33%" valign="middle"'
+                            )
+                        );       
+            }
+            else
+            {
+                $cell.= $this->tpl->parse('cellPaginador',
+                        array (
+                            'CELL' => '&nbsp;',
+                            'ATTR' => 'align="center" width="33%" valign="middle"'
+                            )
+                        );       
+                  
+            }
+
+            //Armo el row
+            $rows = $this->tpl->parse('row', 'CELLS', $cell);
+
+            //Armo el template de la tabla
+            $result = $this->tpl->parse('tabla',
+                    array (
+                        'ROWS' => $rows,
+                        'ATTR' => $this->getAttributes(true)
+                        )
+                    );
+
+            return $result;
+        } 
+    }
+    
+    /**
+     * Agrega un páginador a la tabla, basado en un resultado de una base de datos.
+     * Ejemplo:
+     * @code
+     * $tabla = new MLIB_HTML_TablaDB('personas', array('width' => '100%'));
+     * $result = $db->query('SELECT nombre, apellido FROM tabla');
+     * if (DB::isError($result)) {
+     *      trigger_error('Error', E_USER_ERROR);
+     * }
+     * // Agrega el paginador por defecto y lo guarda para mostrar solo los
+     * // resultados paginados después.
+     * $pager = $tabla->addPager($result);
+     * // Agrega cabecera con los nombres de las columnas.
+     * $tabla->addRow(array('Nombre', 'Apellido'), 'cabecera');
+     * // Agrega los resultados paginados de la DB.
+     * $tabla->addRows($pager, array('nombre', 'apellido'));
+     * $tabla->display();
+     * @endcode
+     *
+     * @param DB_Result $result Resultado de una consulta de base de datos.
+     * @param mixed $tipo Tipo de link(s) a agregar. Puede ser:
+     *                    <ul>
+     *                      <li><tt>'anterior'</tt></li>
+     *                      <li><tt>'siguiente'</tt></li>
+     *                      <li><tt>'paginas'</tt></li>
+     *                    </ul>
+     *                    Puede pasarse uno solo como un string o varios como un
+     *                    array. Si se pasa <tt>'todo'</tt>, se incluyen todos.
+     *                    Si se pasa null, se incluyen <tt>'anterior'</tt>,
+     *                    <tt>'siguiente'</tt> y <tt>'paginas'</tt>.
+     * @param mixed $link Dirección a la que apuntan los links generados. Puede
+     *                    ser un MLIB_HTML_Link (para poder pasar variables por
+     *                    GET) o un string.
+     * @param int $limit Parámetro usado para crear el MLIB_DB_Pager.
+     * @param int $maxpages Parámetro usado para crear el MLIB_DB_Pager.
+     * @param string $getvar Nombre de la variable GET a usar para indicar el número
+     *               de página actual (se le pone el \ref setGetPrefix prefijo)
+     *
+     * @return MLIB_DB_Pager Pager que se puede usar para realizar los fetch de
+     *         los resultados de la página actual.
+     *
+     * @see MLIB_DB_Pager, addRows().
+     */
+    function addPager($result, $tipo = null, $link = null, $limit = 10, $maxpages = 21, $getvar = 'from') 
+    {
+        // Creo el pager con el resultado.
+        $pager = (is_array($result))?
+                new MLIB_Array_Pager($result, @$_GET[$this->getGetVarPrefix().$getvar], $limit, $maxpages):
+                new MLIB_DB_Pager($result, @$_GET[$this->getGetVarPrefix().$getvar], $limit, $maxpages);
+
+        // Obtengo un link válido.
+        if (!$link) {
+            $link = @$_SERVER['PHP_SELF'];
+        }
+        if (is_string($link)) {
+            $link = new MLIB_HTML_Link($link, '');
+        }
+        // Si es el tipo por defecto pone paginador nada más.
+        //Esto se podria poner como valor por defecto (aunque dejaria muy largo
+        //el encabezado de la funcion)
+        if (!$tipo) {
+            $tipo = array('anterior', 'paginas', 'siguiente');
+        }
+        // Convierte tipo a array.
+        if (!is_array($tipo)) {
+            $tipo = array($tipo);
+        }
+        // Me fijo si tiene cada uno de los elementos y los agrego.
+        if (in_array('anterior', $tipo) and $pager->numRows() and $pager->currentpage != 1) 
+        {
+            $link->setGetVar($this->getGetVarPrefix().$getvar, $pager->prev);
+            $img = new MLIB_HTML_Image('/MLIB/images/general_anterior', '<< ');
+            $cont = '';
+            $link->setContents($img);
+            $link->addContents($cont);
+            $this->updatePie($link, 'izquierda');
+        }
+        if (in_array('siguiente', $tipo) and $pager->numRows() and $pager->currentpage != $pager->numpages) {
+            $link->setGetVar($this->getGetVarPrefix().$getvar, $pager->next);
+            $img = new MLIB_HTML_Image('/MLIB/images/general_posterior', ' >>');
+            // Si no tiene titulo, le pone titulo por defecto.
+            $cont =  '';
+            $link->setContents($img);
+            $link->addContents($cont);
+            $this->updatePie($link, 'derecha');
+        }
+        if (in_array('paginas', $tipo) and $pager->numRows() and $pager->numpages > 1) {
+            $from = @$_GET[$this->getGetVarPrefix().$getvar];
+            $pags = '';
+            $lnk = $link->getContents();
+            foreach ($pager->pages as $page => $start_row) {
+                if ($start_row == $from) {
+                    $pags .= '<b>'. $page . '</b>';
+                } else {
+                    $link->setGetVar($this->getGetVarPrefix().$getvar, $start_row);
+                    $link->setContents($page);
+                    $pags .= $link->toHtml();
+                }
+                if ($page != $pager->lastpage) {
+                    $pags .= ' | ';
+                }
+            }
+            $link->setContents($lnk);
+            $this->updatePie($pags, 'centro');
+        }
+        return $pager;
+    }
+    
+    /**
+     * Método que devuelve el contenido de una celda.
+     *
+     * @param int row Fila.
+     * @param int col Columna.
+     *
+     * @return mixed.
+     * @access protected
+     */
+    function getStringCellContent($row, $col)
+    {
+        //Veo si esta seteado el contenido de la celda
+        $content = '';
+        if (isset($this->_structure[$row][$col]['contents']))
+        {
+            //Ver si es un objeto
+            if (is_object($this->_structure[$row][$col]['contents']))
+            {
+                //Busco el metodo toHtml
+                if (method_exists($this->_structure[$row][$col]['contents'], "toHtml"))
+                {
+                    $content = $this->_structure[$row][$col]['contents']->toHtml();
+                }
+                //Busco el metodo toString
+                elseif (method_exists($this->_structure[$row][$col]['contents'], "toString"))
+                {
+                    $content = $this->_structure[$row][$col]['contents']->toString();
+                }
+                //Busco el metodo __toString
+                elseif
+                    (method_exists($this->_structure[$row][$col]['contents'], "__toString"))
+                    {
+                        $content = $this->_structure[$row][$col]['contents']->__toString();
+                    }
+            }
+            //No es un objeto, devuelvo lo que es
+            else
+            {
+                $content = $this->_structure[$row][$col]['contents'];
+            }
+        }
+        return $content;
+    }
+
+    /**
+     * Convierte un atributo a string
+     * 
+     * Convierte un atributo HTML al string para pasar a los metodos de HTML_Table
+     * Recibe en $attrs los atributos a modificar.
+     *
+     * @param mixed $attrs Atributos.
+     * @param bool  $isSet Indica si hay que setear.
+     *
+     * @return array
+     * @access protected
+     */
+    function _translateAttributes($attrs, $isSet) {
+        if (!$attrs) {
+            return array();
+        }
+        if (is_string($attrs)) {
+            $attrs = $this->_parseAttributes($attrs);
+        }
+        $rta = array ();
+        /* Rezago de MLIB_HTML_Tabla.
+        if ($isSet) {
+            $rta = $this->_conf['atributos']['celda_comun'];
+        } else {
+            $rta = array();
+        }
+        */
+        foreach ($attrs as $attr => $val) {
+            $attr = strtolower($attr);
+            switch ($attr) {
+                // Estilos de celda
+                case 'comun':
+                case 'cabecera':
+                case 'titulo':
+                case 'clara': 
+                case 'oscura':
+                case 'paginador':
+                case 'sb':
+                case 'comun_clara':
+                    $rta['celltype'] = 'cell' . ucfirst($attr);
+                    break;
+                case 'align':
+                case 'valign':
+                case 'width':
+                case 'height':
+                case 'rowspan':
+                case 'colspan':
+                case 'bgcolor':
+                case 'class':
+                case 'border':
+                case 'cellspacing':
+                case 'cellpadding':
+                case 'nowrap':
+                    $rta[$attr] = $val;
+                    break;
+                case 'spacing':
+                case 'padding':
+                    $rta["cell$attr"] = $val;
+                    break;
+                case 'th':
+                    $rta[$attr] = '';
+                    break;
+                default:
+                    trigger_error("No se permite setear el atributo $attr", E_USER_ERROR);
+            }
+        }
+        return $rta;
+    }
+}
+?>
\ No newline at end of file