2010-03-24 15 views
0

J'ai besoin de créer un menu arborescent de sous-catégories "nième". Je me suis contenté d'utiliser le modèle de liste d'adjacence pour ma structure de table, parce que je ne mettrais pas beaucoup à jour cette table et cela semblait la plus facile à mettre en œuvre pour mon utilisation. Je veux styliser la sortie en utilisant les balises "ul" et "li" ... J'ai déjà une solution css et jquery pour faire le style. Mon problème vient d'extraire les données de la base de données et d'utiliser une fonction récursive via PHP pour construire la liste ... la liste est une chaîne concaténée qui est analysée pour construire l'arbre. J'ai vraiment du mal à faire en sorte que les étiquettes de fermeture «ul» et «li» soient alignées là où elles doivent être.Créer un menu arborescent non ordonné à partir de données stockées dans une table avec le modèle de liste d'adjacence ... php

Est-ce la meilleure façon de procéder? Existe-t-il d'autres façons d'utiliser des tableaux ou quelque chose comme ça pour le faire? Tous les exemples que vous pouvez me montrer des «meilleures pratiques» pour construire une liste comme celle-ci seront appréciés. Merci.

Voilà ma structure de table:

portfolio_id (int), p_name (varchar), parent_portfolio_id (int) Voici ce que je veux que les données à ressembler lorsqu'ils sont présentés:

<ul> 
<li>Portfolio Name 
    <ul> 
     <li>Sub portfolio A 
      <ul> 
       <li>Sub portfolio A - 1</li> 
       <li>Sub portfolio A - 2</li> 
       <li>Sub portfolio A - 3</li> 
      </ul> 
     </li> 
     <li>Sub portfolio B</li> 
     <li>Sub portfolio C</li> 
    </ul> 
</li> 
</ul> 

est ici le courant fonction récursive:

function portf($ndb, $portfolio_id, $space=1, $x="", $level=1) // cat id, space to add "_" degree of categoreis times, list of categories 
{ 
    $sql = "SELECT portfolio_id, p_name, parent_portfolio_id FROM portfolio WHERE parent_portfolio_id = $portfolio_id ORDER BY p_name ASC;"; 
    $select = $ndb->get_results($sql, 0, ARRAY_A); 
    if(!is_null($select)) 
    { 
     foreach($select as $data) 
     { 
      $x = $x . $data->portfolio_id . '_' . $data->parent_portfolio_id . '_' . $level . str_repeat('_', $space) . $data->p_name . '-'; 
      $x = $this->portf($ndb, $data->portfolio_id, ($space+1), $x, ($level+1)); 
     } 
     return $x; 
    } 
    else 
    { 
     return $x; 
    } 
} 
+0

Il serait utile que vous montriez un code ... – GrumpyCanuck

+0

ajouté quelques exemples de code ... Thanx – Ronedog

Répondre

1

Je dois admettre que, vous me un peu perdu sur une partie de votre code là. Quoi de neuf avec tous les espaces $ et le str_repeat?

En tout cas, c'est ce que j'essayerais.

function portf($ndb, $portfolio_id, $level=1) 
{ 
    $sql = "SELECT portfolio_id, p_name, parent_portfolio_id FROM portfolio WHERE parent_portfolio_id = $portfolio_id ORDER BY p_name ASC;"; 
    $select = $ndb->get_results($sql, 0, ARRAY_A); 

    if(!is_null($select)) 
    { 
     $li = ""; 
     foreach($select as $data) 
     { 
      $sublist = portf($ndb, $data->portfolio_id, $level+1); 
      $li .= "<li>{$data->p_name}{$sublist}</li>"; 
     } 
     $ul = "<ul class=\"level_$level\">$li</ul>"; 
     return $ul; 
    } 
    else 
    { 
     return ""; 
    } 
} 
+0

Merci pour l'aide ... Je me suis confus. J'ai obtenu ce code de googling et c'était un autre moyen d'extraire les données. Cela a fonctionné, mais pas pour un menu qui avait plusieurs relations de sous-catégorie et cela devenait vraiment confus. Quoi qu'il en soit, j'ai posté du code supplémentaire pour vous montrer ce que votre suggestion produit ... c'est presque exactement ce dont j'ai besoin ... voir le post. Si vous avez d'autres conseils, je serais heureux de les essayer. Merci encore. – Ronedog

+0

Je pense que j'ai peut-être fait une erreur très simple dans la logique - Dans la boucle de foreach je remplaçais le li à chaque fois. J'ai modifié la fonction pour concaténer au lieu de remplacer. –

+0

C'est parfait! Juste un changement mineur pour n'importe qui qui vient ... où vous avez le $ ul = "", je pense que vous vouliez dire "

    sans la barre oblique.En tout cas, je vous remercie de m'avoir aidé. me rendre fou et votre solution a fait ce que je voulais et vous a probablement pris quelques minutes à venir avec! Merci encore. – Ronedog