2009-10-06 7 views
0

J'ai besoin de créer un menu avec PHP à partir d'une base de données MySQL.Comment créer un menu imbriqué à partir de MySQL avec PHP?

table appelée catégories a id, nom, id_parent, shortdesc, etc.

La sortie doit avoir la liste des parents et la liste des enfants de la liste comme suit partent.

Si vous pouvez me montrer les codes ou l'emplacement, je vous remercie.

<ul id="catmenu"> 
    <li class="menulist">Cars 
     <ul> 
      <li>Ford</li> 
      <li>Honda</li> 
      <li>Toyota</li> 
     </ul> 
    </li> 
    <li class="menulist">Food 
     <ul> 
      <li>Pasta</li> 
      <li>Pizza</li> 
      ... 
     </ul> 
    </li> 
... 
... 
</ul> 
+2

La liste est-elle à 2 niveaux de profondeur seulement ou peut-elle être N niveaux de profondeur? –

Répondre

1

Ceci est spécifiquement pour deux niveaux de profondeur. L'approche recommandée devrait-elle être plus d'utiliser une structure de table optimisée pour la traversée, comme http://articles.sitepoint.com/article/hierarchical-data-database/2 (indiqué ailleurs) ou de tirer les données dont vous avez besoin et le pousser dans un dictionnaire (tableau associatif) et l'interroger de cette façon.

<?php 
    $query = <<<EOT 
     SELECT 
      parent.name as parent_name, 
      child.name as child_name, 
     FROM 
      items child 
     INNER JOIN 
      items parent 
     ON 
      child.parent_id = parent.id 
     ORDER BY 
      parent.name 
EOT; 

    $result = mysql_query($query) or die('Failure!'); 

    echo "<ul id=\"catmenu\">"; 

    $last_parent = ''; 
    while($row = mysql_fetch_array($result)){ 
     // If this is a new category, start a new one 
     if($last_parent != $row['parent_name']){ 
      // Unless this is the first item, close the last category 
      if($last_parent != ''){ 
       echo "</ul></li>"; 
      } 
      $last_parent = $row['parent_name']; 
      echo "<li class=\"menulist\">{$row['parent_name']}<ul>"; 
     } 
     echo "<li>{$row['child_name']}</li>"; 
    } 

    // If we actually had items, close the "category" 
    if($last_parent != ''){ 
     echo "</ul></li>"; 
    } 

    echo "</ul>"; 

?> 
1

Si vous avez seulement deux niveaux alors, vous pouvez simplement les afficher:

echo '<ul id="catmenu">'; 
foreach($menu as $element) { 


    echo '<li><ul class="menulist">'; 
    foreach($element['submenu'] as $submenu) { 

     echo '<li>' . $submenu['name'] . '</li>'; 
    } 
    echo '</ul></li>'; 
} 
echo '</ul> 

Si vous avez un nombre indéfini de sous-menus mais vous devez utiliser un Recursive Function.

function menu($item) { 
    $ret = '<li>' . $item['name']; 

    if (!empty($item['submenu'])) { 
     foreach($item['submenu'] as $submenu) { 
      $ret .= menu($submenu); 
     } 
    } 
    return $ret; 
} 
echo menu($menu); 

Ainsi, toutes vos sous-catégories, quel que soit leur numéro, seront affichées.

1

Vous créez une base de données comme celle-ci.

ID NAME  PARENT 
0  Cars  -1 
1  Foods -1 
2  Ford  0 
3  Honda  0 
4  Toyota 0 
5  Pasta  1 
6  Pizza  1 
... 

Vous les interrogez tous et vous les placez dans un tableau. Ensuite, vous bouclez tout le menu à la recherche de PARENT == -1 Générer tous UL et IL puis sous-il avec un autre menu imbriqué. Vous pouvez simplement créer une fonction comme celle-ci.

var $MenuLevelClass = array("menulist"); 
  
function CreateMenu($Menus, $Tab = 0, $Parent = -1, $Level = 0) { 
    global $MenuLevelClass; 
      
    $CatClass = ($Level != 0) ? '' : ' class="catmenu"'; 
    $MenuClass = $MenuLevelClass[$Level]; 
    if ($MenuClass != '') 
     $MenuClass = ' class="'.$MenuClass.'"'; 
      
    $TabCount = $Level + $Tab; 
    $TabUL = ""; 
    for ($t = 0; $t < $TabCount; $t++) 
     $TabUL = $TabUL."\t"; 
    $TabLI = $TabUL."\t"; 
      
?> 
<?=$TabUL?><ul<?=$CatClass?>> 
<?php 
      
    $MenuCount = count($Menus); 
    for ($m = 0; $m < $MenuCount; $m++) { 
     $Menu = $Menu[$m]; 
     $ID = $Menu['ID']; 
     if ($ID != $Parent) 
      continue; 
      
?> 
<?=$TabLI?><li<?=$MenuClass?>><?=$Menu['Name']?><?=CreateMenu($Menus, $Tab + 1, $ID, $Level + 1)?></li> 
<?php 
      
?> 
<?=$TabUL?></ul> 
<?php 
      
    } 
} 

Et pour l'utiliser il suffit d'exécuter 'CreateMenu($Menus);' ou 'CreateMenu($Menus, $PrefixTabCount);'. CreateMenu crée récursivement le menu imbriqué pour vous.

Je ne l'ai pas testé, vous devrez peut-être l'ajuster.

Espérons que cela aide.

Questions connexes