Scripts

Dynamisch menu

Dit is een script voor een dynamisch menu. Je hebt bij dit menu maar 1 query nodig om alle menu items aan te maken. Heel gunstig dus voor de snelheid. Dit script is recursief (dus het roept zichzelf aan) dus de menu's zijn practisch oneindig. Het is een relatief simpele code, maar voor een beginnend PHP'er zal het misschien nuttig zijn. De output van het menu zal zijn:

menu.php
<?php

/**
 * @author Victor
 * @copyright 2011
 */

/** 
 * menu structuur 
 * parentId 0 is bovenste laag
 */
 
/**
 * 
id	parentId	name
1	0	        Vacatures
2	0	        Tutorials
3	0	        Scripts
4	0	        Boeken
5	3	        Algemeen
6	3	        Overig
7   3           Beveiliging
8   5           Dynamisch menu

*/

/**
 * Haal alle menu items op
 * met 1 query
 */

$link = mysql_connect('localhost', 'gebruikersnaam', 'wachtwoord');
if(!$link) {
    echo 'Kan geen verbinding tot stand brengen.<br />' . mysql_error();
}
$db = mysql_select_db('menu', $link);
if(!$db) {
    echo 'Kan geen verbinding maken met database.<br />' . mysql_error();
}


$result = mysql_query(" 
    SELECT 
        id, parentId, name 
    FROM 
        menu 
    ORDER BY 
        parentId, name 
");


/**
 * Maak een array met parent-child relaties
 */
 
$menuData = array( 
    'items' => array(), 
    'parents' => array() 
); 

while ($menuItem = mysql_fetch_assoc($result)) 
{ 
    $menuData['items'][$menuItem['id']] = $menuItem; 
    $menuData['parents'][$menuItem['parentId']][] = $menuItem['id']; 
} 

/**
 * Bouw het menu, $parentId 0  is de bovenste laag.
 */ 
 
function buildMenu($parentId, $menuData) 
{ 
    $html = ''; 

    if (isset($menuData['parents'][$parentId])) 
    { 
        $html = '<ul>'; 
        foreach ($menuData['parents'][$parentId] as $itemId) 
        { 
            $html .= '<li>' . $menuData['items'][$itemId]['name']; 

            /** Vind child items recursief **/
            $html .= buildMenu($itemId, $menuData); 

            $html .= '</li>'; 
        } 
        $html .= '</ul>'; 
    } 

    return $html; 
} 

/**
 * weergeef het menu op het scherm
 */
echo buildMenu(0, $menuData);

Reacties

0
Nog geen reacties.