]> git.llucax.com Git - mecon/meconlib.git/blob - lib/MECON/HTML/Tabla.php
BugFix
[mecon/meconlib.git] / lib / MECON / 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
30 /**
31  * Libreria para le manejo de las tablas de los sistemas de intranet.
32  *
33  */
34 class MECON_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 $atributos Atributos diferentes a los estandares para la tabla
76      * @param string $estilo Tipo de tabla
77      * 
78      * @access public
79      */
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);
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      * 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.
117      *
118      * @param array() $contenido Contenido de la fila
119      *
120      * @return int Identificador de Linea
121      * @access public
122      * @deprecated
123      */
124     function agregarFilaCabecera($contenido = '', $atributos = '') {
125         return $this->addRow($contenido, 'cabecera');
126     }
127
128     /**                 
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.
135      *
136      * @param array() $contenido Contenido de la fila
137      *
138      * @return int Identificador de Linea
139      * 
140      * @access public
141      * @deprecated
142      */
143     function agregarFila($contenido = '') {
144         return $this->addRow($contenido, 'comun');
145     }
146
147     /**                 
148      * Modifica el atributo rowSpan a la celda pasada por parametro
149      *
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
153      * 
154      * @access public
155      * @deprecated
156      */
157     function rowSpan($fila, $columna, $valor) {
158         return $this->updateCellAttributes($fila, $columna, 'rowspan="'.$valor.'"');
159     }
160
161     /**                 
162      * Modifica el atributo colSpan a la celda pasada por parametro
163      *
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                               
167      * 
168      * @access public
169      * @deprecated
170      */
171     function colSpan($fila, $columna, $valor) {
172         return $this->updateCellAttributes($fila, $columna, 'colspan="'.$valor.'"');
173     }
174
175     /**                 
176      * Modifica el atributo aling de la celda pasada por parametro
177      *
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                               
181      * 
182      * @access public
183      * @deprecated
184      */
185     function align($fila, $columna, $valor) {
186         return $this->updateCellAttributes($fila, $columna, 'align="'.$valor.'"');
187     }
188
189     /**
190      * Setea una columna como del tipo cabecera    
191      *
192      * @param int $columna Identificador de la columna que se quiere modificar
193      * 
194      * @access public
195      * @deprecated
196      */
197     function setColCabecera($columna) {
198         return $this->updateColAttributes($columna, 'cabecera');
199     }
200
201     /**                 
202      * Setea una columna como del tipo titulo
203      *
204      * @param int $columna Identificador de la columna que se quiere modificar
205      * 
206      * @access public
207      * @deprecated
208      */
209     function setColTitulo($columna) {
210         return $this->updateColAttributes($columna, 'titulo');
211     }
212
213     /**                 
214      * Alinea una columna entera  
215      *
216      * @param int $columna Identificador de la columna que se quiere modificar
217      * @param string $valor Valor
218      * 
219      * @access public
220      * @deprecated
221      */
222     function setColAlign($columna, $valor) {
223         return $this->updateColAttributes($columna,'align="'.$valor.'"');
224     }
225
226     /**                 
227      * Cambia el tamanio de una columna entera  
228      *
229      * @param int $columna  Identificadore de la columna que se quiere modificar
230      * @param string $valor Valor
231      * 
232      * @access public
233      * @deprecated
234      */
235     function setColWidth($columna, $valor) {
236         return $this->updateColAttributes($columna,'width="'.$valor.'"');
237     }
238
239     /**                 
240      * Cambia el color de fondo de una celda  
241      *
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                               
245      *
246      * @access public
247      * @deprecated
248      */
249     function setCellBgcolor($fila, $columna, $valor) {
250         return $this->updateCellAttributes($fila, $columna,'bgcolor="'.$valor.'"');
251     }
252
253     /**                 
254      * Devuelve el html de la tabla
255      *
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.
260      *
261      * @param bool $simple Tipo de tabla que se quiere recibir.
262      *
263      * @return string Html
264      * 
265      * @access public
266      */
267     function toHtml($simple = 0) {
268         if ($simple) {
269             $result = parent::toHtml();
270         // Agregar la tabla de fondo.
271         } else {
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();    
280         }
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));
284         }
285         // Si tiene cabecera, la agrega.
286         if ($this->_cabecera) {
287             $tabla_externa->addRow($this->_cabecera, array(
288                 'valign' => 'middle',
289                 'width'  => '33%',
290             ));
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'));
294         }
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(
299                 'align'   => 'center',
300                 'valign'  => 'middle',
301                 'width'   => '100%',
302                 'colspan' => '3',
303             ));
304         }
305         // Si tiene pie, lo agrega.
306         if ($this->_pie) {
307             $id = $tabla_externa->addRow($this->_pie, array(
308                 'valign' => 'middle',
309                 'width' => '33%',
310             ));
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'));
314         }
315         return ($this->_cabecera or $this->_pie) ? $tabla_externa->toHtml() : $result;
316     }
317
318     /**
319      * Cambia las propiedades de una celda
320      *
321      * Cambia las propiedades de una celda. Si $attrs es un array
322      * asociativo, se setean los atributos representados por las claves
323      * con los valores.
324      *
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                               
328      *
329      * @access public
330      */
331     function updateCellAttributes($row, $col, $attrs) {
332         return parent::updateCellAttributes($row, $col, $this->_translateAttributes($attrs, false));
333     }
334
335     /**
336      * Establece las propiedades de una celda
337      *
338      * Establece las propiedades de una celda. Si $attrs es un array
339      * asociativo, se setean los atributos representados por las claves
340      * con los valores.
341      *
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                               
345      *
346      * @access public
347      */
348     function setCellAttributes($row, $col, $attrs) {
349         return parent::setCellAttributes($row, $col, $this->_translateAttributes($attrs, true));
350     }
351
352     /**
353      * Agrega una fila
354      *
355      * Agrega una fila. El contenido es el que viene representado por 
356      * el array $content. Recibe los atributos en la variable $attrs
357      *
358      * @param mixed $content Contenido
359      * @param mixed $attrs Atributos
360      *
361      * @return int $rowId Identificador de la fila
362      *
363      * @access public
364      */
365     function addRow($content, $attrs = 'comun') {
366         return parent::addRow($content, $attrs);
367     }
368     
369     /**
370      * Convierte un atributo a string
371      * 
372      * Convierte un atributo HTML al string para pasar a los metodos de HTML_Table
373      * Recibe en $attrs los atributos a modificar.
374      *
375      * @param mixed $attrs Atributos.
376      * @param bool  $isSet Indica si hay que setear.
377      *
378      * @return array
379      * @access private
380      */
381     function _translateAttributes($attrs, $isSet) {
382         if (!$attrs) {
383             return array();
384         }
385         if (is_string($attrs)) {
386             $attrs = $this->_parseAttributes($attrs);
387         }
388         if ($isSet) {
389             $rta = $this->_conf['atributos']['celda_comun'];
390         } else {
391             $rta = array();
392         }
393         foreach ($attrs as $attr => $val) {
394             $attr = strtolower($attr);
395             switch ($attr) {
396                 // Estilos de celda
397                 case 'comun':
398                 case 'cabecera':
399                 case 'titulo':
400                     $rta = array_merge($rta, $this->_conf['atributos']["celda_$attr"]);
401                     break;
402                 case 'align':
403                 case 'valign':
404                 case 'width':
405                 case 'height':
406                 case 'rowspan':
407                 case 'colspan':
408                 case 'bgcolor':
409                 case 'class':
410                 case 'border':
411                 case 'cellspacing':
412                 case 'cellpadding':
413                 case 'nowrap':
414                     $rta[$attr] = $val;
415                     break;
416                 case 'spacing':
417                 case 'padding':
418                     $rta["cell$attr"] = $val;
419                     break;
420                 case 'th':
421                     $rta[$attr] = '';
422                     break;
423                 default:
424                     trigger_error("No se permite setear el atributo $attr", E_USER_ERROR);
425             }
426         }
427         return $rta;
428     }
429
430     /**
431      * Obtiene la Cascade Style Sheet para esta tabla.
432      *
433      * @return string Path 'web' a la css.
434      */
435     function getCSS() {
436         return $this->_conf['css'];
437     }
438
439     /**
440      * Setea la cabecera.
441      * Ejemplo:
442      * @code
443      * $tabla->setCabecera(array('Hola', '&nbsp;', 'mundo!'));
444      * @endcode
445      *
446      * @param array $cabecera Array de 3 elementos, que son la celda izquierda,
447      *                        central y derecha de la cabecera (en ese órden).
448      */
449     function setCabecera($cabecera) {
450         if (count($pie) != 3) {
451             $this->raiseError('Parámetro incorrecto: debe ser un array de 3 elementos.');
452         }
453         $this->_cabecera = $cabecera;
454     }
455
456     /**
457      * Agrega información a la cabecera de la tabla.
458      * Ejemplo:
459      * @code
460      * $tabla->updateCabecera('Hola', 'izquierda');
461      * $tabla->updateCabecera('mundo!', 'derecha');
462      * @endcode
463      *
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'.
468      */
469     function updateCabecera($cabecera, $lugar) {
470         if (!$this->_cabecera) {
471             $this->_cabecera = array('&nbsp;', '&nbsp;', '&nbsp;');
472         }
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;
479         } else {
480             $this->raiseError('Parámetro incorrecto: lugar debe ser izquierda, centro o derecha.');
481         }
482     }
483
484     /**
485      * Setea el pie.
486      *
487      * @param array $pie Array de 3 elementos, que son la celda izquierda,
488      *                   central y derecha del pie (en ese órden).
489      *
490      * @see Ejemplo en setCabecera().
491      */
492     function setPie($pie) {
493         if (count($pie) != 3) {
494             $this->raiseError('Parámetro incorrecto: debe ser un array de 3 elementos.');
495         }
496         $this->_pie = $pie;
497     }
498
499     /**
500      * Agrega información al pie de la tabla.
501      *
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'.
506      *
507      * @see Ejemplo en updateCabecera().
508      */
509     function updatePie($pie, $lugar) {
510         if (!$this->_pie) {
511             $this->_pie = array('&nbsp;', '&nbsp;', '&nbsp;');
512         }
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;
519         } else {
520             $this->raiseError('Parámetro incorrecto: lugar debe ser izquierda, centro o derecha.');
521         }
522     }
523
524     /**
525      * Agrega un link predefinido a la cabecera o pie de la tabla.
526      * Ejemplo:
527      * @code
528      * $tabla->addLink('nuevo');
529      * $tabla->addLink('volver', new MECON_HTML_Link('atras.php'));
530      * $tabla->addLink('anterior', new MECON_HTML_Link('previo.php', 'Persona Anterior'));
531      * $tabla->addLink('siguiente', new MECON_HTML_Link('previo.php', 'Siguiente persona', array('pers' => 'prox')));
532      * @endcode
533      *
534      * @param string $id Identificador del link predefinido. Puede ser 'volver',
535      *                   'nuevo', 'nuevos', 'anterior' y 'siguiente'.
536      * @param MECON_HTML_Link $link Link a usar. Si no tiene contenidos, se pone
537      *                              uno por defecto. Si es null, se pone como
538      *                              link la página actual.
539      * 
540      */
541     function addLink($id, $link = null) {
542         if (!$link) {
543             $link = new MECON_HTML_Link($_SERVER['PHP_SELF'], '');
544         }
545         switch ($id) {
546             case 'nuevo':
547                 $img = new MECON_HTML_Image('/MECON/images/general_nuevo', '-&lt;');
548                 // Si no tiene titulo, le pone titulo por defecto.
549                 if (!$link->getContents()) {
550                     $link->setContents('Nuevo');
551                 }
552                 $link->addContents($img);
553                 $this->updateCabecera($link, 'derecha');
554                 break;
555             case 'nuevos':
556                 $img = new MECON_HTML_Image('/MECON/images/general_muchos_nuevo', '-&lt;');
557                 // Si no tiene titulo, le pone titulo por defecto.
558                 if (!$link->getContents()) {
559                     $link->setContents('Nuevos');
560                 }
561                 $link->addContents($img);
562                 $this->updateCabecera($link, 'derecha');
563                 break;
564             case 'siguiente':
565                 $img = new MECON_HTML_Image('/MECON/images/general_posterior', '-&lt;');
566                 // Si no tiene titulo, le pone titulo por defecto.
567                 if (!$link->getContents()) {
568                     $link->setContents('Siguiente');
569                 }
570                 $link->addContents($img);
571                 $this->updatePie($link, 'derecha');
572                 break;
573             case 'volver':
574                 $img = new MECON_HTML_Image('/MECON/images/general_anterior', '&gt;-');
575                 // Si no tiene titulo, le pone titulo por defecto.
576                 $cont = $link->getContents() ? $link->getContents() : 'Volver';
577                 $link->setContents($img);
578                 $link->addContents($cont);
579                 $this->updateCabecera($link, 'izquierda');
580                 break;
581             case 'anterior':
582                 $img = new MECON_HTML_Image('/MECON/images/general_anterior', '&gt;-');
583                 // Si no tiene titulo, le pone titulo por defecto.
584                 $cont = $link->getContents() ? $link->getContents() : 'Anterior';
585                 $link->setContents($img);
586                 $link->addContents($cont);
587                 $this->updatePie($link, 'izquierda');
588                 break;
589             default:
590                 $this->raiseError("No hay un link predefinido llamado '$id'.");
591         }
592     }
593
594 }
595
596 ?>