X-Git-Url: https://git.llucax.com/mecon/meconlib.git/blobdiff_plain/b12475b5fb8b24cade1c6f469ca9017871487789..56c363442764a21af0820b0e3dd6e9b771119abf:/lib/MECON/HTML/Arbol.php?ds=sidebyside diff --git a/lib/MECON/HTML/Arbol.php b/lib/MECON/HTML/Arbol.php index cf919b0..e3a1012 100644 --- a/lib/MECON/HTML/Arbol.php +++ b/lib/MECON/HTML/Arbol.php @@ -20,6 +20,7 @@ Boston, MA 02111-1307 USA ------------------------------------------------------------------------------- Creado: jue jul 17 15:32:52 ART 2003 Autor: Gonzalo Merayo + Leandro Lucarella ------------------------------------------------------------------------------- $Id$ -----------------------------------------------------------------------------*/ @@ -29,68 +30,197 @@ require_once 'HTML/Image.php'; class HTML_Arbol extends HTML_Table { - var $t_interna; + var $datos; + var $titulo; + var $link_append; - function HTML_Arbol($dat, $titulo_str) + /** + * Constructor. + * + * @param array $datos Datos con los cuales construir el árbol. + * @param string $titulo Título. + * @param int $raiz Nodo raíz (de donde empezar a dibujar el árbol). + */ + function HTML_Arbol($datos, $titulo, $link_append = '') { - parent::HTML_Table(array ('width'=>'132', - 'border' => '0', - 'cellspacing' => '0', - 'cellpadding' => '0', - 'bgcolor' => '#003868')); - $this->t_interna = new HTML_Table(array ('width'=>'132', - 'border' => '0', - 'cellspacing' => '2', - 'cellpadding' => '0', - 'class' => 'bodytext')); - $titulo = new HTML_Table(array('width'=>'132', - 'height'=>'26', - 'border' => '0', - 'cellspacing' => '0', - 'cellpadding' => '0', - 'align'=>'center', - 'background'=>'/MECON/images/arbol_titulo.gif')); - $titulo->addRow(array($titulo_str), array('align'=>'center', - 'class'=>'arboltitulo')); - $this->addRow(array($titulo), array('bgcolor' => '#FFFFFF')); - $this->expandir($dat, 0); + parent::HTML_Table(array( + 'width' => '132', + 'border' => '0', + 'cellspacing' => '0', + 'cellpadding' => '0', + 'bgcolor' => '#003868')); + $this->datos = $datos; + $this->titulo = $titulo; + $this->link_append = $link_append; } - - function expandir($dat, $n) + + function getCSS() { + return '/MECON/css/arbol'; + } + + function expandir($dat, $n, &$tabla) { + $bullets = array( + '', + '/MECON/images/arbol_bullet_1.gif', + '/MECON/images/arbol_bullet_2.gif', + '/MECON/images/arbol_bullet_3.gif' + ); + $alts = array( + '', + '*', + '-', + '·' + ); + $classes = array('menu', 'menu1', 'menu1', 'menu2'); + $tabulados = 7; + $atr = array( + 'border' => '0', + 'width' => $n * $tabulados, + 'height' => '1' + ); + $margen = ' '; + if ($n) { + $margen = new HTML_Image('/MECON/images/blanco.gif', str_repeat('  ', $n), $atr); + $margen = $margen->toHtml(); + } $imagen = ''; - $bullets = array( - '', - '/MECON/images/arbol_bullet_1.gif', - '/MECON/images/arbol_bullet_2.gif', - '/MECON/images/arbol_bullet_3.gif' - ); - $tabulados = 7; - $classes = array('menu', 'menu1', 'menu1', 'menu2'); - - $atr = array('border' => '0', - 'width' => $n * $tabulados, - 'height' => '10'); - $imagen =& new HTML_Image(@$bullets[$n] ? $bullets[$n] : '', 'bullet', $atr); - foreach($dat as $e) - { - $e['titulo'] = $imagen->toHTML().$e['titulo']; - if(isset($e['activado']) && $e['activado'] != 0) $class = 'menu_activo'; - else $class = $classes[$n]; - if(!is_null($e['link'])) - $e['titulo'] = ''.$e['titulo'].''; - $this->t_interna->addRow(array($e['titulo']), array('class' => $class)); - if(isset($e['sub'])) - $this->expandir($e['sub'], $n+1); - } + if (@$bullets[$n]) { + $imagen = new HTML_Image($bullets[$n], @$alts[$n]); + $imagen = $imagen->toHtml(); + } + foreach ($dat as $e) { + $titulo = $margen.$imagen.$e['titulo']; + if(isset($e['activo']) && $e['activo'] != 0) $class = 'menu_activo'; + else $class = $classes[$n]; + if(!is_null($e['link'])) { + $link = $e['link']; + if ($this->link_append and @$e['id']) { + $link .= $this->link_append . $e['id']; + } + $titulo = ''.$titulo.''; + } + $tabla->addRow(array($titulo), array('class' => $class)); + if(isset($e['sub'])) { + $this->expandir($e['sub'], $n+1, $tabla); + } + } } function toHTML() { - echo ''; - $this->addRow(array($this->t_interna->toHTML())); - return parent::toHTML(); + $this->setRowCount(0); + $t_interna = new HTML_Table(array( + 'width' =>'132', + 'border' => '0', + 'cellspacing' => '2', + 'cellpadding' => '0', + 'class' => 'bodytext')); + $titulo = new HTML_Table(array( + 'width' => '132', + 'height' => '26', + 'border' => '0', + 'cellspacing' => '0', + 'cellpadding' => '0', + 'align' => 'center', + 'background' => '/MECON/images/arbol_titulo.gif')); + $titulo->addRow(array($this->titulo), array( + 'align' => 'center', + 'class' => 'arboltitulo')); + $this->addRow(array($titulo), array('bgcolor' => '#FFFFFF')); + $this->expandir($this->datos, 0, $t_interna); + $this->addRow(array($t_interna->toHTML())); + // FIXME - sacar la style sheet de aca. + return ''.parent::toHTML(); + } + + function expandirArray($dat, $n, $filtrarActivos) + { + $array = array(); + foreach ($dat as $e) { + // Si no tiene ID o esta activo y se filtran los activos, se + // continua con el proximo item. + if (!@$e['id'] or $filtrarActivos and @$e['activo']) { + continue; + } + $array[$e['id']] = str_repeat('   ', $n) . $e['titulo']; + if(@$e['sub']) { + $array += $this->expandirArray($e['sub'], $n + 1, $filtrarActivos); + } + } + return $array; + } + + function toArray($filtrarActivos = true) + { + return $this->expandirArray($this->datos, 0, $filtrarActivos); + } + + function expandirString($dat, $n, $filtrarActivos) + { + $str = ''; + $tot = count($dat); + for ($i = 0; $i < $tot; $i++) { + $e = $dat[$i]; + // Si no tiene ID o esta activo y se filtran los activos, se + // continua con el proximo item. + if (!@$e['id'] or $filtrarActivos and @$e['activo']) { + continue; + } + $indent = str_repeat('| ', $n); + if ($i == ($tot - 1)) { + $indent .= '`- '; + } else { + $indent .= '|- '; + } + $str .= $indent . $e['titulo'] . "\n"; + if(@$e['sub']) { + $str .= $this->expandirString($e['sub'], $n + 1, $filtrarActivos); + } + } + return $str; + } + + function toString($filtrarActivos = true) + { + return $this->expandirString($this->datos, 0, $filtrarActivos); } + + /** + * Activa un nodo del árbol. + * + * @param int $id Id del nodo a modificar. + * @param bool $activo Nuevo valor, true si está activo, false si no. + * + * @return bool True si se pudo modificar. + */ + function setActivo($id, $activo = 1) { + return $this->modificarNodo($this->datos, $id, 'activo', $activo); + } + + /** + * Modifica un nodo del array. + * + * @param array $datos Datos del árbol a modificar. + * @param int $id Id del elemento a modificar. + * @param string $key Clave del dato a modificar. + * @param mixed $val Nuevo valor. + * + * @return bool True si se pudo modificar. + */ + function modificarNodo(&$datos, $id, $key, $val) { + foreach (array_keys($datos) as $k) { + if (@$datos[$k]['id'] == $id) { + $datos[$k][$key] = $val; + return true; + } elseif (@$datos[$k]['sub'] + and $this->modificarNodo($datos[$k]['sub'], $id, $key, $val)) { + return true; + } + } + return false; + } + }; ?>