Hoe maak je een dynamisch menu in PHP?

Posted at December 01, 2011

Ik heb al een aantal keer de vraag gekregen hoe je makkelijk met PHP een menu kan maken met waarbij een item de klasse ‘current’ oid. heeft.

Je kan dit oplossen door ifjes in elkaar te nesten, dit wordt echter een te groot drama als je ook met subnavigatie gaat werken. Daarnaast wil je code (voor bijv. hoe een link eruit ziet) eigenlijk maar op 1 plek hebben.

Hier zijn twee functies uit mijn visitekaartjes generator die dit iets slimmer voor elkaar krijgen. (het voorbeeld hieronder is iets simpeler omdat je in het kader van het probleem geen Classes nodig hebt, dat maakt alles alleen maar ingewikkelder).

function createMenu($menu, $current) {
    //if current is empty (homepage), set it to home
    $current = (empty($current)) ? 'home' : $current;
    //start UL
    $html = "<ul>n";
    //for each item in menu create a link
    foreach ($menu as $value) {
        if ($value['name'] == $current) {
            $html .= '<li>' . $value['name'] . "</li>n";
        } else {
            $html .= '<li><a href="' . $value['url'] . '">' . $value['name'] . "</a></li>n";
        }
    }
    //end UL
    $html .= "</ul>n";
    //return the menu
    return $html;
}

De getMenu functie bevat nu het hele menu in de code (aka hardcoded), Het zou beter zijn om ze uit een database te halen en ze in een array aan de createMenu functie te voeren(die niks weet over het menu zelf, behalve dat home de homepagina is).

Belangrijk is wel dat alle urls niet relatief zijn (of relatief aan de root), oftewel hij moet beginnen met http://website of /. Als je dit niet doet kunnen je links anders zijn op basis van waar je je in je app bevindt (dat wil je niet).

Op deze manier kan je de functie gebruiken:

//deze set je normaal dynamisch, afhankelijk van op welke pagina de gebruiker zit.
$current = ";
$menu = getMenu();
echo createMenu($menu,$current);

De output is afhankelijk van de pagina waar de gebruiker op dat moment is, iets in deze trand:


Posted at December 01, 2011, under PHP.