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