]> git.llucax.com Git - mecon/meconlib.git/blob - lib/MLIB/Tpl/HTML/Table.php
Se agrega a la clase MLIB_PDF_Tabla y MLIB_PDF_Tabla_Estilo la posibilidad de
[mecon/meconlib.git] / lib / MLIB / Tpl / HTML / Table.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 Lesser 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 Lesser General Public License for more 
15 details.
16  
17 You should have received a copy of the GNU Lesser General Public License; if 
18 not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
19 Boston, MA  02111-1307  USA
20 -------------------------------------------------------------------------------
21 Created: sáb sep  4 23:58:37 ART 2004
22 Authors: Martín Marrese <martin@marrese.com.ar>
23 -------------------------------------------------------------------------------
24 $Id$
25 -----------------------------------------------------------------------------*/
26
27 require_once 'MLIB/HTML/TablaDB.php';
28
29 /**
30  * Clase para armar Tablas HTML a partir de templates.
31  * Se cambio el enfoque respecto de MLIB_HTML_Tabla y MLIB_HTML_TablaDB. Ahora
32  * se utiliza UN solo objeto el cual puede utilizarse de manera tal que permite
33  * armar tablas simples o agregarle la funcionalidad de TablaDB.
34  *
35  * Necesita para funcionar que se encuentren en el directorio pasado como
36  * parametro los siguientes templates con las siguientes claves:
37  *
38  * - tabla   Tabla general. Esta misma se usa para el paginador.
39  *    - ROWS Obligatorio. Es reemplazado por las filas con información.
40  *    - ATTR Opcional. Atributos dinamicos que se quieren asignar a la tabla.
41  *
42  * - row      Fila con celdas de información.
43  *    - CELLS Obligatorio. Es reemplazado por las celdas con información.
44  *    - ATTR  Opcional. Atributos dinamicos que se quieren asignar a la celda.
45  *
46  * - cellCabecera Encabezado de la tabla.
47  * - cellComun    Celdas comunes.
48  * - cellTItulo   Celdas titulo de columna.
49  *    - CELL      Obligatorio. Dato de la celda.
50  *    - ATTR      Opcional. Atributos dinamicos de las celdas.
51  *
52  * Para el paginador se utiliza
53  * 
54  * - tabla El mismo de arriba con las mismas claves.
55  * - row   Idem.
56  * - cell  Idem.
57  *
58  * - anterior Celda que contendra la opción para volver hacia atras.
59  *    - SRC   Href hacia donde apunta el link.
60  * - siguiente Celda que contendra la opción de avanzar.
61  *    - SRC    Href hacia donde apunta el link.
62  * - paginas    Contendra la información de las paginas.
63  *    - CURRENT Sera reemplazada con el numero de pagina actual.
64  *    - LAST    Sera reemplazada con el numero de la ultima pagina.
65  *
66  * @author Martín Marrese <martin@marrese.com.ar>
67  */
68 class MLIB_Tpl_HTML_Table extends MLIB_HTML_TablaDB {
69     
70     /**
71      * Template Engine a utilizar.
72      *
73      * @protected
74      */
75     var $tpl = '';
76
77     /**
78      * Constructor.
79      *
80      * @param Object MLIB_Tpl Engine de template a utilizar.
81      * @param mixed tpl_dir Directorio en donde se encuentran los templates de
82      * la tabla.
83      * @param mixed attr Atributos de la tabla.
84      * @param string desc Descripcion de los elementos listados.
85      * @return void
86      * @access public
87      */
88     function MLIB_Tpl_HTML_Table($tpl, $tpl_dir = null, $attr = null, $desc = null)
89     {
90         $this->__constructor($tpl, $tpl_dir, $attr, $desc);
91     }
92
93     /**
94      * Constructor.
95      *
96      * @param Object MLIB_Tpl Engine de template a utilizar
97      * @param mixed tpl_dir Directorio en donde se encuentran los templates de
98      * la tabla.
99      * @param mixed attr Atributos de la tabla.
100      * @param sring desc Descripcion de los elementos listados.
101      * @return void
102      * @access public
103      */
104     function __constructor($tpl, $tpl_dir = null, $attr = null, $desc = null)
105     {
106         $this->tpl       = $tpl;
107         $this->tpl->root = ($tpl_dir) ? $tpl_dir :
108             $_SERVER['DOCUMENT_ROOT'] . '/MLIB//templates/html/table';
109         parent::MLIB_HTML_TablaDB($desc, $attr);
110         //Esto es para overrunnear el constuctor de MLIB_HTML_Tabla que asigna
111         //unos atributos por defecto a la tabla.
112         $this->setAttributes($attr);
113     }
114
115     /**
116      * Método que devuelve una representacion textual del objeto para que sea
117      * mostrado al usuario.
118      *
119      * @return El string correspondiente al objeto.
120      * @access public
121      */
122     function __toString()
123     {
124         $rows = '';
125         for ($row = 0; $row < $this->getRowCount(); $row++)
126         {
127             $cell = '';
128             for ($col = 0; $col < $this->getColCount(); $col ++)
129             {
130                 //Verifico si la celda esta col/row spaneada
131                 if (!$this->getCellContents($row, $col))
132                 {
133                     continue;
134                 }
135                 $content = $this->getStringCellContent($row, $col);
136                 $cellAttr = $this->getCellAttributes($row, $col);
137                 if (!$cellAttr)
138                 {
139                     $cellAttr = '';
140 //                    $cellAttr['celltype'] = 'cellComun';
141                 }
142                 //Agrego las celdas a la fila parseada
143                 $cell.= $this->tpl->parse($cellAttr['celltype'],
144                         array (
145                             'CELL' => $content,
146                             'ATTR' => $this->_getAttrString(
147                                 $cellAttr
148                                 )
149                             )
150                         );       
151             }
152             $rowAttr = $this->getRowAttributes($row);
153             if (!$rowAttr)
154             {
155                 $rowAttr = '';
156             }
157             //Agrego las filas a la tabla parseada
158             $rows.= $this->tpl->parse('row', array (
159                         'CELLS' => $cell,
160                         'ATTR' => $this->_getAttrString($rowAttr)
161                         )
162                     );
163         }
164
165         //Armo el template de la tabla
166         $result = $this->tpl->parse('tabla',
167                 array (
168                     'ROWS' => $rows,
169                     'ATTR' => $this->getAttributes(true)
170                     )
171                 );
172
173         //Armo el pager si corresponde
174         $result.= $this->pagerToString();
175         
176         return $result;
177     }
178
179     /*
180      * Funcion que devuelve el pie en caso de estar definido este.
181      *
182      * @return mixed Pie.
183      */
184     function pagerToString()
185     {
186         if ($this->_pie)
187         {
188             $cell = '';
189             //Veo si tengo que agregar el link a anterior.
190             if (@$this->_pie['0'])
191             {
192                 $cell.= $this->tpl->parse('cellPaginador',
193                         array (
194                             'CELL' => @$this->_pie['0']->toHtml(),
195                             'ATTR' => 'align="left" width="33%" valign="middle"'
196                             )
197                         );       
198             }
199             else
200             {
201                 $cell.= $this->tpl->parse('cellPaginador',
202                         array (
203                             'CELL' => '&nbsp;',
204                             'ATTR' => 'align="center" width="33%" valign="middle"'
205                             )
206                         );       
207                   
208             }
209             //Veo si tengo que agregar el total de paginas.
210             if (@$this->_pie['1'])
211             {
212                 $cell.= $this->tpl->parse('cellPaginador',
213                         array (
214                             'CELL' => @$this->_pie['1'],
215                             'ATTR' => 'align="center" width="33%" valign="middle"'
216                             )
217                         );       
218             }
219             else
220             {
221                 $cell.= $this->tpl->parse('cellPaginador',
222                         array (
223                             'CELL' => '&nbsp;',
224                             'ATTR' => 'align="center" width="33%" valign="middle"'
225                             )
226                         );       
227                   
228             }
229             //Veo si tengo que agregar el link a siguiente.
230             if (@$this->_pie['2'])
231             {
232                 $cell.= $this->tpl->parse('cellPaginador',
233                         array (
234                             'CELL' => @$this->_pie['2']->toHtml(),
235                             'ATTR' => 'align="right" width="33%" valign="middle"'
236                             )
237                         );       
238             }
239             else
240             {
241                 $cell.= $this->tpl->parse('cellPaginador',
242                         array (
243                             'CELL' => '&nbsp;',
244                             'ATTR' => 'align="center" width="33%" valign="middle"'
245                             )
246                         );       
247                   
248             }
249
250             //Armo el row
251             $rows = $this->tpl->parse('row', 'CELLS', $cell);
252
253             //Armo el template de la tabla
254             $result = $this->tpl->parse('tabla',
255                     array (
256                         'ROWS' => $rows,
257                         'ATTR' => $this->getAttributes(true)
258                         )
259                     );
260
261             return $result;
262         } 
263     }
264     
265     /**
266      * Agrega un páginador a la tabla, basado en un resultado de una base de datos.
267      * Ejemplo:
268      * @code
269      * $tabla = new MLIB_HTML_TablaDB('personas', array('width' => '100%'));
270      * $result = $db->query('SELECT nombre, apellido FROM tabla');
271      * if (DB::isError($result)) {
272      *      trigger_error('Error', E_USER_ERROR);
273      * }
274      * // Agrega el paginador por defecto y lo guarda para mostrar solo los
275      * // resultados paginados después.
276      * $pager = $tabla->addPager($result);
277      * // Agrega cabecera con los nombres de las columnas.
278      * $tabla->addRow(array('Nombre', 'Apellido'), 'cabecera');
279      * // Agrega los resultados paginados de la DB.
280      * $tabla->addRows($pager, array('nombre', 'apellido'));
281      * $tabla->display();
282      * @endcode
283      *
284      * @param DB_Result $result Resultado de una consulta de base de datos.
285      * @param mixed $tipo Tipo de link(s) a agregar. Puede ser:
286      *                    <ul>
287      *                      <li><tt>'anterior'</tt></li>
288      *                      <li><tt>'siguiente'</tt></li>
289      *                      <li><tt>'paginas'</tt></li>
290      *                    </ul>
291      *                    Puede pasarse uno solo como un string o varios como un
292      *                    array. Si se pasa <tt>'todo'</tt>, se incluyen todos.
293      *                    Si se pasa null, se incluyen <tt>'anterior'</tt>,
294      *                    <tt>'siguiente'</tt> y <tt>'paginas'</tt>.
295      * @param mixed $link Dirección a la que apuntan los links generados. Puede
296      *                    ser un MLIB_HTML_Link (para poder pasar variables por
297      *                    GET) o un string.
298      * @param int $limit Parámetro usado para crear el MLIB_DB_Pager.
299      * @param int $maxpages Parámetro usado para crear el MLIB_DB_Pager.
300      * @param string $getvar Nombre de la variable GET a usar para indicar el número
301      *               de página actual (se le pone el \ref setGetPrefix prefijo)
302      *
303      * @return MLIB_DB_Pager Pager que se puede usar para realizar los fetch de
304      *         los resultados de la página actual.
305      *
306      * @see MLIB_DB_Pager, addRows().
307      */
308     function addPager($result, $tipo = null, $link = null, $limit = 10, $maxpages = 21, $getvar = 'from') 
309     {
310         // Creo el pager con el resultado.
311         $pager = (is_array($result))?
312                  new MLIB_Array_Pager($result, @$_GET[$this->getGetVarPrefix().$getvar], $limit, $maxpages):
313                  new MLIB_DB_Pager($result, @$_GET[$this->getGetVarPrefix().$getvar], $limit, $maxpages);
314
315         // Obtengo un link válido.
316         if (!$link) {
317             $link = @$_SERVER['PHP_SELF'];
318         }
319         if (is_string($link)) {
320             $link = new MLIB_HTML_Link($link, '');
321         }
322         // Si es el tipo por defecto pone paginador nada más.
323         //Esto se podria poner como valor por defecto (aunque dejaria muy largo
324         //el encabezado de la funcion)
325         if (!$tipo) {
326             $tipo = array('anterior', 'paginas', 'siguiente');
327         }
328         // Convierte tipo a array.
329         if (!is_array($tipo)) {
330             $tipo = array($tipo);
331         }
332         // Me fijo si tiene cada uno de los elementos y los agrego.
333         if (in_array('anterior', $tipo) and $pager->numRows() and $pager->currentpage != 1) 
334         {
335             $link->setGetVar($this->getGetVarPrefix().$getvar, $pager->prev);
336             $img = new MLIB_HTML_Image('/MLIB/images/general_anterior', '<< ');
337             $cont = '';
338             $link->setContents($img);
339             $link->addContents($cont);
340             $this->updatePie($link, 'izquierda');
341         }
342         if (in_array('siguiente', $tipo) and $pager->numRows() and $pager->currentpage != $pager->numpages) {
343             $link->setGetVar($this->getGetVarPrefix().$getvar, $pager->next);
344             $img = new MLIB_HTML_Image('/MLIB/images/general_posterior', ' >>');
345             // Si no tiene titulo, le pone titulo por defecto.
346             $cont =  '';
347             $link->setContents($img);
348             $link->addContents($cont);
349             $this->updatePie($link, 'derecha');
350         }
351         if (in_array('paginas', $tipo) and $pager->numRows() and $pager->numpages > 1) {
352             $from = @$_GET[$this->getGetVarPrefix().$getvar];
353             $pags = '';
354             $lnk = $link->getContents();
355             foreach ($pager->pages as $page => $start_row) {
356                 if ($start_row == $from) {
357                     $pags .= '<b>'. $page . '</b>';
358                 } else {
359                     $link->setGetVar($this->getGetVarPrefix().$getvar, $start_row);
360                     $link->setContents($page);
361                     $pags .= $link->toHtml();
362                 }
363                 if ($page != $pager->lastpage) {
364                     $pags .= ' | ';
365                 }
366             }
367             $link->setContents($lnk);
368             $this->updatePie($pags, 'centro');
369         }
370         return $pager;
371     }
372     
373     /**
374      * Método que devuelve el contenido de una celda.
375      *
376      * @param int row Fila.
377      * @param int col Columna.
378      *
379      * @return mixed.
380      * @access protected
381      */
382     function getStringCellContent($row, $col)
383     {
384         //Veo si esta seteado el contenido de la celda
385         $content = '';
386         if (isset($this->_structure[$row][$col]['contents']))
387         {
388             //Ver si es un objeto
389             if (is_object($this->_structure[$row][$col]['contents']))
390             {
391                 //Busco el metodo toHtml
392                 if (method_exists($this->_structure[$row][$col]['contents'], "toHtml"))
393                 {
394                     $content = $this->_structure[$row][$col]['contents']->toHtml();
395                 }
396                 //Busco el metodo toString
397                 elseif (method_exists($this->_structure[$row][$col]['contents'], "toString"))
398                 {
399                     $content = $this->_structure[$row][$col]['contents']->toString();
400                 }
401                 //Busco el metodo __toString
402                 elseif
403                     (method_exists($this->_structure[$row][$col]['contents'], "__toString"))
404                     {
405                         $content = $this->_structure[$row][$col]['contents']->__toString();
406                     }
407             }
408             //No es un objeto, devuelvo lo que es
409             else
410             {
411                 $content = $this->_structure[$row][$col]['contents'];
412             }
413         }
414         return $content;
415     }
416
417     /**
418      * Convierte un atributo a string
419      * 
420      * Convierte un atributo HTML al string para pasar a los metodos de HTML_Table
421      * Recibe en $attrs los atributos a modificar.
422      *
423      * @param mixed $attrs Atributos.
424      * @param bool  $isSet Indica si hay que setear.
425      *
426      * @return array
427      * @access protected
428      */
429     function _translateAttributes($attrs, $isSet) {
430         if (!$attrs) {
431             return array();
432         }
433         if (is_string($attrs)) {
434             $attrs = $this->_parseAttributes($attrs);
435         }
436         $rta = array ();
437         /* Rezago de MLIB_HTML_Tabla.
438         if ($isSet) {
439             $rta = $this->_conf['atributos']['celda_comun'];
440         } else {
441             $rta = array();
442         }
443         */
444         foreach ($attrs as $attr => $val) {
445             $attr = strtolower($attr);
446             switch ($attr) {
447                 // Estilos de celda
448                 case 'comun':
449                 case 'cabecera':
450                 case 'titulo':
451                 case 'clara': 
452                 case 'oscura':
453                 case 'paginador':
454                 case 'sb':
455                 case 'comun_clara':
456                     $rta['celltype'] = 'cell' . ucfirst($attr);
457                     break;
458                 case 'align':
459                 case 'valign':
460                 case 'width':
461                 case 'height':
462                 case 'rowspan':
463                 case 'colspan':
464                 case 'bgcolor':
465                 case 'class':
466                 case 'border':
467                 case 'cellspacing':
468                 case 'cellpadding':
469                 case 'nowrap':
470                     $rta[$attr] = $val;
471                     break;
472                 case 'spacing':
473                 case 'padding':
474                     $rta["cell$attr"] = $val;
475                     break;
476                 case 'th':
477                     $rta[$attr] = '';
478                     break;
479                 default:
480                     trigger_error("No se permite setear el atributo $attr", E_USER_ERROR);
481             }
482         }
483         return $rta;
484     }
485 }
486 ?>