]> git.llucax.com Git - mecon/meconlib.git/blob - lib/MECON/HTML/Arbol.php
BugFix.
[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/html/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('mecon_html_arbol_menu', 'mecon_html_arbol_menu1',
121             'mecon_html_arbol_menu1', 'mecon_html_arbol_menu2');
122         $tabulados = 7;
123         $atr = array(
124             'border' => '0',
125             'width'  => $n * $tabulados,
126             'height' => '1'
127         );
128         $margen = ' ';
129         if ($n) {
130             $margen = new MECON_HTML_Image('/MECON/images/blanco.gif', str_repeat('  ', $n), $atr);
131             $margen = $margen->toHtml();
132         }
133         $imagen = '';
134         if (@$bullets[$n]) {
135             $imagen = new MECON_HTML_Image($bullets[$n], @$alts[$n]);
136             $imagen = $imagen->toHtml();
137         }
138         foreach ($dat as $e) {
139             $titulo = $e['titulo'];
140             if(isset($e['activo']) && $e['activo'] != 0) $class = 'mecon_html_arbol_menu_activo';
141             else $class = @$classes[$n] ? $classes[$n] : end($classes);
142             if(isset($e['bold'])) $class .= '_bold';
143             if(!is_null($e['link'])) {
144                 $link = $e['link'];
145                 if ($this->link_append and @$e['id']) {
146                     $link .= $this->link_append . $e['id'];
147                 }
148                 $titulo = '<a href="'.$link.'" class="'.$class.'">'.$titulo.'</a>';
149             }
150             $titulo = '<table border=0 cellpadding=0 cellspacing=0 align="left"><tr><td valign="top">'.$margen.$imagen.'</td><td>'.$titulo.'</td></tr></table>';//TODO
151             $tabla->addRow(array($titulo), array('class' => $class));
152             if(isset($e['sub'])) {
153                 $this->expandir($e['sub'], $n+1, $tabla);
154             }
155         }
156     }
157
158     /**
159      * Devuelve el html a imprimir
160      *
161      * @return string
162      * @access public
163      */
164     function toHTML()
165     {
166         $this->setRowCount(0);
167         $t_interna = new HTML_Table(array(
168             'width'         =>'132',
169             'border'        => '0',
170             'cellspacing'   => '2',
171             'cellpadding'   => '0',
172             'class'         => 'mecon_html_arbol_bodytext'));
173         $titulo = new HTML_Table(array(
174             'width'         => '132',
175             'height'        => '26',
176             'border'        => '0',
177             'cellspacing'   => '0',
178             'cellpadding'   => '0',
179             'align'         => 'center',
180             'background'    => '/MECON/images/arbol_titulo.gif'));
181         $titulo->addRow(array($this->titulo), array(
182             'align' => 'center',
183             'class' => 'mecon_html_arbol_titulo'));
184         $this->addRow(array($titulo), array('bgcolor' => '#FFFFFF'));
185         $this->expandir($this->datos, 0, $t_interna);
186         $this->addRow(array($t_interna->toHTML()));
187         return parent::toHTML();
188     }
189
190     /**
191      * DESC
192      *
193      * @param TIPO $dat DESC
194      * @param TIPO $n DESC
195      * @param TIPO $filtarActivos DESC
196      *
197      * @return array
198      * @access public
199      */
200     function expandirArray($dat, $n, $filtrarActivos)
201     {
202         $array = array();
203         foreach ($dat as $e) {
204             // Si no tiene ID o esta activo y se filtran los activos, se
205             // continua con el proximo item.
206             if (!@$e['id'] or $filtrarActivos and @$e['activo']) {
207                 continue;
208             }
209             $array[$e['id']] = str_repeat('&nbsp;&nbsp;&nbsp;', $n) . $e['titulo'];
210             if(@$e['sub']) {
211                 $array += $this->expandirArray($e['sub'], $n + 1, $filtrarActivos);
212             }
213         }
214         return $array;
215     }
216
217     /**
218      * DESC
219      *
220      * @param bool $filtrarActivos DESC
221      *
222      * @return array
223      * @access public
224      */
225     function toArray($filtrarActivos = true)
226     {
227         return $this->expandirArray($this->datos, 0, $filtrarActivos);
228     }
229
230     /**
231      * DESC
232      *
233      * @param TIPO $dat DESC
234      * @param TIPO $n DESC
235      * @param TIPO $filtarActivos DESC
236      *
237      * @return string
238      * @access public
239      */
240     function expandirString($dat, $n, $filtrarActivos)
241     {
242         $str = '';
243         $tot = count($dat);
244         for ($i = 0; $i < $tot; $i++) {
245             $e = $dat[$i];
246             // Si no tiene ID o esta activo y se filtran los activos, se
247             // continua con el proximo item.
248             if (!@$e['id'] or $filtrarActivos and @$e['activo']) {
249                 continue;
250             }
251             $indent = str_repeat('|  ', $n);
252             if ($i == ($tot - 1)) {
253                 $indent .= '`- ';
254             } else {
255                 $indent .= '|- ';
256             }
257             $str .= $indent . $e['titulo'] . "\n";
258             if(@$e['sub']) {
259                 $str .= $this->expandirString($e['sub'], $n + 1, $filtrarActivos);
260             }
261         }
262         return $str;
263     }
264
265     /**
266      * DESC
267      *
268      * @param bool $filtrarActivos DESC
269      *
270      * @return string
271      * @access public
272      */
273     function toString($filtrarActivos = true)
274     {
275         return $this->expandirString($this->datos, 0, $filtrarActivos);
276     }
277
278     /**
279      * Activa un nodo del árbol.
280      *
281      * @param int $id Id del nodo a modificar.
282      * @param bool $activo Nuevo valor, true si está activo, false si no.
283      *
284      * @return bool True si se pudo modificar.
285      * @access public
286      */
287     function setActivo($id, $activo = 1) {
288         return $this->modificarNodo($this->datos, $id, 'activo', $activo);
289     }
290
291     /**
292      * Modifica un nodo del array.
293      *
294      * @param array $datos Datos del árbol a modificar.
295      * @param int $id Id del elemento a modificar.
296      * @param string $key Clave del dato a modificar.
297      * @param mixed $val Nuevo valor.
298      *
299      * @return bool True si se pudo modificar.
300      * @access public
301      */
302     function modificarNodo(&$datos, $id, $key, $val) {
303         foreach (array_keys($datos) as $k) {
304             if (@$datos[$k]['id'] == $id) {
305                 $datos[$k][$key] = $val;
306                 return true;
307             } elseif (@$datos[$k]['sub']
308                     and $this->modificarNodo($datos[$k]['sub'], $id, $key, $val)) {
309                 return true;
310             }
311         }
312         return false;
313     }
314
315 };
316
317 ?>