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/HTML/Link.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 $attrs 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 * Devuelve el html de la tabla
114 * Devuelve el html de la tabla para que sea mostrado.
115 * Como parametro recibe el indicador de tabla simple.
116 * Si $simple es falso, devuelve el html comun y corriente (con 2
117 * tablas), si es false devuelve una tabla sola.
119 * @param bool $simple Tipo de tabla que se quiere recibir.
121 * @return string Html
125 function toHtml($simple = 0) {
127 $result = parent::toHtml();
128 // Agregar la tabla de fondo.
130 $contenedora = $this->_conf['atributos']['tabla_contenedora'];
131 $contenedora['width'] = $this->getAttribute('width');
132 $contenedora['align'] = $this->_attrs['align'];
133 $this->updateAttributes(array('width' => '100%'));
134 $tabla_externa = new HTML_Table($contenedora);
135 $tabla_externa->addRow(array(parent::toHtml()),
136 $this->_conf['atributos']['celda_contenedora']);
137 $result = $tabla_externa->toHtml();
139 // Si tiene pie o cabecera, crea tabla.
140 if ($this->_cabecera or $this->_pie) {
141 $tabla_externa = new HTML_Table(array('width'=>'100%','border'=>0));
143 // Si tiene cabecera, la agrega.
144 $this->_addSpecialRow($this->_cabecera, $tabla_externa);
145 // Si tiene cabecera o pie, agrega la tabla original.
146 if ($this->_cabecera or $this->_pie) {
147 //$id = $tabla_externa->addRow($result);
148 $tabla_externa->addRow(array($result), array(
150 'valign' => 'middle',
155 // Si tiene pie, lo agrega.
156 $this->_addSpecialRow($this->_pie, $tabla_externa);
157 return ($this->_cabecera or $this->_pie) ? $tabla_externa->toHtml() : $result;
160 function _addSpecialRow($array, &$tabla) {
163 foreach ($array as $key => $val) {
164 $row[$key] = $val ? $val : ' ';
166 $id = $tabla->addRow($row, array(
167 'valign' => 'middle',
170 // Si no hay celda central, hace colspan.
171 if ($array[0] and !$array[1]) {
172 $tabla->updateCellAttributes($id, 0, array(
175 /* } XXX se complica hacer el colspan para atras:
176 elseif ($array[2] and !$array[1]) {
177 $tabla->updateCellAttributes($id, 1, array(
179 'width' => '67%')); */
181 $tabla->updateCellAttributes($id, 0, array('align' => 'left'));
182 $tabla->updateCellAttributes($id, 1, array('align' => 'center'));
183 $tabla->updateCellAttributes($id, 2, array('align' => 'right'));
188 * Cambia las propiedades de una celda
190 * Cambia las propiedades de una celda. Si $attrs es un array
191 * asociativo, se setean los atributos representados por las claves
194 * @param int $row Identificador de la fila que se quiere modificar
195 * @param int $col Identificador de la columna que se quiere modificar
196 * @param mixed $attrs Atributo a modificar
200 function updateCellAttributes($row, $col, $attrs) {
201 return parent::updateCellAttributes($row, $col, $this->_translateAttributes($attrs, false));
205 * Establece las propiedades de una celda
207 * Establece las propiedades de una celda. Si $attrs es un array
208 * asociativo, se setean los atributos representados por las claves
211 * @param int $row Identificador de la fila que se quiere modificar
212 * @param int $col Identificador de la columna que se quiere modificar
213 * @param mixed $attrs Atributo a modificar
217 function setCellAttributes($row, $col, $attrs) {
218 return parent::setCellAttributes($row, $col, $this->_translateAttributes($attrs, true));
224 * Agrega una fila. El contenido es el que viene representado por
225 * el array $content. Recibe los atributos en la variable $attrs
227 * @param mixed $content Contenido
228 * @param mixed $attrs Atributos
230 * @return int $rowId Identificador de la fila
234 function addRow($content, $attrs = 'comun') {
235 return parent::addRow($content, $attrs);
239 * Convierte un atributo a string
241 * Convierte un atributo HTML al string para pasar a los metodos de HTML_Table
242 * Recibe en $attrs los atributos a modificar.
244 * @param mixed $attrs Atributos.
245 * @param bool $isSet Indica si hay que setear.
250 function _translateAttributes($attrs, $isSet) {
254 if (is_string($attrs)) {
255 $attrs = $this->_parseAttributes($attrs);
258 $rta = $this->_conf['atributos']['celda_comun'];
262 foreach ($attrs as $attr => $val) {
263 $attr = strtolower($attr);
269 $rta = array_merge($rta,
270 $this->_conf['atributos']["celda_$attr"]);
289 $rta["cell$attr"] = $val;
295 $tmp = $this->_conf['atributos']['celda_comun'];
296 $tmp['bgcolor'] = $this->_conf['atributos']['celda_titulo']['bgcolor'];
297 $tmp['class'] = $this->_conf['atributos']['celda_titulo']['class'];
298 $rta = array_merge($rta, $tmp);
302 $tmp = $this->_conf['atributos']['celda_comun'];
303 $tmp['bgcolor'] = $this->_conf['atributos']['celda_cabecera']['bgcolor'];
304 $tmp['class'] = $this->_conf['atributos']['celda_cabecera']['class'];
305 $rta = array_merge($rta, $tmp);
309 trigger_error("No se permite setear el atributo $attr", E_USER_ERROR);
316 * Obtiene la Cascade Style Sheet para esta tabla.
318 * @return string Path 'web' a la css.
321 return $this->_conf['css'];
328 * $tabla->setCabecera(array('Hola', '', 'mundo!'));
331 * @param array $cabecera Array de 3 elementos, que son la celda izquierda,
332 * central y derecha de la cabecera (en ese órden).
334 function setCabecera($cabecera) {
335 if (count($pie) != 3) {
336 $this->raiseError('Parámetro incorrecto: debe ser un array de 3 elementos.');
338 $this->_cabecera = $cabecera;
342 * Agrega información a la cabecera de la tabla.
345 * $tabla->updateCabecera('Hola', 'izquierda');
346 * $tabla->updateCabecera('mundo!', 'derecha');
349 * @param mixed $cabecera Celda a agregar a la cabecera. Puede ser un string
350 * o un objeto con un método toHtml().
351 * @param string $lugar Lugar en donde poner la cabecera. Puede ser
352 * 'izquierda', 'centro' o 'derecha'.
354 function updateCabecera($cabecera, $lugar) {
355 if (!$this->_cabecera) {
356 $this->_cabecera = array('', '', '');
358 if ($lugar == 'izquierda') {
359 $this->_cabecera[0] = $cabecera;
360 } elseif ($lugar == 'centro') {
361 $this->_cabecera[1] = $cabecera;
362 } elseif ($lugar == 'derecha') {
363 $this->_cabecera[2] = $cabecera;
365 $this->raiseError('Parámetro incorrecto: lugar debe ser izquierda, centro o derecha.');
372 * @param array $pie Array de 3 elementos, que son la celda izquierda,
373 * central y derecha del pie (en ese órden).
375 * @see Ejemplo en setCabecera().
377 function setPie($pie) {
378 if (count($pie) != 3) {
379 $this->raiseError('Parámetro incorrecto: debe ser un array de 3 elementos.');
385 * Agrega información al pie de la tabla.
387 * @param mixed $pie Celda a agregar al pie. Puede ser un string
388 * o un objeto con un método toHtml().
389 * @param string $lugar Lugar en donde poner el pie. Puede ser
390 * 'izquierda', 'centro' o 'derecha'.
392 * @see Ejemplo en updateCabecera().
394 function updatePie($pie, $lugar) {
396 $this->_pie = array('', '', '');
398 if ($lugar == 'izquierda') {
399 $this->_pie[0] = $pie;
400 } elseif ($lugar == 'centro') {
401 $this->_pie[1] = $pie;
402 } elseif ($lugar == 'derecha') {
403 $this->_pie[2] = $pie;
405 $this->raiseError('Parámetro incorrecto: lugar debe ser izquierda, centro o derecha.');
410 * Agrega un link predefinido a la cabecera o pie de la tabla.
414 * $tabla->addLink('nuevo');
416 * $tabla->addLink('nuevos', 'nuevos.php');
418 * $tabla->addLink('volver',
419 * new MECON_HTML_Link('atras.php'));
420 * $tabla->addLink('anterior',
421 * new MECON_HTML_Link('previo.php', 'Persona Anterior'));
422 * $tabla->addLink('siguiente',
423 * new MECON_HTML_Link('previo.php', 'Siguiente persona',
424 * array('pers' => 'prox')));
427 * @param string $id Identificador del link predefinido. Puede ser 'volver',
428 * 'nuevo', 'nuevos', 'buscar', 'anterior' y 'siguiente'.
429 * @param MECON_HTML_Link $link Link a usar. Si no tiene contenidos, se pone
430 * uno por defecto. Si es null, se pone como
431 * link la página actual.
434 function addLink($id, $link = null) {
436 $link = @$_SERVER['PHP_SELF'];
438 if (is_string($link)) {
439 $link = new MECON_HTML_Link($link, '');
443 $img = new MECON_HTML_Image('/MECON/images/general_nuevo', '->');
444 // Si no tiene titulo, le pone titulo por defecto.
445 if (!$link->getContents()) {
446 $link->setContents('Nuevo');
448 $link->addContents($img);
449 $this->updateCabecera($link, 'derecha');
452 $img = new MECON_HTML_Image('/MECON/images/general_muchos_nuevo', '->');
453 // Si no tiene titulo, le pone titulo por defecto.
454 if (!$link->getContents()) {
455 $link->setContents('Nuevos');
457 $link->addContents($img);
458 $this->updateCabecera($link, 'derecha');
461 $img = new MECON_HTML_Image('/MECON/images/general_lupa', 'Q');
462 // Si no tiene titulo, le pone titulo por defecto.
463 if (!$link->getContents()) {
464 $link->setContents('Buscar');
466 $link->addContents($img);
467 $this->updateCabecera($link, 'derecha');
470 $img = new MECON_HTML_Image('/MECON/images/general_posterior', '->');
471 // Si no tiene titulo, le pone titulo por defecto.
472 if (!$link->getContents()) {
473 $link->setContents('Siguiente');
475 $link->addContents($img);
476 $this->updatePie($link, 'derecha');
479 $img = new MECON_HTML_Image('/MECON/images/general_anterior', '<-');
480 // Si no tiene titulo, le pone titulo por defecto.
481 $cont = $link->getContents() ? $link->getContents() : 'Volver';
482 $link->setContents($img);
483 $link->addContents($cont);
484 $this->updateCabecera($link, 'izquierda');
487 $img = new MECON_HTML_Image('/MECON/images/general_anterior', '<-');
488 // Si no tiene titulo, le pone titulo por defecto.
489 $cont = $link->getContents() ? $link->getContents() : 'Anterior';
490 $link->setContents($img);
491 $link->addContents($cont);
492 $this->updatePie($link, 'izquierda');
495 $this->raiseError("No hay un link predefinido llamado '$id'.");