]> git.llucax.com Git - mecon/meconlib.git/blob - lib/MECON/HTML/Tabla.php
Se completa documentacion y se arreglan bugs.
[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 $attrs 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      * 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         if ($this->_cabecera) {
144             $tabla_externa->addRow($this->_cabecera, array(
145                 'valign' => 'middle',
146                 'width'  => '33%',
147             ));
148             $tabla_externa->updateCellAttributes(0, 0, array('align' => 'left'));
149             $tabla_externa->updateCellAttributes(0, 1, array('align' => 'center'));
150             $tabla_externa->updateCellAttributes(0, 2, array('align' => 'right'));
151         }
152         // Si tiene cabecera o pie, agrega la tabla original.
153         if ($this->_cabecera or $this->_pie) {
154             //$id = $tabla_externa->addRow($result);
155             $tabla_externa->addRow(array($result), array(
156                 'align'   => 'center',
157                 'valign'  => 'middle',
158                 'width'   => '100%',
159                 'colspan' => '3',
160             ));
161         }
162         // Si tiene pie, lo agrega.
163         if ($this->_pie) {
164             $id = $tabla_externa->addRow($this->_pie, array(
165                 'valign' => 'middle',
166                 'width' => '33%',
167             ));
168             $tabla_externa->updateCellAttributes($id, 0, array('align' => 'left'));
169             $tabla_externa->updateCellAttributes($id, 1, array('align' => 'center'));
170             $tabla_externa->updateCellAttributes($id, 2, array('align' => 'right'));
171         }
172         return ($this->_cabecera or $this->_pie) ? $tabla_externa->toHtml() : $result;
173     }
174
175     /**
176      * Cambia las propiedades de una celda
177      *
178      * Cambia las propiedades de una celda. Si $attrs es un array
179      * asociativo, se setean los atributos representados por las claves
180      * con los valores.
181      *
182      * @param int $row     Identificador de la fila que se quiere modificar    
183      * @param int $col     Identificador de la columna que se quiere modificar
184      * @param mixed $attrs Atributo a modificar                               
185      *
186      * @access public
187      */
188     function updateCellAttributes($row, $col, $attrs) {
189         return parent::updateCellAttributes($row, $col, $this->_translateAttributes($attrs, false));
190     }
191
192     /**
193      * Establece las propiedades de una celda
194      *
195      * Establece las propiedades de una celda. Si $attrs es un array
196      * asociativo, se setean los atributos representados por las claves
197      * con los valores.
198      *
199      * @param int $row     Identificador de la fila que se quiere modificar     
200      * @param int $col     Identificador de la columna que se quiere modificar
201      * @param mixed $attrs Atributo a modificar                               
202      *
203      * @access public
204      */
205     function setCellAttributes($row, $col, $attrs) {
206         return parent::setCellAttributes($row, $col, $this->_translateAttributes($attrs, true));
207     }
208
209     /**
210      * Agrega una fila
211      *
212      * Agrega una fila. El contenido es el que viene representado por 
213      * el array $content. Recibe los atributos en la variable $attrs
214      *
215      * @param mixed $content Contenido
216      * @param mixed $attrs Atributos
217      *
218      * @return int $rowId Identificador de la fila
219      *
220      * @access public
221      */
222     function addRow($content, $attrs = 'comun') {
223         return parent::addRow($content, $attrs);
224     }
225     
226     /**
227      * Convierte un atributo a string
228      * 
229      * Convierte un atributo HTML al string para pasar a los metodos de HTML_Table
230      * Recibe en $attrs los atributos a modificar.
231      *
232      * @param mixed $attrs Atributos.
233      * @param bool  $isSet Indica si hay que setear.
234      *
235      * @return array
236      * @access private
237      */
238     function _translateAttributes($attrs, $isSet) {
239         if (!$attrs) {
240             return array();
241         }
242         if (is_string($attrs)) {
243             $attrs = $this->_parseAttributes($attrs);
244         }
245         if ($isSet) {
246             $rta = $this->_conf['atributos']['celda_comun'];
247         } else {
248             $rta = array();
249         }
250         foreach ($attrs as $attr => $val) {
251             $attr = strtolower($attr);
252             switch ($attr) {
253                 // Estilos de celda
254                 case 'comun':
255                 case 'cabecera':
256                 case 'titulo':
257                     $rta = array_merge($rta, $this->_conf['atributos']["celda_$attr"]);
258                     break;
259                 case 'align':
260                 case 'valign':
261                 case 'width':
262                 case 'height':
263                 case 'rowspan':
264                 case 'colspan':
265                 case 'bgcolor':
266                 case 'class':
267                 case 'border':
268                 case 'cellspacing':
269                 case 'cellpadding':
270                 case 'nowrap':
271                     $rta[$attr] = $val;
272                     break;
273                 case 'spacing':
274                 case 'padding':
275                     $rta["cell$attr"] = $val;
276                     break;
277                 case 'th':
278                     $rta[$attr] = '';
279                     break;
280                 default:
281                     trigger_error("No se permite setear el atributo $attr", E_USER_ERROR);
282             }
283         }
284         return $rta;
285     }
286
287     /**
288      * Obtiene la Cascade Style Sheet para esta tabla.
289      *
290      * @return string Path 'web' a la css.
291      */
292     function getCSS() {
293         return $this->_conf['css'];
294     }
295
296     /**
297      * Setea la cabecera.
298      * Ejemplo:
299      * @code
300      * $tabla->setCabecera(array('Hola', '&nbsp;', 'mundo!'));
301      * @endcode
302      *
303      * @param array $cabecera Array de 3 elementos, que son la celda izquierda,
304      *                        central y derecha de la cabecera (en ese órden).
305      */
306     function setCabecera($cabecera) {
307         if (count($pie) != 3) {
308             $this->raiseError('Parámetro incorrecto: debe ser un array de 3 elementos.');
309         }
310         $this->_cabecera = $cabecera;
311     }
312
313     /**
314      * Agrega información a la cabecera de la tabla.
315      * Ejemplo:
316      * @code
317      * $tabla->updateCabecera('Hola', 'izquierda');
318      * $tabla->updateCabecera('mundo!', 'derecha');
319      * @endcode
320      *
321      * @param mixed $cabecera Celda a agregar a la cabecera. Puede ser un string
322      *                        o un objeto con un método toHtml().
323      * @param string $lugar   Lugar en donde poner la cabecera. Puede ser
324      *                       'izquierda', 'centro' o 'derecha'.
325      */
326     function updateCabecera($cabecera, $lugar) {
327         if (!$this->_cabecera) {
328             $this->_cabecera = array('&nbsp;', '&nbsp;', '&nbsp;');
329         }
330         if ($lugar == 'izquierda') {
331             $this->_cabecera[0] = $cabecera;
332         } elseif ($lugar == 'centro') {
333             $this->_cabecera[1] = $cabecera;
334         } elseif ($lugar == 'derecha') {
335             $this->_cabecera[2] = $cabecera;
336         } else {
337             $this->raiseError('Parámetro incorrecto: lugar debe ser izquierda, centro o derecha.');
338         }
339     }
340
341     /**
342      * Setea el pie.
343      *
344      * @param array $pie Array de 3 elementos, que son la celda izquierda,
345      *                   central y derecha del pie (en ese órden).
346      *
347      * @see Ejemplo en setCabecera().
348      */
349     function setPie($pie) {
350         if (count($pie) != 3) {
351             $this->raiseError('Parámetro incorrecto: debe ser un array de 3 elementos.');
352         }
353         $this->_pie = $pie;
354     }
355
356     /**
357      * Agrega información al pie de la tabla.
358      *
359      * @param mixed $pie Celda a agregar al pie. Puede ser un string
360      *                        o un objeto con un método toHtml().
361      * @param string $lugar   Lugar en donde poner el pie. Puede ser
362      *                       'izquierda', 'centro' o 'derecha'.
363      *
364      * @see Ejemplo en updateCabecera().
365      */
366     function updatePie($pie, $lugar) {
367         if (!$this->_pie) {
368             $this->_pie = array('&nbsp;', '&nbsp;', '&nbsp;');
369         }
370         if ($lugar == 'izquierda') {
371             $this->_pie[0] = $pie;
372         } elseif ($lugar == 'centro') {
373             $this->_pie[1] = $pie;
374         } elseif ($lugar == 'derecha') {
375             $this->_pie[2] = $pie;
376         } else {
377             $this->raiseError('Parámetro incorrecto: lugar debe ser izquierda, centro o derecha.');
378         }
379     }
380
381     /**
382      * Agrega un link predefinido a la cabecera o pie de la tabla.
383      * Ejemplo:
384      * @code
385      * if ($muchos) {
386      *      $tabla->addLink('nuevo');
387      * } else {
388      *      $tabla->addLink('nuevos', 'nuevos.php');
389      * }
390      * $tabla->addLink('volver',
391      *      new MECON_HTML_Link('atras.php'));
392      * $tabla->addLink('anterior',
393      *      new MECON_HTML_Link('previo.php', 'Persona Anterior'));
394      * $tabla->addLink('siguiente',
395      *      new MECON_HTML_Link('previo.php', 'Siguiente persona',
396      *          array('pers' => 'prox')));
397      * @endcode
398      *
399      * @param string $id Identificador del link predefinido. Puede ser 'volver',
400      *                   'nuevo', 'nuevos', 'anterior' y 'siguiente'.
401      * @param MECON_HTML_Link $link Link a usar. Si no tiene contenidos, se pone
402      *                              uno por defecto. Si es null, se pone como
403      *                              link la página actual.
404      * 
405      */
406     function addLink($id, $link = null) {
407         if (!$link) {
408             $link = @$_SERVER['PHP_SELF'];
409         }
410         if (is_string($link)) {
411             $link = new MECON_HTML_Link($link, '');
412         }
413         switch ($id) {
414             case 'nuevo':
415                 $img = new MECON_HTML_Image('/MECON/images/general_nuevo', '-&lt;');
416                 // Si no tiene titulo, le pone titulo por defecto.
417                 if (!$link->getContents()) {
418                     $link->setContents('Nuevo');
419                 }
420                 $link->addContents($img);
421                 $this->updateCabecera($link, 'derecha');
422                 break;
423             case 'nuevos':
424                 $img = new MECON_HTML_Image('/MECON/images/general_muchos_nuevo', '-&lt;');
425                 // Si no tiene titulo, le pone titulo por defecto.
426                 if (!$link->getContents()) {
427                     $link->setContents('Nuevos');
428                 }
429                 $link->addContents($img);
430                 $this->updateCabecera($link, 'derecha');
431                 break;
432             case 'siguiente':
433                 $img = new MECON_HTML_Image('/MECON/images/general_posterior', '-&lt;');
434                 // Si no tiene titulo, le pone titulo por defecto.
435                 if (!$link->getContents()) {
436                     $link->setContents('Siguiente');
437                 }
438                 $link->addContents($img);
439                 $this->updatePie($link, 'derecha');
440                 break;
441             case 'volver':
442                 $img = new MECON_HTML_Image('/MECON/images/general_anterior', '&gt;-');
443                 // Si no tiene titulo, le pone titulo por defecto.
444                 $cont = $link->getContents() ? $link->getContents() : 'Volver';
445                 $link->setContents($img);
446                 $link->addContents($cont);
447                 $this->updateCabecera($link, 'izquierda');
448                 break;
449             case 'anterior':
450                 $img = new MECON_HTML_Image('/MECON/images/general_anterior', '&gt;-');
451                 // Si no tiene titulo, le pone titulo por defecto.
452                 $cont = $link->getContents() ? $link->getContents() : 'Anterior';
453                 $link->setContents($img);
454                 $link->addContents($cont);
455                 $this->updatePie($link, 'izquierda');
456                 break;
457             default:
458                 $this->raiseError("No hay un link predefinido llamado '$id'.");
459         }
460     }
461
462 }
463
464 ?>