From cfc437132a27bd1a3f4c8a16622af8a9ed0e8be1 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Mart=C3=ADn=20Marrese?= Date: Sat, 13 Aug 2005 20:21:28 +0000 Subject: [PATCH] Se agrega un objeto que permite armar tablas html a partir de templates. --- lib/MLIB/Tpl/HTML/Table.php | 486 ++++++++++++++++++++++++++++++++++++ 1 file changed, 486 insertions(+) create mode 100644 lib/MLIB/Tpl/HTML/Table.php diff --git a/lib/MLIB/Tpl/HTML/Table.php b/lib/MLIB/Tpl/HTML/Table.php new file mode 100644 index 0000000..83377ad --- /dev/null +++ b/lib/MLIB/Tpl/HTML/Table.php @@ -0,0 +1,486 @@ + +------------------------------------------------------------------------------- +$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 + */ +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: + * + * Puede pasarse uno solo como un string o varios como un + * array. Si se pasa 'todo', se incluyen todos. + * Si se pasa null, se incluyen 'anterior', + * 'siguiente' y 'paginas'. + * @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 .= ''. $page . ''; + } 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 -- 2.43.0