]> git.llucax.com Git - mecon/meconlib.git/blob - lib/MECON/HTML/Arbol.php
Se cambia la expansion por default para compatibilidad hacia atras.
[mecon/meconlib.git] / lib / MECON / HTML / Arbol.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: jue jul 17 15:32:52 ART 2003
22 Autor:  Gonzalo Merayo <gmeray@mecon.gov.ar>
23         Leandro Lucarella <llucar@mecon.gov.ar>
24 -------------------------------------------------------------------------------
25 $Id$
26 -----------------------------------------------------------------------------*/
27
28 require_once 'HTML/Table.php';
29 require_once 'MECON/HTML/Image.php';
30
31 /**
32  * DESC
33  *
34  * @access public
35  */
36 class MECON_HTML_Arbol extends HTML_Table
37 {
38
39     /**
40      * DESC
41      *
42      * @var TIPO $datos  
43      * @access public
44      */
45     var $datos;
46
47     /**
48      * DESC
49      *
50      * @var TIPO $titulo  
51      * @access public
52      */
53     var $titulo;
54
55     /**
56      * DESC
57      *
58      * @var string $link_append
59      * @access public
60      */
61     var $link_append;
62
63     /**
64      * Constructor.
65      *
66      * @param array $datos Datos con los cuales construir el árbol.
67      * @param string $titulo Título.
68      * @param string $link_append DESC.
69      *
70      * @return void
71      * @access public
72      */
73     function MECON_HTML_Arbol($datos, $titulo, $link_append = '')
74     {
75         parent::HTML_Table(array(
76             'width'         => '132',
77             'border'        => '0',
78             'cellspacing'   => '0',
79             'cellpadding'   => '0',
80             'bgcolor'       => '#003868'));
81         $this->datos        = $datos;
82         $this->titulo       = $titulo;
83         $this->link_append  = $link_append;
84     }
85
86     /**
87      * Devuelve el path del stylesheet de esta clase
88      *
89      * @retur string
90      * @access public
91      */
92     function getCSS() {
93         return '/MECON/css/arbol';
94     }
95
96     /**
97      * DESC
98      *
99      * @param TIPO $dat DESC
100      * @param TIPO $n DESC
101      * @param TIPO &$tabla DESC
102      *
103      * @return TIPO
104      * @access public
105      */
106     function expandir($dat, $n, &$tabla)
107     {
108         $bullets = array(
109             '',
110             '/MECON/images/arbol_bullet_1.gif',
111             '/MECON/images/arbol_bullet_2.gif',
112             '/MECON/images/arbol_bullet_3.gif'
113         );
114         $alts = array(
115             '',
116             '*',
117             '-',
118             '·'
119         );
120         $classes = array('menu', 'menu1', 'menu1', '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 MECON_HTML_Image('/MECON/images/blanco.gif', str_repeat('  ', $n), $atr);
130             $margen = $margen->toHtml();
131         }
132         $imagen = '';
133         if (@$bullets[$n]) {
134             $imagen = new MECON_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 = 'menu_activo';
140             else $class = $classes[$n];
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'         => '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'    => '/MECON/images/arbol_titulo.gif'));
180         $titulo->addRow(array($this->titulo), array(
181             'align' => 'center',
182             'class' => 'arboltitulo'));
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 ?>