1 <?php /* vim: set binary expandtab tabstop=4 shiftwidth=4 textwidth=80:
2 -------------------------------------------------------------------------------
4 -------------------------------------------------------------------------------
5 This file is part of mlib.
7 mlib is free software; you can redistribute it and/or modify it under
8 the terms of the GNU Lesser General Public License as published by the Free
9 Software Foundation; either version 2 of the License, or (at your option)
12 mlib is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
17 You should have received a copy of the GNU Lesser General Public License; if
18 not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
19 Boston, MA 02111-1307 USA
20 -------------------------------------------------------------------------------
21 Created: sáb sep 4 23:58:37 ART 2004
22 Authors: Martín Marrese <martin@marrese.com.ar>
23 -------------------------------------------------------------------------------
25 -----------------------------------------------------------------------------*/
27 require_once 'MLIB/HTML/TablaDB.php';
30 * Clase para armar Tablas HTML a partir de templates.
31 * Se cambio el enfoque respecto de MLIB_HTML_Tabla y MLIB_HTML_TablaDB. Ahora
32 * se utiliza UN solo objeto el cual puede utilizarse de manera tal que permite
33 * armar tablas simples o agregarle la funcionalidad de TablaDB.
35 * Necesita para funcionar que se encuentren en el directorio pasado como
36 * parametro los siguientes templates con las siguientes claves:
38 * - tabla Tabla general. Esta misma se usa para el paginador.
39 * - ROWS Obligatorio. Es reemplazado por las filas con información.
40 * - ATTR Opcional. Atributos dinamicos que se quieren asignar a la tabla.
42 * - row Fila con celdas de información.
43 * - CELLS Obligatorio. Es reemplazado por las celdas con información.
44 * - ATTR Opcional. Atributos dinamicos que se quieren asignar a la celda.
46 * - cellCabecera Encabezado de la tabla.
47 * - cellComun Celdas comunes.
48 * - cellTItulo Celdas titulo de columna.
49 * - CELL Obligatorio. Dato de la celda.
50 * - ATTR Opcional. Atributos dinamicos de las celdas.
52 * Para el paginador se utiliza
54 * - tabla El mismo de arriba con las mismas claves.
58 * - anterior Celda que contendra la opción para volver hacia atras.
59 * - SRC Href hacia donde apunta el link.
60 * - siguiente Celda que contendra la opción de avanzar.
61 * - SRC Href hacia donde apunta el link.
62 * - paginas Contendra la información de las paginas.
63 * - CURRENT Sera reemplazada con el numero de pagina actual.
64 * - LAST Sera reemplazada con el numero de la ultima pagina.
66 * @author Martín Marrese <martin@marrese.com.ar>
68 class MLIB_Tpl_HTML_Table extends MLIB_HTML_TablaDB {
71 * Template Engine a utilizar.
80 * @param Object MLIB_Tpl Engine de template a utilizar.
81 * @param mixed tpl_dir Directorio en donde se encuentran los templates de
83 * @param mixed attr Atributos de la tabla.
84 * @param string desc Descripcion de los elementos listados.
88 function MLIB_Tpl_HTML_Table($tpl, $tpl_dir = null, $attr = null, $desc = null)
90 $this->__constructor($tpl, $tpl_dir, $attr, $desc);
96 * @param Object MLIB_Tpl Engine de template a utilizar
97 * @param mixed tpl_dir Directorio en donde se encuentran los templates de
99 * @param mixed attr Atributos de la tabla.
100 * @param sring desc Descripcion de los elementos listados.
104 function __constructor($tpl, $tpl_dir = null, $attr = null, $desc = null)
107 $this->tpl->root = ($tpl_dir) ? $tpl_dir :
108 $_SERVER['DOCUMENT_ROOT'] . '/MLIB//templates/html/table';
109 parent::MLIB_HTML_TablaDB($desc, $attr);
110 //Esto es para overrunnear el constuctor de MLIB_HTML_Tabla que asigna
111 //unos atributos por defecto a la tabla.
112 $this->setAttributes($attr);
116 * Método que devuelve una representacion textual del objeto para que sea
117 * mostrado al usuario.
119 * @return El string correspondiente al objeto.
122 function __toString()
125 for ($row = 0; $row < $this->getRowCount(); $row++)
128 for ($col = 0; $col < $this->getColCount(); $col ++)
130 //Verifico si la celda esta col/row spaneada
131 if (!$this->getCellContents($row, $col))
135 $content = $this->getStringCellContent($row, $col);
136 $cellAttr = $this->getCellAttributes($row, $col);
140 // $cellAttr['celltype'] = 'cellComun';
142 //Agrego las celdas a la fila parseada
143 $cell.= $this->tpl->parse($cellAttr['celltype'],
146 'ATTR' => $this->_getAttrString(
152 $rowAttr = $this->getRowAttributes($row);
157 //Agrego las filas a la tabla parseada
158 $rows.= $this->tpl->parse('row', array (
160 'ATTR' => $this->_getAttrString($rowAttr)
165 //Armo el template de la tabla
166 $result = $this->tpl->parse('tabla',
169 'ATTR' => $this->getAttributes(true)
173 //Armo el pager si corresponde
174 $result.= $this->pagerToString();
180 * Funcion que devuelve el pie en caso de estar definido este.
184 function pagerToString()
189 //Veo si tengo que agregar el link a anterior.
190 if (@$this->_pie['0'])
192 $cell.= $this->tpl->parse('cellPaginador',
194 'CELL' => @$this->_pie['0']->toHtml(),
195 'ATTR' => 'align="left" width="33%" valign="middle"'
201 $cell.= $this->tpl->parse('cellPaginador',
204 'ATTR' => 'align="center" width="33%" valign="middle"'
209 //Veo si tengo que agregar el total de paginas.
210 if (@$this->_pie['1'])
212 $cell.= $this->tpl->parse('cellPaginador',
214 'CELL' => @$this->_pie['1'],
215 'ATTR' => 'align="center" width="33%" valign="middle"'
221 $cell.= $this->tpl->parse('cellPaginador',
224 'ATTR' => 'align="center" width="33%" valign="middle"'
229 //Veo si tengo que agregar el link a siguiente.
230 if (@$this->_pie['2'])
232 $cell.= $this->tpl->parse('cellPaginador',
234 'CELL' => @$this->_pie['2']->toHtml(),
235 'ATTR' => 'align="right" width="33%" valign="middle"'
241 $cell.= $this->tpl->parse('cellPaginador',
244 'ATTR' => 'align="center" width="33%" valign="middle"'
251 $rows = $this->tpl->parse('row', 'CELLS', $cell);
253 //Armo el template de la tabla
254 $result = $this->tpl->parse('tabla',
257 'ATTR' => $this->getAttributes(true)
266 * Agrega un páginador a la tabla, basado en un resultado de una base de datos.
269 * $tabla = new MLIB_HTML_TablaDB('personas', array('width' => '100%'));
270 * $result = $db->query('SELECT nombre, apellido FROM tabla');
271 * if (DB::isError($result)) {
272 * trigger_error('Error', E_USER_ERROR);
274 * // Agrega el paginador por defecto y lo guarda para mostrar solo los
275 * // resultados paginados después.
276 * $pager = $tabla->addPager($result);
277 * // Agrega cabecera con los nombres de las columnas.
278 * $tabla->addRow(array('Nombre', 'Apellido'), 'cabecera');
279 * // Agrega los resultados paginados de la DB.
280 * $tabla->addRows($pager, array('nombre', 'apellido'));
284 * @param DB_Result $result Resultado de una consulta de base de datos.
285 * @param mixed $tipo Tipo de link(s) a agregar. Puede ser:
287 * <li><tt>'anterior'</tt></li>
288 * <li><tt>'siguiente'</tt></li>
289 * <li><tt>'paginas'</tt></li>
291 * Puede pasarse uno solo como un string o varios como un
292 * array. Si se pasa <tt>'todo'</tt>, se incluyen todos.
293 * Si se pasa null, se incluyen <tt>'anterior'</tt>,
294 * <tt>'siguiente'</tt> y <tt>'paginas'</tt>.
295 * @param mixed $link Dirección a la que apuntan los links generados. Puede
296 * ser un MLIB_HTML_Link (para poder pasar variables por
298 * @param int $limit Parámetro usado para crear el MLIB_DB_Pager.
299 * @param int $maxpages Parámetro usado para crear el MLIB_DB_Pager.
300 * @param string $getvar Nombre de la variable GET a usar para indicar el número
301 * de página actual (se le pone el \ref setGetPrefix prefijo)
303 * @return MLIB_DB_Pager Pager que se puede usar para realizar los fetch de
304 * los resultados de la página actual.
306 * @see MLIB_DB_Pager, addRows().
308 function addPager($result, $tipo = null, $link = null, $limit = 10, $maxpages = 21, $getvar = 'from')
310 // Creo el pager con el resultado.
311 $pager = (is_array($result))?
312 new MLIB_Array_Pager($result, @$_GET[$this->getGetVarPrefix().$getvar], $limit, $maxpages):
313 new MLIB_DB_Pager($result, @$_GET[$this->getGetVarPrefix().$getvar], $limit, $maxpages);
315 // Obtengo un link válido.
317 $link = @$_SERVER['PHP_SELF'];
319 if (is_string($link)) {
320 $link = new MLIB_HTML_Link($link, '');
322 // Si es el tipo por defecto pone paginador nada más.
323 //Esto se podria poner como valor por defecto (aunque dejaria muy largo
324 //el encabezado de la funcion)
326 $tipo = array('anterior', 'paginas', 'siguiente');
328 // Convierte tipo a array.
329 if (!is_array($tipo)) {
330 $tipo = array($tipo);
332 // Me fijo si tiene cada uno de los elementos y los agrego.
333 if (in_array('anterior', $tipo) and $pager->numRows() and $pager->currentpage != 1)
335 $link->setGetVar($this->getGetVarPrefix().$getvar, $pager->prev);
336 $img = new MLIB_HTML_Image('/MLIB/images/general_anterior', '<< ');
338 $link->setContents($img);
339 $link->addContents($cont);
340 $this->updatePie($link, 'izquierda');
342 if (in_array('siguiente', $tipo) and $pager->numRows() and $pager->currentpage != $pager->numpages) {
343 $link->setGetVar($this->getGetVarPrefix().$getvar, $pager->next);
344 $img = new MLIB_HTML_Image('/MLIB/images/general_posterior', ' >>');
345 // Si no tiene titulo, le pone titulo por defecto.
347 $link->setContents($img);
348 $link->addContents($cont);
349 $this->updatePie($link, 'derecha');
351 if (in_array('paginas', $tipo) and $pager->numRows() and $pager->numpages > 1) {
352 $from = @$_GET[$this->getGetVarPrefix().$getvar];
354 $lnk = $link->getContents();
355 foreach ($pager->pages as $page => $start_row) {
356 if ($start_row == $from) {
357 $pags .= '<b>'. $page . '</b>';
359 $link->setGetVar($this->getGetVarPrefix().$getvar, $start_row);
360 $link->setContents($page);
361 $pags .= $link->toHtml();
363 if ($page != $pager->lastpage) {
367 $link->setContents($lnk);
368 $this->updatePie($pags, 'centro');
374 * Método que devuelve el contenido de una celda.
376 * @param int row Fila.
377 * @param int col Columna.
382 function getStringCellContent($row, $col)
384 //Veo si esta seteado el contenido de la celda
386 if (isset($this->_structure[$row][$col]['contents']))
388 //Ver si es un objeto
389 if (is_object($this->_structure[$row][$col]['contents']))
391 //Busco el metodo toHtml
392 if (method_exists($this->_structure[$row][$col]['contents'], "toHtml"))
394 $content = $this->_structure[$row][$col]['contents']->toHtml();
396 //Busco el metodo toString
397 elseif (method_exists($this->_structure[$row][$col]['contents'], "toString"))
399 $content = $this->_structure[$row][$col]['contents']->toString();
401 //Busco el metodo __toString
403 (method_exists($this->_structure[$row][$col]['contents'], "__toString"))
405 $content = $this->_structure[$row][$col]['contents']->__toString();
408 //No es un objeto, devuelvo lo que es
411 $content = $this->_structure[$row][$col]['contents'];
418 * Convierte un atributo a string
420 * Convierte un atributo HTML al string para pasar a los metodos de HTML_Table
421 * Recibe en $attrs los atributos a modificar.
423 * @param mixed $attrs Atributos.
424 * @param bool $isSet Indica si hay que setear.
429 function _translateAttributes($attrs, $isSet) {
433 if (is_string($attrs)) {
434 $attrs = $this->_parseAttributes($attrs);
437 /* Rezago de MLIB_HTML_Tabla.
439 $rta = $this->_conf['atributos']['celda_comun'];
444 foreach ($attrs as $attr => $val) {
445 $attr = strtolower($attr);
456 $rta['celltype'] = 'cell' . ucfirst($attr);
474 $rta["cell$attr"] = $val;
480 trigger_error("No se permite setear el atributo $attr", E_USER_ERROR);