1 <?php /* vim: set binary expandtab tabstop=4 shiftwidth=4 textwidth=80:
2 -------------------------------------------------------------------------------
4 -------------------------------------------------------------------------------
5 This file is part of mlib.
7 mlib is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2 of the License, or (at your option)
12 mlib is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License; if not,
17 write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
18 Boston, MA 02111-1307 USA
19 -------------------------------------------------------------------------------
20 Creado: jue jul 17 15:32:52 ART 2003
21 Autor: Gonzalo Merayo <gmeray@mecon.gov.ar>
22 Leandro Lucarella <llucar@mecon.gov.ar>
23 -------------------------------------------------------------------------------
25 -----------------------------------------------------------------------------*/
27 require_once 'HTML/Table.php';
28 require_once 'MLIB/HTML/Image.php';
35 class MLIB_HTML_Arbol extends HTML_Table
57 * @var string $link_append
65 * @param array $datos Datos con los cuales construir el árbol.
66 * @param string $titulo Título.
67 * @param string $link_append DESC.
72 function MLIB_HTML_Arbol($datos, $titulo, $link_append = '')
74 parent::HTML_Table(array(
79 'bgcolor' => '#003868'));
80 $this->datos = $datos;
81 $this->titulo = $titulo;
82 $this->link_append = $link_append;
86 * Devuelve el path del stylesheet de esta clase
92 return '/MLIB/css/html/arbol';
98 * @param TIPO $dat DESC
100 * @param TIPO &$tabla DESC
105 function expandir($dat, $n, &$tabla)
109 '/MLIB/images/arbol_bullet_1.gif',
110 '/MLIB/images/arbol_bullet_2.gif',
111 '/MLIB/images/arbol_bullet_3.gif'
119 $classes = array('MLIB_html_arbol_menu', 'MLIB_html_arbol_menu1',
120 'MLIB_html_arbol_menu1', 'MLIB_html_arbol_menu2');
124 'width' => $n * $tabulados,
129 $margen = new MLIB_HTML_Image('/MLIB/images/blanco.gif', str_repeat(' ', $n), $atr);
130 $margen = $margen->toHtml();
134 $imagen = new MLIB_HTML_Image($bullets[$n], @$alts[$n]);
135 $imagen = $imagen->toHtml();
137 foreach ($dat as $e) {
138 $titulo = $e['titulo'];
139 if(isset($e['activo']) && $e['activo'] != 0) $class = 'MLIB_html_arbol_menu_activo';
140 else $class = @$classes[$n] ? $classes[$n] : end($classes);
141 if(isset($e['bold'])) $class .= '_bold';
142 if(!is_null($e['link'])) {
144 if ($this->link_append and @$e['id']) {
145 $link .= $this->link_append . $e['id'];
147 $titulo = '<a href="'.$link.'" class="'.$class.'">'.$titulo.'</a>';
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);
158 * Devuelve el html a imprimir
165 $this->setRowCount(0);
166 $t_interna = new HTML_Table(array(
169 'cellspacing' => '2',
170 'cellpadding' => '0',
171 'class' => 'MLIB_html_arbol_bodytext'));
172 $titulo = new HTML_Table(array(
176 'cellspacing' => '0',
177 'cellpadding' => '0',
179 'background' => '/MLIB/images/arbol_titulo.gif'));
180 $titulo->addRow(array($this->titulo), array(
182 'class' => 'MLIB_html_arbol_titulo'));
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();
192 * @param TIPO $dat DESC
193 * @param TIPO $n DESC
194 * @param TIPO $filtarActivos DESC
199 function expandirArray($dat, $n, $filtrarActivos)
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']) {
208 $array[$e['id']] = str_repeat(' ', $n) . $e['titulo'];
210 $array += $this->expandirArray($e['sub'], $n + 1, $filtrarActivos);
219 * @param bool $filtrarActivos DESC
224 function toArray($filtrarActivos = true)
226 return $this->expandirArray($this->datos, 0, $filtrarActivos);
232 * @param TIPO $dat DESC
233 * @param TIPO $n DESC
234 * @param TIPO $filtarActivos DESC
239 function expandirString($dat, $n, $filtrarActivos)
243 for ($i = 0; $i < $tot; $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']) {
250 $indent = str_repeat('| ', $n);
251 if ($i == ($tot - 1)) {
256 $str .= $indent . $e['titulo'] . "\n";
258 $str .= $this->expandirString($e['sub'], $n + 1, $filtrarActivos);
267 * @param bool $filtrarActivos DESC
272 function toString($filtrarActivos = true)
274 return $this->expandirString($this->datos, 0, $filtrarActivos);
278 * Activa un nodo del árbol.
280 * @param int $id Id del nodo a modificar.
281 * @param bool $activo Nuevo valor, true si está activo, false si no.
283 * @return bool True si se pudo modificar.
286 function setActivo($id, $activo = 1) {
287 return $this->modificarNodo($this->datos, $id, 'activo', $activo);
291 * Modifica un nodo del array.
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.
298 * @return bool True si se pudo modificar.
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;
306 } elseif (@$datos[$k]['sub']
307 and $this->modificarNodo($datos[$k]['sub'], $id, $key, $val)) {