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