2010-08-04 22 views
0

Je trouve vraiment l'idée d'utiliser une fonction de récursivité pour construire les menus de mon site mais j'ai un problème et je me bats la tête depuis longtemps . J'ai besoin de ma fonction de menu pour retourner une liste imbriquée mais je ne veux pas que les éléments irrelevent non-actifs de l'arbre soient affichés.Fonction récursive PHP, pour créer une navigation de site comme liste imbriquée, mais sans éléments de menu inutiles

Détails. J'ai une base de données MySql avec une table appelée menu_items qui stocke tous les champs habituels pour un élément nav (target, link_text, title, etc) ainsi qu'un identifiant unique pour chaque élément et, surtout, un parent_id.

Tout cela est à débattre, par exemple, serait-il plus facile de stocker ces informations dans un fichier XML?

Par exemple est ici un exemple de menu avec tous les éléments montré:

<ul> 
    <li><a href="1.html">link 1</a> 
     <ul> 
      <li><a href="1-1.html">link 1-1</a> 
      <li><a href="1-2.html">link 1-2</a> 
     </ul> 
    </li> 
    <li><a href="2.html">link 2</a> 
     <ul> 
      <li><a href="2-1.html">link 2-1</a> 
      <li><a href="2-2.html">link 2-2</a> 
     </ul> 
    </li> 
    <li><a href="3.html">link 3</a></li> 
</ul> 

Mais si la page en cours est par exemple 1-2.html je veux avoir un menu comme celui-ci:

<ul> 
    <li><a href="1.html">link 1</a> 
     <ul> 
      <li><a href="1-1.html">link 1-1</a> 
      <li><a href="1-2.html">link 1-2</a> 
     </ul> 
    </li> 
    <li><a href="2.html">link 2</a></li> 
    <li><a href="3.html">link 3</a></li> 
</ul> 

Évidemment, je transmettrais l'ID ou le nom de la page en cours à la fonction Menu.

Vous avez des idées? Je me suis cogné la tête contre un mur depuis un certain temps maintenant :-)

Répondre

0

Ceci est ma méthode complète où la base de données a un ID de page, un parent, un lien (permalink) et un titre; J'espère que cela aide.

function make_nav($current_page_id) 
{ 
    nav_rec(0, $current_page_id, constant('SITE_URL'), 0); 
} 

function nav_rec($page, $current_page_id, $link, $level) 
{ 
    if (!$page) 
    { 
     $page = array(); 
     $page['page_id'] = '0'; 
    } 
    else 
    { 
     ?><a class="nav-link nav-level-<?= $level ?>" href="<?= $link ?>"><?= $page['title'] ?></a><? 
    } 

    // Checks for the subpages from this page. 
    $page_q = " 
     SELECT id AS page_id, parent_id, permalink, page_title AS title 
     FROM ".constant('MYSQL_PREFIX')."pages 
     WHERE `page_type` = 'page' 
     AND `in_nav` = '1' 
     AND `status` = 'published' 
     AND `is_deleted` = '0' 
     AND `parent_id` = '".$page['page_id']."'"; 

    if ($page_rs = mysql_query($page_q)) 
    { 
     if (mysql_num_rows($page_rs)) 
     { 
      while($page = mysql_fetch_assoc($page_rs)) 
      { 
       nav_rec($page, $current_page_id, $link . $page['permalink'].'/', $level+1); 
      } 
     } 
     else 
     { 
      $level = 0; 
     } 
    } 
    else 
    { 
     $level = 0; 
    } 
} 
+0

Et je n'ai évidemment pas préparé votre question correctement. La mienne ne fait pas ça. J'utiliserais personnellement jQuery pour pouvoir ouvrir des liens de sous-pages pour le menu – Alex