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