]> git.llucax.com Git - mecon/meconlib.git/blob - lib/MLIB/HTML/Tabla.php
Se agrega a la clase MLIB_PDF_Tabla la posibilidad de agregar estilos nuevos para
[mecon/meconlib.git] / lib / MLIB / HTML / Tabla.php
1 <?php /* vim: set binary expandtab tabstop=4 shiftwidth=4 textwidth=80:
2 -------------------------------------------------------------------------------
3                                     mlib
4 -------------------------------------------------------------------------------
5 This file is part of mlib.
6
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)
10 any later version.
11
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.
15  
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 -------------------------------------------------------------------------------
23 $Id$
24 -----------------------------------------------------------------------------*/
25
26 require_once 'HTML/Table.php';
27 require_once 'MLIB/HTML/Image.php';
28 require_once 'MLIB/HTML/Link.php';
29
30 /**
31  * Libreria para le manejo de las tablas de los sistemas de intranet.
32  *
33  */
34 class MLIB_HTML_Tabla extends HTML_Table {
35     
36     /**
37      * Valores de Configuracion particular
38      *
39      * @var array() $conf
40      * @access protected
41      */
42     var $_conf;
43
44     /**
45      * Atributos de las tablas.
46      *
47      * @var array() attrs
48      * @access protected
49      */
50     var $_attrs;
51
52     /**
53      * Íconos e información que va arriba de la tabla.
54      *
55      * @var array()
56      * @access private.
57      */
58     var $_cabecera = array();
59
60     /**
61      * Íconos e información que va abajo de la tabla.
62      *
63      * @var array()
64      * @access private.
65      */
66     var $_pie = array();
67
68     /**
69      * Constructor. 
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.
74      *
75      * @param mixed $attrs Atributos diferentes a los estandares para la tabla
76      * @param string $estilo Tipo de tabla
77      * 
78      * @access public
79      */
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);
88         }
89         if (is_array($attrs)) {
90             if (isset($attrs['width'])) {
91                 $this->_attrs['width'] = $attrs['width'];
92             }
93             if (isset($attrs['bgcolor'])) {
94                 $this->_attrs['bgcolor'] = $attrs['bgcolor'];
95             }
96             if (isset($attrs['cellspacing'])) {
97                 $this->_attrs['cellspacing']  = $attrs['cellspacing'];
98             }            
99             if (isset($attrs['cellpadding'])) {
100                 $this->_attrs['cellpadding']  = $attrs['cellpadding'];
101             }            
102         }        
103         $this->HTML_Table($this->_attrs);
104             if (isset($attrs['align'])) {
105                 $this->_attrs['align'] = $attrs['align'];
106             }
107
108     }    
109
110     /**                 
111      * Devuelve el html de la tabla
112      *
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.
117      *
118      * @param bool $simple Tipo de tabla que se quiere recibir.
119      *
120      * @return string Html
121      * 
122      * @access public
123      */
124     function toHtml($simple = 0) {
125         if ($simple) {
126             $result = parent::toHtml();
127         // Agregar la tabla de fondo.
128         } else {
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();    
137         }
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));
141         }
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(
148                 'align'   => 'center',
149                 'valign'  => 'middle',
150                 'width'   => '100%',
151                 'colspan' => '3',
152             ));
153         }
154         // Si tiene pie, lo agrega.
155         $this->_addSpecialRow($this->_pie, $tabla_externa);
156         return ($this->_cabecera or $this->_pie) ? $tabla_externa->toHtml() : $result;
157     }
158
159     function _addSpecialRow($array, &$tabla) {
160         if ($array) {
161             $row = array();
162             foreach ($array as $key => $val) {
163                 $row[$key] = $val ? $val : '&nbsp;';
164             }
165             $id = $tabla->addRow($row, array(
166                 'valign' => 'middle',
167                 'width'  => '33%',
168             ));
169             // Si no hay celda central, hace colspan.
170             if ($array[0] and !$array[1]) {
171                 $tabla->updateCellAttributes($id, 0, array(
172                     'colspan' => 2,
173                     'width' => '67%'));
174             /* } XXX se complica hacer el colspan para atras:
175               elseif ($array[2] and !$array[1]) {
176                 $tabla->updateCellAttributes($id, 1, array(
177                     'colspan' => 2,
178                     'width' => '67%')); */
179             }
180             $tabla->updateCellAttributes($id, 0, array('align' => 'left'));
181             $tabla->updateCellAttributes($id, 1, array('align' => 'center'));
182             $tabla->updateCellAttributes($id, 2, array('align' => 'right'));
183         }
184     }
185
186     /**
187      * Cambia las propiedades de una celda
188      *
189      * Cambia las propiedades de una celda. Si $attrs es un array
190      * asociativo, se setean los atributos representados por las claves
191      * con los valores.
192      *
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                               
196      *
197      * @access public
198      */
199     function updateCellAttributes($row, $col, $attrs) {
200         return parent::updateCellAttributes($row, $col, $this->_translateAttributes($attrs, false));
201     }
202
203     /**
204      * Establece las propiedades de una celda
205      *
206      * Establece las propiedades de una celda. Si $attrs es un array
207      * asociativo, se setean los atributos representados por las claves
208      * con los valores.
209      *
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                               
213      *
214      * @access public
215      */
216     function setCellAttributes($row, $col, $attrs) {
217         return parent::setCellAttributes($row, $col, $this->_translateAttributes($attrs, true));
218     }
219
220     /**
221      * Agrega una fila
222      *
223      * Agrega una fila. El contenido es el que viene representado por 
224      * el array $content. Recibe los atributos en la variable $attrs
225      *
226      * @param mixed $content Contenido
227      * @param mixed $attrs Atributos
228      *
229      * @return int $rowId Identificador de la fila
230      *
231      * @access public
232      */
233     function addRow($content, $attrs = 'comun') {
234         return parent::addRow($content, $attrs);
235     }
236     
237     /**
238      * Convierte un atributo a string
239      * 
240      * Convierte un atributo HTML al string para pasar a los metodos de HTML_Table
241      * Recibe en $attrs los atributos a modificar.
242      *
243      * @param mixed $attrs Atributos.
244      * @param bool  $isSet Indica si hay que setear.
245      *
246      * @return array
247      * @access private
248      */
249     function _translateAttributes($attrs, $isSet) {
250         if (!$attrs) {
251             return array();
252         }
253         if (is_string($attrs)) {
254             $attrs = $this->_parseAttributes($attrs);
255         }
256         if ($isSet) {
257             $rta = $this->_conf['atributos']['celda_comun'];
258         } else {
259             $rta = array();
260         }
261         foreach ($attrs as $attr => $val) {
262             $attr = strtolower($attr);
263             switch ($attr) {
264                 // Estilos de celda
265                 case 'align':
266                 case 'valign':
267                 case 'width':
268                 case 'height':
269                 case 'rowspan':
270                 case 'colspan':
271                 case 'bgcolor':
272                 case 'class':
273                 case 'border':
274                 case 'cellspacing':
275                 case 'cellpadding':
276                 case 'nowrap':
277                     $rta[$attr] = $val;
278                     break;
279                 case 'spacing':
280                 case 'padding':
281                     $rta["cell$attr"] = $val;
282                     break;
283                 case 'th':
284                     $rta[$attr] = '';
285                     break;
286                 //NO HTML STANDAR
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.
294                 case 'mlib_style':
295                     $rta['mlib_style'] = $val;
296                     break;
297                 case 'comun':
298                 case 'cabecera':
299                 case 'titulo':
300                     $rta = array_merge($rta,
301                             $this->_conf['atributos']["celda_$attr"]);
302                     $rta[$attr] = $attr;
303                     $rta['mlib_style'] = $attr;
304                     break;
305                 case 'clara': 
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);
310                     $rta[$attr] = $attr;
311                     $rta['mlib_style'] = $attr;
312                     break;
313                 case 'oscura':
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);
318                     $rta[$attr] = $attr;
319                     $rta['mlib_style'] = $attr;
320                     break;
321                 case 'comun_clara':
322                     $tmp = $this->_conf['atributos']['celda_comun'];
323                     $tmp['class'].= '_clara';
324                     $rta = array_merge($rta,
325                             $this->_conf['atributos']["celda_comun"]);
326                     $rta[$attr] = $attr;
327                     $rta['mlib_style'] = $attr;
328                     break;
329                 default:
330                     trigger_error("No se permite setear el atributo $attr", E_USER_ERROR);
331             }
332         }
333         return $rta;
334     }
335
336     /**
337      * Obtiene la Cascade Style Sheet para esta tabla.
338      *
339      * @return string Path 'web' a la css.
340      */
341     function getCSS() {
342         return $this->_conf['css'];
343     }
344
345     /**
346      * Setea la cabecera.
347      * Ejemplo:
348      * @code
349      * $tabla->setCabecera(array('Hola', '', 'mundo!'));
350      * @endcode
351      *
352      * @param array $cabecera Array de 3 elementos, que son la celda izquierda,
353      *                        central y derecha de la cabecera (en ese órden).
354      */
355     function setCabecera($cabecera) {
356         if (count($cabecera) != 3) {
357             $this->raiseError('Parámetro incorrecto: debe ser un array de 3 elementos.');
358         }
359         $this->_cabecera = $cabecera;
360     }
361
362     /**
363      * Agrega información a la cabecera de la tabla.
364      * Ejemplo:
365      * @code
366      * $tabla->updateCabecera('Hola', 'izquierda');
367      * $tabla->updateCabecera('mundo!', 'derecha');
368      * @endcode
369      *
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'.
374      */
375     function updateCabecera($cabecera, $lugar) {
376         if (!$this->_cabecera) {
377             $this->_cabecera = array('', '', '');
378         }
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;
385         } else {
386             $this->raiseError('Parámetro incorrecto: lugar debe ser izquierda, centro o derecha.');
387         }
388     }
389
390     /**
391      * Setea el pie.
392      *
393      * @param array $pie Array de 3 elementos, que son la celda izquierda,
394      *                   central y derecha del pie (en ese órden).
395      *
396      * @see Ejemplo en setCabecera().
397      */
398     function setPie($pie) {
399         if (count($pie) != 3) {
400             $this->raiseError('Parámetro incorrecto: debe ser un array de 3 elementos.');
401         }
402         $this->_pie = $pie;
403     }
404
405     /**
406      * Agrega información al pie de la tabla.
407      *
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'.
412      *
413      * @see Ejemplo en updateCabecera().
414      */
415     function updatePie($pie, $lugar) {
416         if (!$this->_pie) {
417             $this->_pie = array('', '', '');
418         }
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;
425         } else {
426             $this->raiseError('Parámetro incorrecto: lugar debe ser izquierda, centro o derecha.');
427         }
428     }
429
430     /**
431      * Agrega un link predefinido a la cabecera o pie de la tabla.
432      * Ejemplo:
433      * @code
434      * if ($muchos) {
435      *      $tabla->addLink('nuevo');
436      * } else {
437      *      $tabla->addLink('nuevos', 'nuevos.php');
438      * }
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')));
446      * @endcode
447      *
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.
453      * 
454      */
455     function addLink($id, $link = null) {
456         if (!$link) {
457             $link = @$_SERVER['PHP_SELF'];
458         }
459         if (is_string($link)) {
460             $link = new MLIB_HTML_Link($link, '');
461         }
462         switch ($id) {
463             case 'nuevo':
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');
468                 }
469                 $link->addContents($img);
470                 $this->updateCabecera($link, 'derecha');
471                 break;
472             case 'nuevos':
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');
477                 }
478                 $link->addContents($img);
479                 $this->updateCabecera($link, 'derecha');
480                 break;
481             case 'buscar':
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');
486                 }
487                 $link->addContents($img);
488                 $this->updateCabecera($link, 'derecha');
489                 break;
490             case 'siguiente':
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');
495                 }
496                 $link->addContents($img);
497                 $this->updatePie($link, 'derecha');
498                 break;
499             case 'volver':
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');
506                 break;
507             case 'anterior':
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');
514                 break;
515             default:
516                 $this->raiseError("No hay un link predefinido llamado '$id'.");
517         }
518     }
519
520 }
521
522 ?>