Menü mittels Rekursion ( <ul><li> richtig setzen)

xtramen01

Erfahrenes Mitglied
Hallo Leute,

ich brauche mal wieder einen Ratschlag von einem Profi.
Ich sitze schon seit 2 Tagen an folgendem Problem.

Ich habe eine rekursive Funktion mit der ich eine funktionierende Navigation habe die mir unendlich viele Unterkategorien erlaubt.

Nun möchte ich mir eine Javascript navigation basteln mithilfe von superfish.

Dazu muss ich folgende Ausgabe erreichen:

HTML:
      <ul id="menu" class="sf-menu sf-vertical"> 

          <li><a href="#">Menu Item</a> 

              <ul> 

                  <li><a href="#">Submenu Item</a></li> 

                  <li><a href="#">Submenu Item</a></li> 

                  <li><a href="#">Submenu Item</a></li> 

              </ul> 

          </li> 

          <li><a href="#">Menu Item</a></li> 

          <li><a href="#">Menu Item</a></li> 

      </ul>

Leider verstehe ich nich ganz wie und unter welchen Bedingungen ich die <ul und <li> Tags setzen muss, damit ich es genau in diesem Stil hinbekomme.

Hier mal mein Ansatz. Doch es klappt nicht ganz wie es soll! :-(

Ich hoffe es kann mal jemand über den COde schauen und mir ein wenig Unterstützung bieten.

PHP:
function get_js_menue($parent_id = '0', $lcatID = NULL){
  
    global $languages_id;
    static $ebene = 0;
    
    $menu = NULL;
    $wert = NULL;
    
    isset($_GET['cPath']) ? $cid = $_GET['cPath'] : $cid = NULL;
    
    $cat_auswahl = explode(SEPERATOR,$cid);

    if (!empty($cid)){$cat_auswahl = explode(SEPERATOR,$cid);}

    $sql = tep_db_query("select c.categories_id, cd.categories_name, c.parent_id from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where c.parent_id = '".$parent_id."' and c.categories_id = cd.categories_id and cd.language_id='" . (int)$languages_id ."' order by sort_order, cd.categories_name");
    $menge = tep_db_num_rows($sql);

    for ($lo=0;$lo<$menge;$lo++)
    {
         $row = tep_db_fetch_array($sql);

         if ($ebene > 1)
         {
            $menu .= '<ul>';
         }

             $_href = tep_href_link(FILENAME_DEFAULT, 'cPath='.$lcatID.$row['categories_id']);
             
        
         
             $menu .= '<li><a href="#"><b>'.$row['categories_name'].'</b></a></li>';
        
        if ($ebene + 1)
         {
            $menu .= '</ul>';
         }

             $catid = $row['categories_id'];
             $ebene++;
             $menu .=  get_js_menue($catid,$lcatID."$catid".SEPERATOR);
             $ebene--;
        

    }

    
    return $menu;
    
}

Gruss und Danke
 
Da es sich hier um eine Auflistung handelt und die Datensätze deine Listenelemente sind, muss die Liste vorher geöffnet und erst nachher geschlossen werden. Also:
PHP:
if ($menge) {
    $menu .= '<ul>';
    for ($lo=0; $lo<$menge; $lo++) {
        $menu .= '<li>';
        // Rekursion
        $menu .= '</li>';
    }
    $menu .= '</ul>';
}
Und für die Rekursion muss erst die Beschriftung und dann die Liste folgen:
PHP:
$menu .= '<a href="#"><b>'.$row['categories_name'].'</b></a>';
$menu .=  get_js_menue($catid,$lcatID."$catid".SEPERATOR);
 
Moin,

vielleicht erspart dir dies viel Fummelei:
http://www.tutorials.de/forum/php/350023-menue-ul-mit-untermenues-funktion.html#post1814308

denn...
es bietet sich an, das über ein XML-Dokument zu machen.
Die Liste für sich, wie du sie am Ende haben willst, wäre ja ein gültiges DOMDocument.

Der Vorteil vom DOM: du kannst die Elemente über Methoden wie appendChild() oder insertBefore() einfach an ihrer Zielposition einfügen, ohne dich um das Markup kümmern zu Müssen(ohne das DOM wäre das eine elende Zählerei von geöffneten <li>'s und <ul>'s.....die du ja irgendwo wieder Schliessen musst).
 
Hi ihr beiden Spezis :-)

Ihr habt mir sehr geholfen.

@Gumbo: Jetzt ist mir das sooo klar auf einmal...logisch! Bin schon zu lange drann vielleicht.

@Sven: Das werd ich mir auf jedenfall mal näher anschauen.


Danke und gruss
 
Zurück