Blaubart: Array in Array und Submenu mit "unendlicher" verschachtelung

Beitrag lesen

Tach.

Nested sets habe ich auch schon Probiert umzusetzen, zweimal, Erfolglos. Da blick ich irgendwie überhaupt nicht durch.

Zumal ich nicht mal weiß, ob Nested Sets das machen, was ich möchte, also die Menupunkte nur aufklappen, wenn benötigt.

Den HTML-Code erzeugen Dir Nested Sets natürlich nicht. Aber Du kannst die Datenbank schon so abfragen, daß Du nur die Navigationseinträge bekommst, die Du tatsächlich anzeigen willst. Vielleicht schaust Du's Dir doch nochmal an. ;)

Wenn die Seitenstruktur letztendlich eh komplett in der Datenbank stehen soll, ist es etwas umständlich, aus den abgefragten Daten (und das sind immer *alle* Navigationseinträge) Deine verschachtelte Arraystruktur zu bauen und erst dann abzugrasen, was davon Du wirklich benötigst. Naja, wie auch immer ... Ich hab hier eine Funktion geschrieben, die aus einem solchen beliebig tief verschachtelten Array die Navigations erstellt. Der Pfad der aktuellen Seite kommt aus $_SERVER["REQUEST_URI"]. Das Teil ist an manchen Stellen noch verbesserungsbedürftig (u. a. kontextabhängiges Escapen!) und kann auch eleganter geschrieben werden, aber zur Veranschaulichung des Grundprinzips sollte es reichen.

  
<?php  
  
// Baumstruktur der Seite  
$navTree = array(  
    array(  
        "title"    => "Home",  
        "path"     => "",  
        "children" => array()  
    )  
    ,array(  
        "title"    => "Equipment",  
        "path"     => "equipment",  
        "children" => array(  
            array(  
                "title"    => "Einstellungen",  
                "path"     => "einstellungen",  
                "children" => array()  
            )  
            ,array(  
                "title"    => "Tips und Tricks",  
                "path"     => "insider-tips",  
                "children" => array(  
                    array(  
                        "title"    => "Noch mehr Zeug",  
                        "path"     => "zeug",  
                        "children" => array()  
                    )  
                )  
            )  
            ,array(  
                "title"    => "Tisch ausrichten",  
                "path"     => "tisch-ausrichten",  
                "children" => array()  
            )  
        )  
    )  
    ,array(  
        "title"    => "Beat Juggle",  
        "path"     => "beatjuggling",  
        "children" => array(  
        )  
    )  
);  
  
  
$requestURI = $_SERVER["REQUEST_URI"];  
  
// Slashes am Anfang und Ende des Pfades entfernen  
$matches = array();  
if (preg_match("~^/*(.*?)/*$~", $requestURI, $matches)) {  
    $requestURI = $matches[1];  
}  
  
// Pfad in einzelne Verzeichnisse aufspalten  
$requestParts = explode("/", $requestURI);  
  
//header("Content-Type: text/plain");  
//echo "Request-URI: $requestURI\n";  
//print_r($requestParts, true);  
  
echo getHTMLList($navTree, $requestParts);  
  
  
  
function getHTMLList ($navTree, $requestParts, $partIndex = 0) {  
    $sList = "";  
    $parentPath = implode("/", array_slice($requestParts, 0, $partIndex));  
    $maxPartIndex = sizeof($requestParts) - 1;  
  
    foreach ($navTree as $node) {  
        $sChildList = "";  
        if ($partIndex <= $maxPartIndex) {  
            // Falls der aktueller Knotenname im gegebenen Pfad enthalten ist,  
            // werden auch sein Kinder (eine Ebene tiefer) besucht.  
            if ($requestParts[$partIndex] == $node["path"]) {  
                if (!empty($node["children"])) {  
                    $sChildList = getHTMLList($node["children"], $requestParts, $partIndex+1);  
                }  
            }  
        }  
  
        // HTML-Liste aus aktuellem Knoten und dessen Kindern erzeugen.  
        // Der aktuelle Knoten (letzter Eintrag im Pfad) wird nicht verlinkt.  
        if (($partIndex == $maxPartIndex) && ($requestParts[$partIndex] == $node["path"])) {  
            $sList .= sprintf('<li>%s%s</li>',  
                    $node["title"], $sChildList);  
        } else {  
            $sList .= sprintf('<li><a href="/%s%s">%s</a>%s</li>',  
                    $parentPath . (($parentPath != "") ? "/" : ""),  
                    $node["path"],  
                    $node["title"],  
                    $sChildList);  
        }  
    }  
    return "<ul>$sList</ul>";  
}  
  
?>  

--
Once is a mistake, twice is Jazz.