1 <?php /* vim: set binary expandtab tabstop=4 shiftwidth=4 textwidth=80:
2 -------------------------------------------------------------------------------
5 -------------------------------------------------------------------------------
6 This file is part of meconlib.
8 meconlib is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2 of the License, or (at your option)
13 meconlib is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15 FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License; if not,
18 write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
19 Boston, MA 02111-1307 USA
20 -------------------------------------------------------------------------------
21 Creado: fri mar 21 ART 2003
22 Autor: Martin Marrese <mmarre@mecon.gov.ar>
23 -------------------------------------------------------------------------------
25 -----------------------------------------------------------------------------*/
27 require_once 'HTML/Table.php';
28 require_once 'MECON/HTML/Image.php';
29 require_once 'MECON/DB/Pager.php';
32 * Libreria para le manejo de las tablas de los sistemas de intranet.
35 class MECON_HTML_Tabla extends HTML_Table {
38 * Valores de Configuracion particular
46 * Atributos de las tablas.
54 * Íconos e información que va arriba de la tabla.
59 var $_cabecera = array();
62 * Íconos e información que va abajo de la tabla.
71 * Puede recibir como parametro un string con los atributos que se
72 * quieren dar a la tabla en cuestion. Estos atributos estan
73 * seteados por default segun el archivo de configuracion.
74 * Ademas puede recibir la indicacion de algun estilo en particular.
76 * @param mixed $atributos Atributos diferentes a los estandares para la tabla
77 * @param string $estilo Tipo de tabla
81 function MECON_HTML_Tabla($attrs = null, $estilo = 'comun') {
82 // Obtengo los valores particulares de configuracion.
83 $this->_conf = include(dirname(__FILE__) . '/Tabla/estilo_' . $estilo . '.php');
84 // Seteo los atributos para la tabla
85 $this->_attrs = $this->_conf['atributos']['tabla_comun'];
86 //Genero el objeto HTML_Table
87 if (is_string($attrs)) {
88 $attrs = $this->_parseAttributes($attrs);
90 if (is_array($attrs)) {
91 if (isset($attrs['width'])) {
92 $this->_attrs['width'] = $attrs['width'];
94 if (isset($attrs['bgcolor'])) {
95 $this->_attrs['bgcolor'] = $attrs['bgcolor'];
97 if (isset($attrs['cellspacing'])) {
98 $this->_attrs['cellspacing'] = $attrs['cellspacing'];
100 if (isset($attrs['cellpadding'])) {
101 $this->_attrs['cellpadding'] = $attrs['cellpadding'];
104 $this->HTML_Table($this->_attrs);
105 if (isset($attrs['align'])) {
106 $this->_attrs['align'] = $attrs['align'];
112 * Agrega una fila del tipo cabecera tomando colores y demas del
113 * archivo de configuracion. Recibe como parametro un array con
114 * los datos a incluir en la linea. Agrega tantas columnas como
115 * elementos tenga el array. Si no recibe parametro alguno,
116 * inserta una fila en blanco. Devuelve el identificador de la
117 * fila en donde inserto los datos.
119 * @param array() $contenido Contenido de la fila
121 * @return int Identificador de Linea
125 function agregarFilaCabecera($contenido = '', $atributos = '') {
126 return $this->addRow($contenido, 'cabecera');
130 * Agrega una fila del tipo comun, tomando colores y demas del
131 * archivo de configuracion. Recibe como parametro un array con
132 * los datos a incluir en la linea. Agrega tantas columnas como
133 * elementos tenga el array. Si no recibe parametro alguno,
134 * inserta una fila en blanco. Devuelve el identificador de la
135 * fila en donde inserto los datos.
137 * @param array() $contenido Contenido de la fila
139 * @return int Identificador de Linea
144 function agregarFila($contenido = '') {
145 return $this->addRow($contenido, 'comun');
149 * Modifica el atributo rowSpan a la celda pasada por parametro
151 * @param int $fila Identificador de la fila que se quiere modificar
152 * @param int $columna Identificador de la columna que se quiere modificar
153 * @param int $valor Atributo a modificar
158 function rowSpan($fila, $columna, $valor) {
159 return $this->updateCellAttributes($fila, $columna, 'rowspan="'.$valor.'"');
163 * Modifica el atributo colSpan a la celda pasada por parametro
165 * @param int $fila Identificador de la fila que se quiere modificar
166 * @param int $columna Identificador de la columna que se quiere modificar
167 * @param int $valor Atributo a modificar
172 function colSpan($fila, $columna, $valor) {
173 return $this->updateCellAttributes($fila, $columna, 'colspan="'.$valor.'"');
177 * Modifica el atributo aling de la celda pasada por parametro
179 * @param int $fila Identificador de la fila que se quiere modificar
180 * @param int $columna Identificador de la columna que se quiere modificar
181 * @param string $valor Atributo a modificar
186 function align($fila, $columna, $valor) {
187 return $this->updateCellAttributes($fila, $columna, 'align="'.$valor.'"');
191 * Setea una columna como del tipo cabecera
193 * @param int $columna Identificador de la columna que se quiere modificar
198 function setColCabecera($columna) {
199 return $this->updateColAttributes($columna, 'cabecera');
203 * Setea una columna como del tipo titulo
205 * @param int $columna Identificador de la columna que se quiere modificar
210 function setColTitulo($columna) {
211 return $this->updateColAttributes($columna, 'titulo');
215 * Alinea una columna entera
217 * @param int $columna Identificador de la columna que se quiere modificar
218 * @param string $valor Valor
223 function setColAlign($columna, $valor) {
224 return $this->updateColAttributes($columna,'align="'.$valor.'"');
228 * Cambia el tamanio de una columna entera
230 * @param int $columna Identificadore de la columna que se quiere modificar
231 * @param string $valor Valor
236 function setColWidth($columna, $valor) {
237 return $this->updateColAttributes($columna,'width="'.$valor.'"');
241 * Cambia el color de fondo de una celda
243 * @param int $fila Identificador de la fila que se quiere modificar
244 * @param int $columna Identificador de la columna que se quiere modificar
245 * @param string $valor Atributo a modificar
250 function setCellBgcolor($fila, $columna, $valor) {
251 return $this->updateCellAttributes($fila, $columna,'bgcolor="'.$valor.'"');
255 * Devuelve el html de la tabla
257 * Devuelve el html de la tabla para que sea mostrado.
258 * Como parametro recibe el indicador de tabla simple.
259 * Si $simple es falso, devuelve el html comun y corriente (con 2
260 * tablas), si es false devuelve una tabla sola.
262 * @param bool $simple Tipo de tabla que se quiere recibir.
264 * @return string Html
268 function toHtml($simple = 0) {
270 $result = parent::toHtml();
271 // Agregar la tabla de fondo.
273 $contenedora = $this->_conf['atributos']['tabla_contenedora'];
274 $contenedora['width'] = $this->getAttribute('width');
275 $contenedora['align'] = $this->_attrs['align'];
276 $this->updateAttributes(array('width' => '100%'));
277 $tabla_externa = new HTML_Table($contenedora);
278 $tabla_externa->addRow(array(parent::toHtml()),
279 $this->_conf['atributos']['celda_contenedora']);
280 $result = $tabla_externa->toHtml();
282 // Si tiene pie o cabecera, crea tabla.
283 if ($this->_cabecera or $this->_pie) {
284 $tabla_externa = new HTML_Table(array('width'=>'100%','border'=>0));
286 // Si tiene cabecera, la agrega.
287 if ($this->_cabecera) {
288 $tabla_externa->addRow($this->_cabecera, array(
289 'valign' => 'middle',
292 $tabla_externa->updateCellAttributes(0, 0, array('align' => 'left'));
293 $tabla_externa->updateCellAttributes(0, 1, array('align' => 'center'));
294 $tabla_externa->updateCellAttributes(0, 2, array('align' => 'right'));
296 // Si tiene cabecera o pie, agrega la tabla original.
297 if ($this->_cabecera or $this->_pie) {
298 //$id = $tabla_externa->addRow($result);
299 $tabla_externa->addRow(array($result), array(
301 'valign' => 'middle',
306 // Si tiene pie, lo agrega.
308 $id = $tabla_externa->addRow($this->_pie, array(
309 'valign' => 'middle',
312 $tabla_externa->updateCellAttributes($id, 0, array('align' => 'left'));
313 $tabla_externa->updateCellAttributes($id, 1, array('align' => 'center'));
314 $tabla_externa->updateCellAttributes($id, 2, array('align' => 'right'));
316 return ($this->_cabecera or $this->_pie) ? $tabla_externa->toHtml() : $result;
320 * Cambia las propiedades de una celda
322 * Cambia las propiedades de una celda. Si $attrs es un array
323 * asociativo, se setean los atributos representados por las claves
326 * @param int $row Identificador de la fila que se quiere modificar
327 * @param int $col Identificador de la columna que se quiere modificar
328 * @param mixed $attrs Atributo a modificar
332 function updateCellAttributes($row, $col, $attrs) {
333 return parent::updateCellAttributes($row, $col, $this->_translateAttributes($attrs, false));
337 * Establece las propiedades de una celda
339 * Establece las propiedades de una celda. Si $attrs es un array
340 * asociativo, se setean los atributos representados por las claves
343 * @param int $row Identificador de la fila que se quiere modificar
344 * @param int $col Identificador de la columna que se quiere modificar
345 * @param mixed $attrs Atributo a modificar
349 function setCellAttributes($row, $col, $attrs) {
350 return parent::setCellAttributes($row, $col, $this->_translateAttributes($attrs, true));
356 * Agrega una fila. El contenido es el que viene representado por
357 * el array $content. Recibe los atributos en la variable $attrs
359 * @param mixed $content Contenido
360 * @param mixed $attrs Atributos
362 * @return int $rowId Identificador de la fila
366 function addRow($content, $attrs = 'comun') {
367 return parent::addRow($content, $attrs);
371 * Convierte un atributo a string
373 * Convierte un atributo HTML al string para pasar a los metodos de HTML_Table
374 * Recibe en $attrs los atributos a modificar.
376 * @param mixed $attrs Atributos.
377 * @param bool $isSet Indica si hay que setear.
382 function _translateAttributes($attrs, $isSet) {
386 if (is_string($attrs)) {
387 $attrs = $this->_parseAttributes($attrs);
390 $rta = $this->_conf['atributos']['celda_comun'];
394 foreach ($attrs as $attr => $val) {
395 $attr = strtolower($attr);
401 $rta = array_merge($rta, $this->_conf['atributos']["celda_$attr"]);
419 $rta["cell$attr"] = $val;
425 trigger_error("No se permite setear el atributo $attr", E_USER_ERROR);
432 * Obtiene la Cascade Style Sheet para esta tabla.
434 * @return string Path 'web' a la css.
437 return $this->_conf['css'];
444 * $tabla->setCabecera(array('Hola', ' ', 'mundo!'));
447 * @param array $cabecera Array de 3 elementos, que son la celda izquierda,
448 * central y derecha de la cabecera (en ese órden).
450 function setCabecera($cabecera) {
451 if (count($pie) != 3) {
452 $this->raiseError('Parámetro incorrecto: debe ser un array de 3 elementos.');
454 $this->_cabecera = $cabecera;
458 * Agrega información a la cabecera de la tabla.
461 * $tabla->updateCabecera('Hola', 'izquierda');
462 * $tabla->updateCabecera('mundo!', 'derecha');
465 * @param mixed $cabecera Celda a agregar a la cabecera. Puede ser un string
466 * o un objeto con un método toHtml().
467 * @param string $lugar Lugar en donde poner la cabecera. Puede ser
468 * 'izquierda', 'centro' o 'derecha'.
470 function updateCabecera($cabecera, $lugar) {
471 if (!$this->_cabecera) {
472 $this->_cabecera = array(' ', ' ', ' ');
474 if ($lugar == 'izquierda') {
475 $this->_cabecera[0] = $cabecera;
476 } elseif ($lugar == 'centro') {
477 $this->_cabecera[1] = $cabecera;
478 } elseif ($lugar == 'derecha') {
479 $this->_cabecera[2] = $cabecera;
481 $this->raiseError('Parámetro incorrecto: lugar debe ser izquierda, centro o derecha.');
488 * @param array $pie Array de 3 elementos, que son la celda izquierda,
489 * central y derecha del pie (en ese órden).
491 * @see Ejemplo en setCabecera().
493 function setPie($pie) {
494 if (count($pie) != 3) {
495 $this->raiseError('Parámetro incorrecto: debe ser un array de 3 elementos.');
501 * Agrega información al pie de la tabla.
503 * @param mixed $pie Celda a agregar al pie. Puede ser un string
504 * o un objeto con un método toHtml().
505 * @param string $lugar Lugar en donde poner el pie. Puede ser
506 * 'izquierda', 'centro' o 'derecha'.
508 * @see Ejemplo en updateCabecera().
510 function updatePie($pie, $lugar) {
512 $this->_pie = array(' ', ' ', ' ');
514 if ($lugar == 'izquierda') {
515 $this->_pie[0] = $pie;
516 } elseif ($lugar == 'centro') {
517 $this->_pie[1] = $pie;
518 } elseif ($lugar == 'derecha') {
519 $this->_pie[2] = $pie;
521 $this->raiseError('Parámetro incorrecto: lugar debe ser izquierda, centro o derecha.');
526 * Agrega un link predefinido a la cabecera o pie de la tabla.
530 * $tabla->addLink('nuevo');
532 * $tabla->addLink('nuevos', 'nuevos.php');
534 * $tabla->addLink('volver',
535 * new MECON_HTML_Link('atras.php'));
536 * $tabla->addLink('anterior',
537 * new MECON_HTML_Link('previo.php', 'Persona Anterior'));
538 * $tabla->addLink('siguiente',
539 * new MECON_HTML_Link('previo.php', 'Siguiente persona',
540 * array('pers' => 'prox')));
543 * @param string $id Identificador del link predefinido. Puede ser 'volver',
544 * 'nuevo', 'nuevos', 'anterior' y 'siguiente'.
545 * @param MECON_HTML_Link $link Link a usar. Si no tiene contenidos, se pone
546 * uno por defecto. Si es null, se pone como
547 * link la página actual.
550 function addLink($id, $link = null) {
552 $link = @$_SERVER['PHP_SELF'];
554 if (is_string($link)) {
555 $link = new MECON_HTML_Link($link, '');
559 $img = new MECON_HTML_Image('/MECON/images/general_nuevo', '-<');
560 // Si no tiene titulo, le pone titulo por defecto.
561 if (!$link->getContents()) {
562 $link->setContents('Nuevo');
564 $link->addContents($img);
565 $this->updateCabecera($link, 'derecha');
568 $img = new MECON_HTML_Image('/MECON/images/general_muchos_nuevo', '-<');
569 // Si no tiene titulo, le pone titulo por defecto.
570 if (!$link->getContents()) {
571 $link->setContents('Nuevos');
573 $link->addContents($img);
574 $this->updateCabecera($link, 'derecha');
577 $img = new MECON_HTML_Image('/MECON/images/general_posterior', '-<');
578 // Si no tiene titulo, le pone titulo por defecto.
579 if (!$link->getContents()) {
580 $link->setContents('Siguiente');
582 $link->addContents($img);
583 $this->updatePie($link, 'derecha');
586 $img = new MECON_HTML_Image('/MECON/images/general_anterior', '>-');
587 // Si no tiene titulo, le pone titulo por defecto.
588 $cont = $link->getContents() ? $link->getContents() : 'Volver';
589 $link->setContents($img);
590 $link->addContents($cont);
591 $this->updateCabecera($link, 'izquierda');
594 $img = new MECON_HTML_Image('/MECON/images/general_anterior', '>-');
595 // Si no tiene titulo, le pone titulo por defecto.
596 $cont = $link->getContents() ? $link->getContents() : 'Anterior';
597 $link->setContents($img);
598 $link->addContents($cont);
599 $this->updatePie($link, 'izquierda');
602 $this->raiseError("No hay un link predefinido llamado '$id'.");
607 * Agrega un páginador a la tabla, basado en un resultado de una base de datos.
610 * $tabla = new MECON_HTML_Tabla();
611 * $result = $db->query('SELECT * FROM tabla');
612 * if (DB::isError($result)) {
615 * $pager = $tabla->addPager($result);
616 * $tabla->addRow(array('Nombre', 'Apellido'), 'cabecera');
617 * if ($pager->numRows()) {
618 * while ($row = $pager->fetchRow(DB_FETCHMODE_ASSOC)) {
619 * $tabla->addRow(array($row['nombre'], $row['apellido']));
622 * $tabla->addRow(array(new MECON_HTML_Error('No se encontraron agentes.')),
623 * array('colspan' => 2));
628 * @param DB_Result $result Resultado de una consulta de base de datos.
629 * @param mixed $tipo Tipo de link(s) a agregar. Puede ser:
631 * <li><tt>'anterior'</tt></li>
632 * <li><tt>'siguiente'</tt></li>
633 * <li><tt>'paginas'</tt></li>
634 * <li><tt>'total'</tt></li>
635 * <li><tt>'info'</tt></li>
637 * Puede pasarse uno solo como un string o varios como un
638 * array. Si se pasa <tt>'todo'</tt>, se incluyen todos.
639 * Si se pasa null, se incluyen <tt>'anterior'</tt>,
640 * <tt>'siguiente'</tt> y <tt>'paginas'</tt>.
641 * @param mixed $link Dirección a la que apuntan los links generados. Puede
642 * ser un MECON_HTML_Link (para poder pasar variables por
644 * @param int $limit Parámetro usado para crear el MECON_DB_Pager.
645 * @param int $maxpages Parámetro usado para crear el MECON_DB_Pager.
647 * @return MECON_DB_Pager Pager que se puede usar para realizar los fetch de
648 * los resultados de la página actual.
650 * @see MECON_DB_Pager
652 function addPager($result, $tipo = null, $link = null, $limit = 10, $maxpages = 21) {
653 // Creo el pager con el resultado.
654 $pager = new MECON_DB_Pager($result, @$_GET['pager_from'], $limit, $maxpages);
655 // Obtengo un link válido.
657 $link = @$_SERVER['PHP_SELF'];
659 if (is_string($link)) {
660 $link = new MECON_HTML_Link($link, '');
662 // Si es el tipo por defecto pone paginador nada más.
664 $tipo = array('anterior', 'paginas', 'siguiente');
666 // Convierte tipo a array.
667 if (!is_array($tipo)) {
668 $tipo = array($tipo);
670 // Si se quiere mostrar todas las decoraciones del paginador.
671 if (in_array('todo', $tipo)) {
672 $tipo = array('anterior', 'paginas', 'siguiente', 'total', 'info');
674 // Me fijo si tiene cada uno de los elementos y los agrego.
675 if (in_array('anterior', $tipo) and $pager->numRows() and $pager->currentpage != 1) {
676 $link->setGetVar('pager_from', $pager->prev);
677 $this->addLink('anterior', $link);
679 if (in_array('siguiente', $tipo) and $pager->numRows() and $pager->currentpage != $pager->numpages) {
680 $link->setGetVar('pager_from', $pager->next);
681 $this->addLink('siguiente', $link);
683 if (in_array('paginas', $tipo) and $pager->numRows() and $pager->numpages > 1) {
684 $from = @$_GET['pager_from'];
686 $lnk = $link->getContents();
687 foreach ($pager->pages as $page => $start_row) {
688 if ($start_row == $from) {
691 $link->setGetVar('pager_from', $start_row);
692 $link->setContents($page);
693 $pags .= $link->toHtml();
695 if ($page != $pager->lastpage) {
699 $link->setContents($lnk);
700 $this->updatePie($pags, 'centro');
702 if (in_array('total', $tipo) and $pager->numRows()) {
703 $this->updateCabecera('Se encontraron ' . $pager->numrows . ' resultados.', 'izquierda');
705 if (in_array('info', $tipo) and $pager->numRows()) {
706 $this->updateCabecera('Página ' . $pager->currentpage . ' de ' . $pager->numpages
707 . ' - ' . $pager->limit . ' resultados por página.', 'derecha');