Ver Mensaje Individual
  #2 (permalink)  
Antiguo 23/02/2012, 14:58
Avatar de portalmana
portalmana
 
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 16 años, 7 meses
Puntos: 80
Respuesta: Estructura de arbol

Yo tengo algo parecido a lo que necesitas aqui el código...
Es parte de una clase... con algunos cambios y quizás te funcione...

Código PHP:
Ver original
  1. public function generarMenu()
  2.     {   // Inicio Carga de Categorias
  3.         $config         = Config::singleton();
  4.         $tabla          = $config->get('tabla');
  5.         $campoId        = $config->get('campoId');
  6.         $categoria      = $config->get('categoria');
  7.         $relacion       = $config->get('relacion');
  8.         $padre          = 0;
  9.         $prefijo        = '-';
  10.         $this->arbolJerarquico($tabla,$campoId,$categoria,$relacion,$padre,$prefijo);
  11.         $nivelAnterior  = 0;
  12.         // INTERACTIVIDAD DEL MENU //
  13.         $menuHTML       = '<div id="treecontrol">'."\n";
  14.         $menuHTML       .='<a title="Collapsar Menu" href="#">Colapsar</a> |' . "\n";
  15.         $menuHTML       .='<a title="Expandir Menu" href="#"> Expandir</a> |' . "\n";
  16.         $menuHTML       .='<a title="Alternar Menu" href="#"> Alternar</a>' . "\n";
  17.         $menuHTML       .='</div>' . "\n";
  18.         $menuHTML       .="\n\n<ul id='gray' class='treeview-gray'>\n";
  19.        
  20.         foreach($this->categorias as $valor)
  21.         {   $nivel      = $this->calcularNivel($valor['prefijo'],$prefijo);
  22.             switch($valor['padre'])
  23.             {   case 'Si':
  24.                     if($nivel==$nivelAnterior )
  25.                     {   $menuHTML   .='<li class="closed"><a href="index.php?mdl=catalogo&amp;ctr=Ver&amp;acc=categoria&amp;id=' . $valor['id'] . '" >' . $valor['categoria'] . "</a>\n";   }
  26.                     elseif($nivel>$nivelAnterior)
  27.                     {   $menuHTML   .='<ul><li class="closed"><a href="index.php?mdl=catalogo&amp;ctr=Ver&amp;acc=categoria&amp;id=' . $valor['id'] . '" >' . $valor['categoria'] . "</a>\n";   }
  28.                     else
  29.                     {   $menuHTML   .='</ul></li><li class="closed"><a href="index.php?mdl=catalogo&amp;ctr=Ver&amp;acc=categoria&amp;id=' . $valor['id'] . '">' . $valor['categoria'] . "</a>\n";  }
  30.                     break;
  31.                 case 'No':
  32.                     if($nivel==$nivelAnterior) 
  33.                     {   $menuHTML   .='<li><a href="index.php?mdl=catalogo&amp;ctr=Ver&amp;acc=categoria&amp;id=' . $valor['id'] . '">' . $valor['categoria'] . '</a></li>' . "\n"; }
  34.                     elseif($nivel<$nivelAnterior)
  35.                     {   $cierroUl   = str_repeat('</ul></li>',$nivelAnterior-$nivel);
  36.                         $menuHTML   .=$cierroUl.'<li><a href="index.php?mdl=catalogo&amp;ctr=Ver&amp;acc=categoria&amp;id=' . $valor['id'] . '" >' . $valor['categoria'] . '</a></li>' . "\n";  }
  37.                     else
  38.                     {   $menuHTML   .='<ul><li><a href="index.php?mdl=catalogo&amp;ctr=Ver&amp;acc=categoria&amp;id=' . $valor['id'] . '">' . $valor['categoria'] . '</a></li>' . "\n"; }              
  39.                     break;
  40.             }
  41.             $nivelAnterior  = $nivel;
  42.         }
  43.         $menuHTML       .="</ul>\n\n";
  44.         $fp = fopen('../opet/menu/menuPublico.html' ,"w+");
  45.         fputs($fp,$menuHTML);
  46.         fclose($fp);
  47.         echo $menuHTML;
  48.     }
  49.  
  50.  
  51.     public function arbolJerarquico($tabla,$campoId,$categoria,$relacion,$padre,$prefijo='-')
  52.     {   $objCategorias  = new CategoriasModelo();
  53.         $categorias     = $objCategorias->generarArbolCategorias($tabla,$relacion,$padre);
  54.         if($categorias)
  55.         {   $filas      = $categorias->fetch_object();
  56.             while($filas)
  57.             {   $this->categorias[]['id']               = $filas->$campoId;
  58.                 $cnt    = count($this->categorias)-1;
  59.                 $this->categorias[$cnt]['prefijo']      = $prefijo;
  60.                 $this->categorias[$cnt]['categoria']    = $filas->$categoria;
  61.                 $this->categorias[$cnt]['padre']        = $filas->padre;
  62.                 $this->arbolJerarquico($tabla,$campoId,$categoria,$relacion,$filas->$campoId, $prefijo . $prefijo);
  63.                 $filas      = $categorias->fetch_object();
  64.             }
  65.         }
  66.     }

Esta es mi tabla MySQL
Código SQL:
Ver original
  1. CREATE TABLE `categorias` (
  2.     `idCategoria` SMALLINT(5) UNSIGNED NOT NULL AUTO_INCREMENT,
  3.     `nombreCategoria` VARCHAR(60) NOT NULL,
  4.     `idCategoriaPadre` SMALLINT(6) NULL DEFAULT '0' COMMENT 'Nos refleja si es hijo de una categoria o es padre(0).',
  5.     `imagenCategoria` VARCHAR(150) NULL DEFAULT NULL,
  6.     `padre` SET('No','Si') NOT NULL DEFAULT 'No',
  7.     `descripcionCategoria` VARCHAR(1000) NULL DEFAULT NULL,
  8.     PRIMARY KEY (`idCategoria`)
  9. )
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp

Última edición por portalmana; 23/02/2012 a las 15:07