Menü (ul) mit Untermenüs - Funktion

dwex

Erfahrenes Mitglied
Hallo Leute,

ich möchte eine Funktion schreiben welche mir ein Menü "bastelt" welches auf Listen mit Unterlisten etc. basiert.

Ich habe eine Datenbank mit page-id, parent, link und noch ein paar mehr.

Momentan habe ich keine Ahnung wie ich das mit der Verschachtelung machen soll. Für die erste ebene bringe ich es ja noch zusammen aber dann haperts schon.

Kann mir mal jemand auf die Sprünge helfen wie ich das mit der Verschachtelung lösen könnte sodass wenn eine Seite ausgewählt wurde welches Kind-Elemente hat - diese auch mit angezeigt werden und das natürlich in beliebiger Tiefe.

Ich hoffe Ihr versteht was ich meine.
Vielen Dank für eure Hilfe im voraus!
 
Moin,

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).
 
Hier mal ein Beispiel für soetwas:
(anhand eines assoz. Arrays)
Code:
<?php
 
 
 $data=array(
  array('id'=>8,'pid'=>2,'caption'=>'title8','href'=>'href8'),
  array('id'=>4,'pid'=>2,'caption'=>'title4','href'=>'href4'),
  array('id'=>5,'pid'=>3,'caption'=>'title5','href'=>'href5'),
  array('id'=>1,'pid'=>0,'caption'=>'title1','href'=>'href1'),
  array('id'=>2,'pid'=>0,'caption'=>'title2','href'=>'href2'),
  array('id'=>3,'pid'=>0,'caption'=>'title3','href'=>'href3'),
  array('id'=>6,'pid'=>4,'caption'=>'title6','href'=>'href6'),
  array('id'=>7,'pid'=>2,'caption'=>'title7','href'=>'href7')
 );


 class joshua
 {
    function __construct( $data,
                          $idPrefix   = 'entry',
                          $pidPrefix  = 'parent',
                          $root       = 0,
                          $keys       = array(
                                              'id'      =>'id',
                                              'pid'     =>'pid',
                                              'href'    =>'href',
                                              'caption' =>'caption'
                                     )
                          )
    {
      $this->vars=get_defined_vars();
      
    }
    
    //Hilfsfunktion für getElementById in nicht validierten Dokumenten
    function getElementById($doc,$id)
    {
      
      $xpath  = new DOMXPath($doc);
      $res    = $xpath->evaluate('//*[@id="'.$id.'"]');
      return(
              ($res->length)
                ? $res->item(0)
                : NULL
            );
    }
    
    function makeList()
    {
      $list = new DOMDocument();
      $list->loadXML('<ul id="'.$this->vars['pidPrefix']
                               .$this->vars['root'].'"></ul>');
 
      foreach($this->vars['data'] as $item)
      {
        
        $parent = $this->getElementById($list,
                                        $this->vars['pidPrefix']
                                        .$item[$this->vars['keys']['pid']]);
        
        if(!$parent)
        {
          $parent = $this->getElementById($list,
                                          $this->vars['idPrefix']
                                          .$item[$this->vars['keys']['pid']]);
                                          
          $parent =($parent)
                    ? $parent
                    : $list;
          $parent = $parent->appendChild($list->createElement('ul'));
          $parent->setAttribute('id',
                                $this->vars['pidPrefix']
                                .$item[$this->vars['keys']['pid']]);
        }
        
        
        $entry  = $list->createElement('li');
        $entry  ->  setAttribute('id',
                                 $this->vars['idPrefix']
                                 .$item[$this->vars['keys']['id']]);
        $link = $entry->appendChild($list->createElement('a'));
        $link -> setAttribute('href',$item[$this->vars['keys']['href']]);
        $link -> appendChild($list->createTextNode($item[$this->vars['keys']['caption']]));
        $parent -> appendChild($entry);
        
        if($childs = $this->getElementById($list,
                                           $this->vars['pidPrefix']
                                           .$item[$this->vars['keys']['id']])
          )
          {
            $entry->appendChild($childs);
          }
        }
      
      return $list;
      }
     
     function printHTML()
     {
        echo $this->makeList()->saveHTML();
     }
}


 $list=new joshua($data);
 $list->printHTML();
 
 
?>
 
Servus Sven,

vielen dank für den Code - das ist schon fast das was ich brauche. Eigentlich brauche ich die Untermenüs nur dann wenn eine Seite geöffnet ist, welche auch Untermenüs hat. Ich muss mir den von dir geschriebenen Code mal genauer ansehen um ihn zu verstehen und vielleicht schaffe ich es dann auch den Umzuschreiben.

Ich werde mich jetzt mal an der CSS-Formatierung des selbigen versuchen - vielleicht lasse ich das ganze dann auch so.

Vielen Dank vorerst nochmals!
 
Ok, Untermenues nur bei der aktuellen Datei...und was ist aufsteigend mit der Baumstruktur? Was soll dort gezeigt werden?
Nur Elternknoten der ausgewählten Datei?
 
Zurück