--- /dev/null
+<?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' => ' ',
+ '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' => ' ',
+ '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' => ' ',
+ '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