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 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 General Public License for more details.
16 You should have received a copy of the GNU General Public License; if not,
17 write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
18 Boston, MA 02111-1307 USA
19 -------------------------------------------------------------------------------
20 Creado: fri mar 21 ART 2003
21 Autor: Martin Marrese <mmarre@mecon.gov.ar>
22 -------------------------------------------------------------------------------
24 -----------------------------------------------------------------------------*/
26 require_once 'HTML/Table.php';
27 require_once 'MLIB/HTML/Image.php';
28 require_once 'MLIB/HTML/Link.php';
31 * Libreria para le manejo de las tablas de los sistemas de intranet.
34 class MLIB_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 $attrs Atributos diferentes a los estandares para la tabla
76 * @param string $estilo Tipo de tabla
80 function MLIB_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 * Devuelve el html de la tabla
113 * Devuelve el html de la tabla para que sea mostrado.
114 * Como parametro recibe el indicador de tabla simple.
115 * Si $simple es falso, devuelve el html comun y corriente (con 2
116 * tablas), si es false devuelve una tabla sola.
118 * @param bool $simple Tipo de tabla que se quiere recibir.
120 * @return string Html
124 function toHtml($simple = 0) {
126 $result = parent::toHtml();
127 // Agregar la tabla de fondo.
129 $contenedora = $this->_conf['atributos']['tabla_contenedora'];
130 $contenedora['width'] = $this->getAttribute('width');
131 $contenedora['align'] = $this->_attrs['align'];
132 $this->updateAttributes(array('width' => '100%'));
133 $tabla_externa = new HTML_Table($contenedora);
134 $tabla_externa->addRow(array(parent::toHtml()),
135 $this->_conf['atributos']['celda_contenedora']);
136 $result = $tabla_externa->toHtml();
138 // Si tiene pie o cabecera, crea tabla.
139 if ($this->_cabecera or $this->_pie) {
140 $tabla_externa = new HTML_Table(array('width'=>'100%','border'=>0));
142 // Si tiene cabecera, la agrega.
143 $this->_addSpecialRow($this->_cabecera, $tabla_externa);
144 // Si tiene cabecera o pie, agrega la tabla original.
145 if ($this->_cabecera or $this->_pie) {
146 //$id = $tabla_externa->addRow($result);
147 $tabla_externa->addRow(array($result), array(
149 'valign' => 'middle',
154 // Si tiene pie, lo agrega.
155 $this->_addSpecialRow($this->_pie, $tabla_externa);
156 return ($this->_cabecera or $this->_pie) ? $tabla_externa->toHtml() : $result;
159 function _addSpecialRow($array, &$tabla) {
162 foreach ($array as $key => $val) {
163 $row[$key] = $val ? $val : ' ';
165 $id = $tabla->addRow($row, array(
166 'valign' => 'middle',
169 // Si no hay celda central, hace colspan.
170 if ($array[0] and !$array[1]) {
171 $tabla->updateCellAttributes($id, 0, array(
174 /* } XXX se complica hacer el colspan para atras:
175 elseif ($array[2] and !$array[1]) {
176 $tabla->updateCellAttributes($id, 1, array(
178 'width' => '67%')); */
180 $tabla->updateCellAttributes($id, 0, array('align' => 'left'));
181 $tabla->updateCellAttributes($id, 1, array('align' => 'center'));
182 $tabla->updateCellAttributes($id, 2, array('align' => 'right'));
187 * Cambia las propiedades de una celda
189 * Cambia las propiedades de una celda. Si $attrs es un array
190 * asociativo, se setean los atributos representados por las claves
193 * @param int $row Identificador de la fila que se quiere modificar
194 * @param int $col Identificador de la columna que se quiere modificar
195 * @param mixed $attrs Atributo a modificar
199 function updateCellAttributes($row, $col, $attrs) {
200 return parent::updateCellAttributes($row, $col, $this->_translateAttributes($attrs, false));
204 * Establece las propiedades de una celda
206 * Establece las propiedades de una celda. Si $attrs es un array
207 * asociativo, se setean los atributos representados por las claves
210 * @param int $row Identificador de la fila que se quiere modificar
211 * @param int $col Identificador de la columna que se quiere modificar
212 * @param mixed $attrs Atributo a modificar
216 function setCellAttributes($row, $col, $attrs) {
217 return parent::setCellAttributes($row, $col, $this->_translateAttributes($attrs, true));
223 * Agrega una fila. El contenido es el que viene representado por
224 * el array $content. Recibe los atributos en la variable $attrs
226 * @param mixed $content Contenido
227 * @param mixed $attrs Atributos
229 * @return int $rowId Identificador de la fila
233 function addRow($content, $attrs = 'comun') {
234 return parent::addRow($content, $attrs);
238 * Convierte un atributo a string
240 * Convierte un atributo HTML al string para pasar a los metodos de HTML_Table
241 * Recibe en $attrs los atributos a modificar.
243 * @param mixed $attrs Atributos.
244 * @param bool $isSet Indica si hay que setear.
249 function _translateAttributes($attrs, $isSet) {
253 if (is_string($attrs)) {
254 $attrs = $this->_parseAttributes($attrs);
257 $rta = $this->_conf['atributos']['celda_comun'];
261 foreach ($attrs as $attr => $val) {
262 $attr = strtolower($attr);
281 $rta["cell$attr"] = $val;
287 //HAY QUE SACAR LAS LINEAS QUE CONTIENEN $rta[$attr] = $attr;
288 //que son reemplazadas por las que tienen $rta['mlib_style'] = $attr;
289 //El estilo mlib_style es utilizado internamente y no representa
290 //nada en el html generado.
291 //Ej: Sirve para poder asignar un estilo especifico a una celda
292 //para que MLIB_PDF_Tabla lo interprete.
293 //Esto nos da mas flexibilidad.
295 $rta['mlib_style'] = $val;
300 $rta = array_merge($rta,
301 $this->_conf['atributos']["celda_$attr"]);
303 $rta['mlib_style'] = $attr;
306 $tmp = $this->_conf['atributos']['celda_comun'];
307 $tmp['bgcolor'] = $this->_conf['atributos']['celda_titulo']['bgcolor'];
308 $tmp['class'] = $this->_conf['atributos']['celda_titulo']['class'];
309 $rta = array_merge($rta, $tmp);
311 $rta['mlib_style'] = $attr;
314 $tmp = $this->_conf['atributos']['celda_comun'];
315 $tmp['bgcolor'] = $this->_conf['atributos']['celda_cabecera']['bgcolor'];
316 $tmp['class'] = $this->_conf['atributos']['celda_cabecera']['class'];
317 $rta = array_merge($rta, $tmp);
319 $rta['mlib_style'] = $attr;
322 $tmp = $this->_conf['atributos']['celda_comun'];
323 $tmp['class'].= '_clara';
324 $rta = array_merge($rta,
325 $this->_conf['atributos']["celda_comun"]);
327 $rta['mlib_style'] = $attr;
330 trigger_error("No se permite setear el atributo $attr", E_USER_ERROR);
337 * Obtiene la Cascade Style Sheet para esta tabla.
339 * @return string Path 'web' a la css.
342 return $this->_conf['css'];
349 * $tabla->setCabecera(array('Hola', '', 'mundo!'));
352 * @param array $cabecera Array de 3 elementos, que son la celda izquierda,
353 * central y derecha de la cabecera (en ese órden).
355 function setCabecera($cabecera) {
356 if (count($cabecera) != 3) {
357 $this->raiseError('Parámetro incorrecto: debe ser un array de 3 elementos.');
359 $this->_cabecera = $cabecera;
363 * Agrega información a la cabecera de la tabla.
366 * $tabla->updateCabecera('Hola', 'izquierda');
367 * $tabla->updateCabecera('mundo!', 'derecha');
370 * @param mixed $cabecera Celda a agregar a la cabecera. Puede ser un string
371 * o un objeto con un método toHtml().
372 * @param string $lugar Lugar en donde poner la cabecera. Puede ser
373 * 'izquierda', 'centro' o 'derecha'.
375 function updateCabecera($cabecera, $lugar) {
376 if (!$this->_cabecera) {
377 $this->_cabecera = array('', '', '');
379 if ($lugar == 'izquierda') {
380 $this->_cabecera[0] = $cabecera;
381 } elseif ($lugar == 'centro') {
382 $this->_cabecera[1] = $cabecera;
383 } elseif ($lugar == 'derecha') {
384 $this->_cabecera[2] = $cabecera;
386 $this->raiseError('Parámetro incorrecto: lugar debe ser izquierda, centro o derecha.');
393 * @param array $pie Array de 3 elementos, que son la celda izquierda,
394 * central y derecha del pie (en ese órden).
396 * @see Ejemplo en setCabecera().
398 function setPie($pie) {
399 if (count($pie) != 3) {
400 $this->raiseError('Parámetro incorrecto: debe ser un array de 3 elementos.');
406 * Agrega información al pie de la tabla.
408 * @param mixed $pie Celda a agregar al pie. Puede ser un string
409 * o un objeto con un método toHtml().
410 * @param string $lugar Lugar en donde poner el pie. Puede ser
411 * 'izquierda', 'centro' o 'derecha'.
413 * @see Ejemplo en updateCabecera().
415 function updatePie($pie, $lugar) {
417 $this->_pie = array('', '', '');
419 if ($lugar == 'izquierda') {
420 $this->_pie[0] = $pie;
421 } elseif ($lugar == 'centro') {
422 $this->_pie[1] = $pie;
423 } elseif ($lugar == 'derecha') {
424 $this->_pie[2] = $pie;
426 $this->raiseError('Parámetro incorrecto: lugar debe ser izquierda, centro o derecha.');
431 * Agrega un link predefinido a la cabecera o pie de la tabla.
435 * $tabla->addLink('nuevo');
437 * $tabla->addLink('nuevos', 'nuevos.php');
439 * $tabla->addLink('volver',
440 * new MLIB_HTML_Link('atras.php'));
441 * $tabla->addLink('anterior',
442 * new MLIB_HTML_Link('previo.php', 'Persona Anterior'));
443 * $tabla->addLink('siguiente',
444 * new MLIB_HTML_Link('previo.php', 'Siguiente persona',
445 * array('pers' => 'prox')));
448 * @param string $id Identificador del link predefinido. Puede ser 'volver',
449 * 'nuevo', 'nuevos', 'buscar', 'anterior' y 'siguiente'.
450 * @param MLIB_HTML_Link $link Link a usar. Si no tiene contenidos, se pone
451 * uno por defecto. Si es null, se pone como
452 * link la página actual.
455 function addLink($id, $link = null) {
457 $link = @$_SERVER['PHP_SELF'];
459 if (is_string($link)) {
460 $link = new MLIB_HTML_Link($link, '');
464 $img = new MLIB_HTML_Image('/MLIB/images/general_nuevo', ' >>');
465 // Si no tiene titulo, le pone titulo por defecto.
466 if (!$link->getContents()) {
467 $link->setContents('Nuevo');
469 $link->addContents($img);
470 $this->updateCabecera($link, 'derecha');
473 $img = new MLIB_HTML_Image('/MLIB/images/general_muchos_nuevo', ' >>');
474 // Si no tiene titulo, le pone titulo por defecto.
475 if (!$link->getContents()) {
476 $link->setContents('Nuevos');
478 $link->addContents($img);
479 $this->updateCabecera($link, 'derecha');
482 $img = new MLIB_HTML_Image('/MLIB/images/general_lupa', ' ?>');
483 // Si no tiene titulo, le pone titulo por defecto.
484 if (!$link->getContents()) {
485 $link->setContents('Buscar');
487 $link->addContents($img);
488 $this->updateCabecera($link, 'derecha');
491 $img = new MLIB_HTML_Image('/MLIB/images/general_posterior', ' >>');
492 // Si no tiene titulo, le pone titulo por defecto.
493 if (!$link->getContents()) {
494 $link->setContents('Siguiente');
496 $link->addContents($img);
497 $this->updatePie($link, 'derecha');
500 $img = new MLIB_HTML_Image('/MLIB/images/general_anterior', '<< ');
501 // Si no tiene titulo, le pone titulo por defecto.
502 $cont = $link->getContents() ? $link->getContents() : 'Volver';
503 $link->setContents($img);
504 $link->addContents($cont);
505 $this->updateCabecera($link, 'izquierda');
508 $img = new MLIB_HTML_Image('/MLIB/images/general_anterior', '<< ');
509 // Si no tiene titulo, le pone titulo por defecto.
510 $cont = $link->getContents() ? $link->getContents() : 'Anterior';
511 $link->setContents($img);
512 $link->addContents($cont);
513 $this->updatePie($link, 'izquierda');
516 $this->raiseError("No hay un link predefinido llamado '$id'.");