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';
31 * Libreria para le manejo de las tablas de los sistemas de intranet.
34 class MECON_HTML_Tabla extends HTML_Table {
37 * Valores de Configuracion particular
45 * Atributos de las tablas.
53 * Íconos e información que va arriba de la tabla.
58 var $_cabecera = array();
61 * Íconos e información que va abajo de la tabla.
70 * Puede recibir como parametro un string con los atributos que se
71 * quieren dar a la tabla en cuestion. Estos atributos estan
72 * seteados por default segun el archivo de configuracion.
73 * Ademas puede recibir la indicacion de algun estilo en particular.
75 * @param mixed $atributos Atributos diferentes a los estandares para la tabla
76 * @param string $estilo Tipo de tabla
80 function MECON_HTML_Tabla($attrs = null, $estilo = 'comun') {
81 // Obtengo los valores particulares de configuracion.
82 $this->_conf = include(dirname(__FILE__) . '/Tabla/estilo_' . $estilo . '.php');
83 // Seteo los atributos para la tabla
84 $this->_attrs = $this->_conf['atributos']['tabla_comun'];
85 //Genero el objeto HTML_Table
86 if (is_string($attrs)) {
87 $attrs = $this->_parseAttributes($attrs);
89 if (is_array($attrs)) {
90 if (isset($attrs['width'])) {
91 $this->_attrs['width'] = $attrs['width'];
93 if (isset($attrs['bgcolor'])) {
94 $this->_attrs['bgcolor'] = $attrs['bgcolor'];
96 if (isset($attrs['cellspacing'])) {
97 $this->_attrs['cellspacing'] = $attrs['cellspacing'];
99 if (isset($attrs['cellpadding'])) {
100 $this->_attrs['cellpadding'] = $attrs['cellpadding'];
103 $this->HTML_Table($this->_attrs);
104 if (isset($attrs['align'])) {
105 $this->_attrs['align'] = $attrs['align'];
111 * Agrega una fila del tipo cabecera tomando colores y demas del
112 * archivo de configuracion. Recibe como parametro un array con
113 * los datos a incluir en la linea. Agrega tantas columnas como
114 * elementos tenga el array. Si no recibe parametro alguno,
115 * inserta una fila en blanco. Devuelve el identificador de la
116 * fila en donde inserto los datos.
118 * @param array() $contenido Contenido de la fila
120 * @return int Identificador de Linea
124 function agregarFilaCabecera($contenido = '', $atributos = '') {
125 return $this->addRow($contenido, 'cabecera');
129 * Agrega una fila del tipo comun, tomando colores y demas del
130 * archivo de configuracion. Recibe como parametro un array con
131 * los datos a incluir en la linea. Agrega tantas columnas como
132 * elementos tenga el array. Si no recibe parametro alguno,
133 * inserta una fila en blanco. Devuelve el identificador de la
134 * fila en donde inserto los datos.
136 * @param array() $contenido Contenido de la fila
138 * @return int Identificador de Linea
143 function agregarFila($contenido = '') {
144 return $this->addRow($contenido, 'comun');
148 * Modifica el atributo rowSpan a la celda pasada por parametro
150 * @param int $fila Identificador de la fila que se quiere modificar
151 * @param int $columna Identificador de la columna que se quiere modificar
152 * @param int $valor Atributo a modificar
157 function rowSpan($fila, $columna, $valor) {
158 return $this->updateCellAttributes($fila, $columna, 'rowspan="'.$valor.'"');
162 * Modifica el atributo colSpan a la celda pasada por parametro
164 * @param int $fila Identificador de la fila que se quiere modificar
165 * @param int $columna Identificador de la columna que se quiere modificar
166 * @param int $valor Atributo a modificar
171 function colSpan($fila, $columna, $valor) {
172 return $this->updateCellAttributes($fila, $columna, 'colspan="'.$valor.'"');
176 * Modifica el atributo aling de la celda pasada por parametro
178 * @param int $fila Identificador de la fila que se quiere modificar
179 * @param int $columna Identificador de la columna que se quiere modificar
180 * @param string $valor Atributo a modificar
185 function align($fila, $columna, $valor) {
186 return $this->updateCellAttributes($fila, $columna, 'align="'.$valor.'"');
190 * Setea una columna como del tipo cabecera
192 * @param int $columna Identificador de la columna que se quiere modificar
197 function setColCabecera($columna) {
198 return $this->updateColAttributes($columna, 'cabecera');
202 * Setea una columna como del tipo titulo
204 * @param int $columna Identificador de la columna que se quiere modificar
209 function setColTitulo($columna) {
210 return $this->updateColAttributes($columna, 'titulo');
214 * Alinea una columna entera
216 * @param int $columna Identificador de la columna que se quiere modificar
217 * @param string $valor Valor
222 function setColAlign($columna, $valor) {
223 return $this->updateColAttributes($columna,'align="'.$valor.'"');
227 * Cambia el tamanio de una columna entera
229 * @param int $columna Identificadore de la columna que se quiere modificar
230 * @param string $valor Valor
235 function setColWidth($columna, $valor) {
236 return $this->updateColAttributes($columna,'width="'.$valor.'"');
240 * Cambia el color de fondo de una celda
242 * @param int $fila Identificador de la fila que se quiere modificar
243 * @param int $columna Identificador de la columna que se quiere modificar
244 * @param string $valor Atributo a modificar
249 function setCellBgcolor($fila, $columna, $valor) {
250 return $this->updateCellAttributes($fila, $columna,'bgcolor="'.$valor.'"');
254 * Devuelve el html de la tabla
256 * Devuelve el html de la tabla para que sea mostrado.
257 * Como parametro recibe el indicador de tabla simple.
258 * Si $simple es falso, devuelve el html comun y corriente (con 2
259 * tablas), si es false devuelve una tabla sola.
261 * @param bool $simple Tipo de tabla que se quiere recibir.
263 * @return string Html
267 function toHtml($simple = 0) {
269 $result = parent::toHtml();
270 // Agregar la tabla de fondo.
272 $contenedora = $this->_conf['atributos']['tabla_contenedora'];
273 $contenedora['width'] = $this->getAttribute('width');
274 $contenedora['align'] = $this->_attrs['align'];
275 $this->updateAttributes(array('width' => '100%'));
276 $tabla_externa = new HTML_Table($contenedora);
277 $tabla_externa->addRow(array(parent::toHtml()),
278 $this->_conf['atributos']['celda_contenedora']);
279 $result = $tabla_externa->toHtml();
281 // Si tiene pie o cabecera, crea tabla.
282 if ($this->_cabecera or $this->_pie) {
283 $tabla_externa = new HTML_Table(array('width'=>'100%','border'=>0));
285 // Si tiene cabecera, la agrega.
286 if ($this->_cabecera) {
287 $tabla_externa->addRow($this->_cabecera, array(
288 'valign' => 'middle',
291 $tabla_externa->updateCellAttributes(0, 0, array('align' => 'left'));
292 $tabla_externa->updateCellAttributes(0, 1, array('align' => 'center'));
293 $tabla_externa->updateCellAttributes(0, 2, array('align' => 'right'));
295 // Si tiene cabecera o pie, agrega la tabla original.
296 if ($this->_cabecera or $this->_pie) {
297 //$id = $tabla_externa->addRow($result);
298 $tabla_externa->addRow(array($result), array(
300 'valign' => 'middle',
305 // Si tiene pie, lo agrega.
307 $id = $tabla_externa->addRow($this->_pie, array(
308 'valign' => 'middle',
311 $tabla_externa->updateCellAttributes($id, 0, array('align' => 'left'));
312 $tabla_externa->updateCellAttributes($id, 1, array('align' => 'center'));
313 $tabla_externa->updateCellAttributes($id, 2, array('align' => 'right'));
315 return ($this->_cabecera or $this->_pie) ? $tabla_externa->toHtml() : $result;
319 * Cambia las propiedades de una celda
321 * Cambia las propiedades de una celda. Si $attrs es un array
322 * asociativo, se setean los atributos representados por las claves
325 * @param int $row Identificador de la fila que se quiere modificar
326 * @param int $col Identificador de la columna que se quiere modificar
327 * @param mixed $attrs Atributo a modificar
331 function updateCellAttributes($row, $col, $attrs) {
332 return parent::updateCellAttributes($row, $col, $this->_translateAttributes($attrs, false));
336 * Establece las propiedades de una celda
338 * Establece las propiedades de una celda. Si $attrs es un array
339 * asociativo, se setean los atributos representados por las claves
342 * @param int $row Identificador de la fila que se quiere modificar
343 * @param int $col Identificador de la columna que se quiere modificar
344 * @param mixed $attrs Atributo a modificar
348 function setCellAttributes($row, $col, $attrs) {
349 return parent::setCellAttributes($row, $col, $this->_translateAttributes($attrs, true));
355 * Agrega una fila. El contenido es el que viene representado por
356 * el array $content. Recibe los atributos en la variable $attrs
358 * @param mixed $content Contenido
359 * @param mixed $attrs Atributos
361 * @return int $rowId Identificador de la fila
365 function addRow($content, $attrs = 'comun') {
366 return parent::addRow($content, $attrs);
370 * Convierte un atributo a string
372 * Convierte un atributo HTML al string para pasar a los metodos de HTML_Table
373 * Recibe en $attrs los atributos a modificar.
375 * @param mixed $attrs Atributos.
376 * @param bool $isSet Indica si hay que setear.
381 function _translateAttributes($attrs, $isSet) {
385 if (is_string($attrs)) {
386 $attrs = $this->_parseAttributes($attrs);
389 $rta = $this->_conf['atributos']['celda_comun'];
393 foreach ($attrs as $attr => $val) {
394 $attr = strtolower($attr);
400 $rta = array_merge($rta, $this->_conf['atributos']["celda_$attr"]);
418 $rta["cell$attr"] = $val;
424 trigger_error("No se permite setear el atributo $attr", E_USER_ERROR);
431 * Obtiene la Cascade Style Sheet para esta tabla.
433 * @return string Path 'web' a la css.
436 return $this->_conf['css'];
443 * $tabla->setCabecera(array('Hola', ' ', 'mundo!'));
446 * @param array $cabecera Array de 3 elementos, que son la celda izquierda,
447 * central y derecha de la cabecera (en ese órden).
449 function setCabecera($cabecera) {
450 if (count($pie) != 3) {
451 $this->raiseError('Parámetro incorrecto: debe ser un array de 3 elementos.');
453 $this->_cabecera = $cabecera;
457 * Agrega información a la cabecera de la tabla.
460 * $tabla->updateCabecera('Hola', 'izquierda');
461 * $tabla->updateCabecera('mundo!', 'derecha');
464 * @param mixed $cabecera Celda a agregar a la cabecera. Puede ser un string
465 * o un objeto con un método toHtml().
466 * @param string $lugar Lugar en donde poner la cabecera. Puede ser
467 * 'izquierda', 'centro' o 'derecha'.
469 function updateCabecera($cabecera, $lugar) {
470 if (!$this->_cabecera) {
471 $this->_cabecera = array(' ', ' ', ' ');
473 if ($lugar == 'izquierda') {
474 $this->_cabecera[0] = $cabecera;
475 } elseif ($lugar == 'centro') {
476 $this->_cabecera[1] = $cabecera;
477 } elseif ($lugar == 'derecha') {
478 $this->_cabecera[2] = $cabecera;
480 $this->raiseError('Parámetro incorrecto: lugar debe ser izquierda, centro o derecha.');
487 * @param array $pie Array de 3 elementos, que son la celda izquierda,
488 * central y derecha del pie (en ese órden).
490 * @see Ejemplo en setCabecera().
492 function setPie($pie) {
493 if (count($pie) != 3) {
494 $this->raiseError('Parámetro incorrecto: debe ser un array de 3 elementos.');
500 * Agrega información al pie de la tabla.
502 * @param mixed $pie Celda a agregar al pie. Puede ser un string
503 * o un objeto con un método toHtml().
504 * @param string $lugar Lugar en donde poner el pie. Puede ser
505 * 'izquierda', 'centro' o 'derecha'.
507 * @see Ejemplo en updateCabecera().
509 function updatePie($pie, $lugar) {
511 $this->_pie = array(' ', ' ', ' ');
513 if ($lugar == 'izquierda') {
514 $this->_pie[0] = $pie;
515 } elseif ($lugar == 'centro') {
516 $this->_pie[1] = $pie;
517 } elseif ($lugar == 'derecha') {
518 $this->_pie[2] = $pie;
520 $this->raiseError('Parámetro incorrecto: lugar debe ser izquierda, centro o derecha.');
525 * Agrega un link predefinido a la cabecera o pie de la tabla.
529 * $tabla->addLink('nuevo');
531 * $tabla->addLink('nuevos', 'nuevos.php');
533 * $tabla->addLink('volver',
534 * new MECON_HTML_Link('atras.php'));
535 * $tabla->addLink('anterior',
536 * new MECON_HTML_Link('previo.php', 'Persona Anterior'));
537 * $tabla->addLink('siguiente',
538 * new MECON_HTML_Link('previo.php', 'Siguiente persona',
539 * array('pers' => 'prox')));
542 * @param string $id Identificador del link predefinido. Puede ser 'volver',
543 * 'nuevo', 'nuevos', 'anterior' y 'siguiente'.
544 * @param MECON_HTML_Link $link Link a usar. Si no tiene contenidos, se pone
545 * uno por defecto. Si es null, se pone como
546 * link la página actual.
549 function addLink($id, $link = null) {
551 $link = @$_SERVER['PHP_SELF'];
553 if (is_string($link)) {
554 $link = new MECON_HTML_Link($link, '');
558 $img = new MECON_HTML_Image('/MECON/images/general_nuevo', '-<');
559 // Si no tiene titulo, le pone titulo por defecto.
560 if (!$link->getContents()) {
561 $link->setContents('Nuevo');
563 $link->addContents($img);
564 $this->updateCabecera($link, 'derecha');
567 $img = new MECON_HTML_Image('/MECON/images/general_muchos_nuevo', '-<');
568 // Si no tiene titulo, le pone titulo por defecto.
569 if (!$link->getContents()) {
570 $link->setContents('Nuevos');
572 $link->addContents($img);
573 $this->updateCabecera($link, 'derecha');
576 $img = new MECON_HTML_Image('/MECON/images/general_posterior', '-<');
577 // Si no tiene titulo, le pone titulo por defecto.
578 if (!$link->getContents()) {
579 $link->setContents('Siguiente');
581 $link->addContents($img);
582 $this->updatePie($link, 'derecha');
585 $img = new MECON_HTML_Image('/MECON/images/general_anterior', '>-');
586 // Si no tiene titulo, le pone titulo por defecto.
587 $cont = $link->getContents() ? $link->getContents() : 'Volver';
588 $link->setContents($img);
589 $link->addContents($cont);
590 $this->updateCabecera($link, 'izquierda');
593 $img = new MECON_HTML_Image('/MECON/images/general_anterior', '>-');
594 // Si no tiene titulo, le pone titulo por defecto.
595 $cont = $link->getContents() ? $link->getContents() : 'Anterior';
596 $link->setContents($img);
597 $link->addContents($cont);
598 $this->updatePie($link, 'izquierda');
601 $this->raiseError("No hay un link predefinido llamado '$id'.");