]> git.llucax.com Git - mecon/meconlib.git/blob - lib/MLIB/HTML/Arbol.php
Se agrega a la clase MLIB_PDF_Tabla la posibilidad de agregar estilos nuevos para
[mecon/meconlib.git] / lib / MLIB / HTML / Arbol.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: jue jul 17 15:32:52 ART 2003
21 Autor:  Gonzalo Merayo <gmeray@mecon.gov.ar>
22         Leandro Lucarella <llucar@mecon.gov.ar>
23 -------------------------------------------------------------------------------
24 $Id$
25 -----------------------------------------------------------------------------*/
26
27 require_once 'HTML/Table.php';
28 require_once 'MLIB/HTML/Image.php';
29
30 /**
31  * DESC
32  *
33  * @access public
34  */
35 class MLIB_HTML_Arbol extends HTML_Table
36 {
37
38     /**
39      * DESC
40      *
41      * @var TIPO $datos  
42      * @access public
43      */
44     var $datos;
45
46     /**
47      * DESC
48      *
49      * @var TIPO $titulo  
50      * @access public
51      */
52     var $titulo;
53
54     /**
55      * DESC
56      *
57      * @var string $link_append
58      * @access public
59      */
60     var $link_append;
61
62     /**
63      * Constructor.
64      *
65      * @param array $datos Datos con los cuales construir el árbol.
66      * @param string $titulo Título.
67      * @param string $link_append DESC.
68      *
69      * @return void
70      * @access public
71      */
72     function MLIB_HTML_Arbol($datos, $titulo, $link_append = '')
73     {
74         parent::HTML_Table(array(
75             'width'         => '132',
76             'border'        => '0',
77             'cellspacing'   => '0',
78             'cellpadding'   => '0',
79             'bgcolor'       => '#003868'));
80         $this->datos        = $datos;
81         $this->titulo       = $titulo;
82         $this->link_append  = $link_append;
83     }
84
85     /**
86      * Devuelve el path del stylesheet de esta clase
87      *
88      * @retur string
89      * @access public
90      */
91     function getCSS() {
92         return '/MLIB/css/html/arbol';
93     }
94
95     /**
96      * DESC
97      *
98      * @param TIPO $dat DESC
99      * @param TIPO $n DESC
100      * @param TIPO &$tabla DESC
101      *
102      * @return TIPO
103      * @access public
104      */
105     function expandir($dat, $n, &$tabla)
106     {
107         $bullets = array(
108             '',
109             '/MLIB/images/arbol_bullet_1.gif',
110             '/MLIB/images/arbol_bullet_2.gif',
111             '/MLIB/images/arbol_bullet_3.gif'
112         );
113         $alts = array(
114             '',
115             '*',
116             '-',
117             '·'
118         );
119         $classes = array('MLIB_html_arbol_menu', 'MLIB_html_arbol_menu1',
120             'MLIB_html_arbol_menu1', 'MLIB_html_arbol_menu2');
121         $tabulados = 7;
122         $atr = array(
123             'border' => '0',
124             'width'  => $n * $tabulados,
125             'height' => '1'
126         );
127         $margen = ' ';
128         if ($n) {
129             $margen = new MLIB_HTML_Image('/MLIB/images/blanco.gif', str_repeat('  ', $n), $atr);
130             $margen = $margen->toHtml();
131         }
132         $imagen = '';
133         if (@$bullets[$n]) {
134             $imagen = new MLIB_HTML_Image($bullets[$n], @$alts[$n]);
135             $imagen = $imagen->toHtml();
136         }
137         foreach ($dat as $e) {
138             $titulo = $e['titulo'];
139             if(isset($e['activo']) && $e['activo'] != 0) $class = 'MLIB_html_arbol_menu_activo';
140             else $class = @$classes[$n] ? $classes[$n] : end($classes);
141             if(isset($e['bold'])) $class .= '_bold';
142             if(!is_null($e['link'])) {
143                 $link = $e['link'];
144                 if ($this->link_append and @$e['id']) {
145                     $link .= $this->link_append . $e['id'];
146                 }
147                 $titulo = '<a href="'.$link.'" class="'.$class.'">'.$titulo.'</a>';
148             }
149             $titulo = '<table border=0 cellpadding=0 cellspacing=0 align="left"><tr><td valign="top">'.$margen.$imagen.'</td><td>'.$titulo.'</td></tr></table>';//TODO
150             $tabla->addRow(array($titulo), array('class' => $class));
151             if(isset($e['sub'])) {
152                 $this->expandir($e['sub'], $n+1, $tabla);
153             }
154         }
155     }
156
157     /**
158      * Devuelve el html a imprimir
159      *
160      * @return string
161      * @access public
162      */
163     function toHTML()
164     {
165         $this->setRowCount(0);
166         $t_interna = new HTML_Table(array(
167             'width'         =>'132',
168             'border'        => '0',
169             'cellspacing'   => '2',
170             'cellpadding'   => '0',
171             'class'         => 'MLIB_html_arbol_bodytext'));
172         $titulo = new HTML_Table(array(
173             'width'         => '132',
174             'height'        => '26',
175             'border'        => '0',
176             'cellspacing'   => '0',
177             'cellpadding'   => '0',
178             'align'         => 'center',
179             'background'    => '/MLIB/images/arbol_titulo.gif'));
180         $titulo->addRow(array($this->titulo), array(
181             'align' => 'center',
182             'class' => 'MLIB_html_arbol_titulo'));
183         $this->addRow(array($titulo), array('bgcolor' => '#FFFFFF'));
184         $this->expandir($this->datos, 0, $t_interna);
185         $this->addRow(array($t_interna->toHTML()));
186         return parent::toHTML();
187     }
188
189     /**
190      * DESC
191      *
192      * @param TIPO $dat DESC
193      * @param TIPO $n DESC
194      * @param TIPO $filtarActivos DESC
195      *
196      * @return array
197      * @access public
198      */
199     function expandirArray($dat, $n, $filtrarActivos)
200     {
201         $array = array();
202         foreach ($dat as $e) {
203             // Si no tiene ID o esta activo y se filtran los activos, se
204             // continua con el proximo item.
205             if (!@$e['id'] or $filtrarActivos and @$e['activo']) {
206                 continue;
207             }
208             $array[$e['id']] = str_repeat('&nbsp;&nbsp;&nbsp;', $n) . $e['titulo'];
209             if(@$e['sub']) {
210                 $array += $this->expandirArray($e['sub'], $n + 1, $filtrarActivos);
211             }
212         }
213         return $array;
214     }
215
216     /**
217      * DESC
218      *
219      * @param bool $filtrarActivos DESC
220      *
221      * @return array
222      * @access public
223      */
224     function toArray($filtrarActivos = true)
225     {
226         return $this->expandirArray($this->datos, 0, $filtrarActivos);
227     }
228
229     /**
230      * DESC
231      *
232      * @param TIPO $dat DESC
233      * @param TIPO $n DESC
234      * @param TIPO $filtarActivos DESC
235      *
236      * @return string
237      * @access public
238      */
239     function expandirString($dat, $n, $filtrarActivos)
240     {
241         $str = '';
242         $tot = count($dat);
243         for ($i = 0; $i < $tot; $i++) {
244             $e = $dat[$i];
245             // Si no tiene ID o esta activo y se filtran los activos, se
246             // continua con el proximo item.
247             if (!@$e['id'] or $filtrarActivos and @$e['activo']) {
248                 continue;
249             }
250             $indent = str_repeat('|  ', $n);
251             if ($i == ($tot - 1)) {
252                 $indent .= '`- ';
253             } else {
254                 $indent .= '|- ';
255             }
256             $str .= $indent . $e['titulo'] . "\n";
257             if(@$e['sub']) {
258                 $str .= $this->expandirString($e['sub'], $n + 1, $filtrarActivos);
259             }
260         }
261         return $str;
262     }
263
264     /**
265      * DESC
266      *
267      * @param bool $filtrarActivos DESC
268      *
269      * @return string
270      * @access public
271      */
272     function toString($filtrarActivos = true)
273     {
274         return $this->expandirString($this->datos, 0, $filtrarActivos);
275     }
276
277     /**
278      * Activa un nodo del árbol.
279      *
280      * @param int $id Id del nodo a modificar.
281      * @param bool $activo Nuevo valor, true si está activo, false si no.
282      *
283      * @return bool True si se pudo modificar.
284      * @access public
285      */
286     function setActivo($id, $activo = 1) {
287         return $this->modificarNodo($this->datos, $id, 'activo', $activo);
288     }
289
290     /**
291      * Modifica un nodo del array.
292      *
293      * @param array $datos Datos del árbol a modificar.
294      * @param int $id Id del elemento a modificar.
295      * @param string $key Clave del dato a modificar.
296      * @param mixed $val Nuevo valor.
297      *
298      * @return bool True si se pudo modificar.
299      * @access public
300      */
301     function modificarNodo(&$datos, $id, $key, $val) {
302         foreach (array_keys($datos) as $k) {
303             if (@$datos[$k]['id'] == $id) {
304                 $datos[$k][$key] = $val;
305                 return true;
306             } elseif (@$datos[$k]['sub']
307                     and $this->modificarNodo($datos[$k]['sub'], $id, $key, $val)) {
308                 return true;
309             }
310         }
311         return false;
312     }
313
314 };
315
316 ?>