Foros del Web » Programando para Internet » PHP »

Crear un menu dinamico de 3 niveles

Estas en el tema de Crear un menu dinamico de 3 niveles en el foro de PHP en Foros del Web. Saludos Veran, tengo que generar un array, que imite la siguiente estructura html: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código HTML: Ver original < div class = "menu-header" > ...
  #1 (permalink)  
Antiguo 12/02/2012, 11:37
50l3r
Invitado
 
Mensajes: n/a
Puntos:
Crear un menu dinamico de 3 niveles

Saludos

Veran, tengo que generar un array, que imite la siguiente estructura html:

Código HTML:
Ver original
  1. <div class="menu-header">
  2.             <ul class="topmenu">
  3.                 <li class="parent first current-menu-item"><a href="#"><span>Sliders</span></a>
  4.                     <ul class="sub-menu">
  5.                         <li class="first"><a href="index.html"><span>Main slider</span></a></li>
  6.                         <li><a href="index-slider-images.html"><span>Nivo slider</span></a></li>
  7.                         <li><a href="index-slider-text.html"><span>Text / Video slider</span></a></li>                        
  8.                     </ul>
  9.                 </li>
  10.                 <li class="parent"><a href="#"><span>Pages</span></a>
  11.                     <ul class="sub-menu">
  12.                         <li class="first"><a href="page-sidebar-r.html"><span>Pages with Sidebar</span></a></li>
  13.                         <li class="parent"><a href="#"><span>Portfolio pages</span></a>
  14.                             <ul class="sub-menu">
  15.                                 <li class="first"><a href="portfolio.html"><span>1 column with Sidebar</span></a></li>
  16.                                 <li><a href="portfolio-2cols.html"><span>2 columns with Sidebar</span></a></li>
  17.                                 <li><a href="portfolio-3cols.html"><span>3 columns Full Width</span></a></li>
  18.                                 <li class="last"><a href="portfolio-4cols.html"><span>4 columns Full Width</span></a></li>
  19.                              </ul>
  20.                         </li>
  21.                         <li class="last"><a href="page-pricing.html"><span>Pricing page</span></a></li>
  22.                     </ul>
  23.               </li>
  24.               <li class="last"><a href="contacts.html"><span>Contact</span></a></li>
  25.           </ul>
  26.         </div>

Para ello me he creado este array:

Código PHP:
$config['menu'] = array(
    
=> array(
        
'ItemText' => 'Sliders',
        
'ItemLink' => 'sliders',
        
'ParentID' => null,
    ),

    
=> array(
        
'ItemText' => 'Pages',
        
'ItemLink' => 'pages',
        
'ParentID' => null,
    ),
    
    
=> array(
        
'ItemText' => 'Pages with Sidebar',
        
'ItemLink' => 'sidebar',
        
'ParentID' => 2,
    ),
    
    
=> array(
        
'ItemText' => 'Portfolio Pages',
        
'ItemLink' => 'sidebar',
        
'ParentID' => 2,
    ),
    
    
=> array(
        
'ItemText' => '1 Column with SIdebar',
        
'ItemLink' => 'gamerack',
        
'ParentID' => 4,
    ),
    
    
=> array(
        
'ItemText' => 'Contact',
        
'ItemLink' => 'contacto',
        
'ParentID' => null,
    ),
); 
No esta completo, pero tiene una estructura buena para visualizar todo.


Lo que necesito, es poder emular con los datos que brindo en el array, la estructura anterior. Para ello he creado este proceso:

Código PHP:
foreach ($menu as &$menuItem){$menuItem['Children'] = array();} //Asignamos hijos vacios
                                
                                
$contachild=0;
                                foreach (
$menu as $ID => &$menuItem){ //Añadimos los hijos a los padres
                                    
if ($menuItem['ParentID'] != null){
                                        
                                        
$menu[$menuItem['ParentID']]['Children'][$contachild] = &$menuItem;$contachild++;
                                    }
                                }

                                foreach (
array_keys($menu) as $ID){ //Eliminamos los hijos
                                    
if ($menu[$ID]['ParentID'] != null){unset($menu[$ID]);}
                                }
                                
                                
$contamenu 0;
                                foreach (
$menu as $Itemmenu){
                                    
$contamenu++; $class "";
                                    if(
$contamenu==1){$class="first";}
                                    if(
count($Itemmenu['Children'])>0){$class+=" parent";}
                                        echo 
"<li class='".$class."'>";
                                        echo 
"<a href='".base_url($Itemmenu['ItemLink'])."'><span>".strip_tags($Itemmenu['ItemText'])."</span></a>";
                                        
                                        if(
count($Itemmenu['Children'])>0){
                                            
$contasubmenu 0;
                                            for(
$i=0;$i<count($Itemmenu['Children']);$i++){
                                                
$contasubmenu++;$subclass="";
                                                if(
$contasubmenu==1){echo "<ul class='sub-menu'>";$subclass="first";}
                                                echo 
"<li class='".$subclass."'>";
                                                echo 
"<a href='".base_url($Itemmenu['Children'][$i]['ItemLink'])."'><span>".strip_tags($Itemmenu['Children'][$i]['ItemText'])."</span></a>";
                                                
//echo var_dump($Itemmenu['Children']);
                                                
echo "</li>";
                                            }
                                            if(
$contasubmenu>0){echo "</ul>";}
                                        }
                                        echo 
"</li>";
                                } 
He realizado algo mal, creo que al asignar los hijos solo asigna los del segundo nivel.

Alguien me puede hechar una mano?
  #2 (permalink)  
Antiguo 13/02/2012, 01:58
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: Crear un menu dinamico de 3 niveles

Efectivamente, no asignas más de un nivel de profundidad porque lo haces con un foreach, solo tienes la posibilidad de hacer una pasada sobre el array. De esta manera, por cada nivel de profundidad del menú tienes que hacer un foreach. La solución es una función recursiva, te paso un ejemplo con BD, pero que puedes adaptar facilmente, saludos: http://barcoavenus.blog.com/category/php/
__________________
Fere libenter homines, id quod volunt, credunt.

Etiquetas: dinamico, html, niveles
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:23.