Leandro Lucarella ------------------------------------------------------------------------------- $Id$ -----------------------------------------------------------------------------*/ require_once 'HTML/Table.php'; require_once 'MECON/HTML/Image.php'; /** * DESC * * @access public */ class MECON_HTML_Arbol extends HTML_Table { /** * DESC * * @var TIPO $datos * @access public */ var $datos; /** * DESC * * @var TIPO $titulo * @access public */ var $titulo; /** * DESC * * @var string $link_append * @access public */ var $link_append; /** * Constructor. * * @param array $datos Datos con los cuales construir el árbol. * @param string $titulo Título. * @param string $link_append DESC. * * @return void * @access public */ function MECON_HTML_Arbol($datos, $titulo, $link_append = '') { 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; } /** * Devuelve el path del stylesheet de esta clase * * @retur string * @access public */ function getCSS() { return '/MECON/css/arbol'; } /** * DESC * * @param TIPO $dat DESC * @param TIPO $n DESC * @param TIPO &$tabla DESC * * @return TIPO * @access public */ 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 MECON_HTML_Image('/MECON/images/blanco.gif', str_repeat('  ', $n), $atr); $margen = $margen->toHtml(); } $imagen = ''; if (@$bullets[$n]) { $imagen = new MECON_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); } } } /** * Devuelve el html a imprimir * * @return string * @access public */ function 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())); return parent::toHTML(); } /** * DESC * * @param TIPO $dat DESC * @param TIPO $n DESC * @param TIPO $filtarActivos DESC * * @return array * @access public */ 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; } /** * DESC * * @param bool $filtrarActivos DESC * * @return array * @access public */ function toArray($filtrarActivos = true) { return $this->expandirArray($this->datos, 0, $filtrarActivos); } /** * DESC * * @param TIPO $dat DESC * @param TIPO $n DESC * @param TIPO $filtarActivos DESC * * @return string * @access public */ 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; } /** * DESC * * @param bool $filtrarActivos DESC * * @return string * @access public */ 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. * @access public */ 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. * @access public */ 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; } }; ?>