]> git.llucax.com Git - mecon/meconlib.git/blob - lib/MECON/HTML/Arbol.php
e3a1012f09919744c8ec4b41590c5f21a39d8c60
[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 'HTML/Image.php';
30
31 class HTML_Arbol extends HTML_Table
32 {
33     var $datos;
34     var $titulo;
35     var $link_append;
36
37     /**
38      * Constructor.
39      *
40      * @param array $datos Datos con los cuales construir el árbol.
41      * @param string $titulo Título.
42      * @param int $raiz Nodo raíz (de donde empezar a dibujar el árbol).
43      */
44     function HTML_Arbol($datos, $titulo, $link_append = '')
45     {
46         parent::HTML_Table(array(
47             'width'         => '132',
48             'border'        => '0',
49             'cellspacing'   => '0',
50             'cellpadding'   => '0',
51             'bgcolor'       => '#003868'));
52         $this->datos        = $datos;
53         $this->titulo       = $titulo;
54         $this->link_append  = $link_append;
55     }
56
57     function getCSS() {
58         return '/MECON/css/arbol';
59     }
60
61     function expandir($dat, $n, &$tabla)
62     {
63         $bullets = array(
64             '',
65             '/MECON/images/arbol_bullet_1.gif',
66             '/MECON/images/arbol_bullet_2.gif',
67             '/MECON/images/arbol_bullet_3.gif'
68         );
69         $alts = array(
70             '',
71             '*',
72             '-',
73             '·'
74         );
75         $classes = array('menu', 'menu1', 'menu1', 'menu2');
76         $tabulados = 7;
77         $atr = array(
78             'border' => '0',
79             'width'  => $n * $tabulados,
80             'height' => '1'
81         );
82         $margen = ' ';
83         if ($n) {
84             $margen = new HTML_Image('/MECON/images/blanco.gif', str_repeat('  ', $n), $atr);
85             $margen = $margen->toHtml();
86         }
87         $imagen = '';
88         if (@$bullets[$n]) {
89             $imagen = new HTML_Image($bullets[$n], @$alts[$n]);
90             $imagen = $imagen->toHtml();
91         }
92         foreach ($dat as $e) {
93             $titulo = $margen.$imagen.$e['titulo'];
94             if(isset($e['activo']) && $e['activo'] != 0) $class = 'menu_activo';
95             else $class = $classes[$n];
96             if(!is_null($e['link'])) {
97                 $link = $e['link'];
98                 if ($this->link_append and @$e['id']) {
99                     $link .= $this->link_append . $e['id'];
100                 }
101                 $titulo = '<a href="'.$link.'" class="'.$class.'">'.$titulo.'</a>';
102             }
103             $tabla->addRow(array($titulo), array('class' => $class));
104             if(isset($e['sub'])) {
105                 $this->expandir($e['sub'], $n+1, $tabla);
106             }
107         }
108     }
109
110     function toHTML()
111     {
112         $this->setRowCount(0);
113         $t_interna = new HTML_Table(array(
114             'width'         =>'132',
115             'border'        => '0',
116             'cellspacing'   => '2',
117             'cellpadding'   => '0',
118             'class'         => 'bodytext'));
119         $titulo = new HTML_Table(array(
120             'width'         => '132',
121             'height'        => '26',
122             'border'        => '0',
123             'cellspacing'   => '0',
124             'cellpadding'   => '0',
125             'align'         => 'center',
126             'background'    => '/MECON/images/arbol_titulo.gif'));
127         $titulo->addRow(array($this->titulo), array(
128             'align' => 'center',
129             'class' => 'arboltitulo'));
130         $this->addRow(array($titulo), array('bgcolor' => '#FFFFFF'));
131         $this->expandir($this->datos, 0, $t_interna);
132         $this->addRow(array($t_interna->toHTML()));
133         // FIXME - sacar la style sheet de aca.
134         return '<link rel="stylesheet" href="'.$this->getCSS().'">'.parent::toHTML();
135     }
136
137     function expandirArray($dat, $n, $filtrarActivos)
138     {
139         $array = array();
140         foreach ($dat as $e) {
141             // Si no tiene ID o esta activo y se filtran los activos, se
142             // continua con el proximo item.
143             if (!@$e['id'] or $filtrarActivos and @$e['activo']) {
144                 continue;
145             }
146             $array[$e['id']] = str_repeat('&nbsp;&nbsp;&nbsp;', $n) . $e['titulo'];
147             if(@$e['sub']) {
148                 $array += $this->expandirArray($e['sub'], $n + 1, $filtrarActivos);
149             }
150         }
151         return $array;
152     }
153
154     function toArray($filtrarActivos = true)
155     {
156         return $this->expandirArray($this->datos, 0, $filtrarActivos);
157     }
158
159     function expandirString($dat, $n, $filtrarActivos)
160     {
161         $str = '';
162         $tot = count($dat);
163         for ($i = 0; $i < $tot; $i++) {
164             $e = $dat[$i];
165             // Si no tiene ID o esta activo y se filtran los activos, se
166             // continua con el proximo item.
167             if (!@$e['id'] or $filtrarActivos and @$e['activo']) {
168                 continue;
169             }
170             $indent = str_repeat('|  ', $n);
171             if ($i == ($tot - 1)) {
172                 $indent .= '`- ';
173             } else {
174                 $indent .= '|- ';
175             }
176             $str .= $indent . $e['titulo'] . "\n";
177             if(@$e['sub']) {
178                 $str .= $this->expandirString($e['sub'], $n + 1, $filtrarActivos);
179             }
180         }
181         return $str;
182     }
183
184     function toString($filtrarActivos = true)
185     {
186         return $this->expandirString($this->datos, 0, $filtrarActivos);
187     }
188
189     /**
190      * Activa un nodo del árbol.
191      *
192      * @param int $id Id del nodo a modificar.
193      * @param bool $activo Nuevo valor, true si está activo, false si no.
194      *
195      * @return bool True si se pudo modificar.
196      */
197     function setActivo($id, $activo = 1) {
198         return $this->modificarNodo($this->datos, $id, 'activo', $activo);
199     }
200
201     /**
202      * Modifica un nodo del array.
203      *
204      * @param array $datos Datos del árbol a modificar.
205      * @param int $id Id del elemento a modificar.
206      * @param string $key Clave del dato a modificar.
207      * @param mixed $val Nuevo valor.
208      *
209      * @return bool True si se pudo modificar.
210      */
211     function modificarNodo(&$datos, $id, $key, $val) {
212         foreach (array_keys($datos) as $k) {
213             if (@$datos[$k]['id'] == $id) {
214                 $datos[$k][$key] = $val;
215                 return true;
216             } elseif (@$datos[$k]['sub']
217                     and $this->modificarNodo($datos[$k]['sub'], $id, $key, $val)) {
218                 return true;
219             }
220         }
221         return false;
222     }
223
224 };
225
226 ?>