Avatar billede morpheus Nybegynder
13. december 2007 - 20:15 Der er 1 kommentar

Min menu trænger til en opdatering

Hej Eksperter,

Jeg har henover de sidste par aftener bøvlet lidt med den menu funktion jeg har brugt til dato, men den giver desværre problemer så snart jeg kommer ud over level 2...

Jeg har en DB struktur der ser således ud:
id (int) auto increment
gruppe (varchar)
parentID (int) reference til ID - hvis der er tale om en undergruppe
level (int) et felt der angiver hvilket level menupunktet ligger på.

Feltet level vil jeg meget gerne have udfaset helt.

Min kode består af 3 funktioner:
---------------------------------
<?php
function setExpand($id, $level) {
    if (!isset($_SESSION['expand']) && !is_array($_SESSION['expand'])) {
        $_SESSION['expand'] = array();
    }
    if ($level == 0) {
        unset($_SESSION['expand']);
        $_SESSION['expand'] = array();
        array_push($_SESSION['expand'],$id);
    }
    if (!in_array($id, $_SESSION['expand'])) {
        array_push($_SESSION['expand'], $id);
    }
    return $_SESSION['expand'];
}
function getMenu($root=0) {
    $parent = (int) $root;
    $query = "SELECT id,parent_id,groupname, y FROM groups WHERE parent_id = ".$parent." AND active = '1' ORDER BY y, groupname";
    $res = mysql_query($query) or die(mysql_error());
    $self = array();
    while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) {
        $row['child'] = getMenu($row['id']);
        $self[] = $row;
    }
    if (count($self) > 0) {
        return $self;
    } else {
        return null;
    }
}
function showMenu($struct, $level, $expand) {
    $out = '';
    if (is_array($struct) && count($struct)) {
        if (isset($struct['id'])) {
            $indent = '';
            for ($i=0;$i<$level;$i++) {
                $indent = '&nbsp;&nbsp;&nbsp;';
            }
            $out = $indent . '<a href="?id='.$struct['id'].'&level='.$level.'">'.$struct['groupname'].'</a><br />';
            if (is_array($struct['child'])) {
                $level++;
                foreach ($struct['child'] as $child) {
                    if(in_array($struct['id'], $expand)){
                        $out .= $indent.showMenu($child, $level,$expand);
                    }
                }
            }
        } else {
            foreach ($struct as $root) {
                $out .= showMenu($root,$level,$expand);
            }
        }
    }
    return $out;
}
?>

Menuen bliver kaldt på følgende måde:
-------------------------------------
empty($_GET['level']) ? $level = 0: $level = $_GET['level'];
empty($_GET['id']) ? $id = 0: $id = $_GET['id'];
$exp = setExpand($id,$level);
print showMenu(getMenu(),0, $exp);

Det jeg så gerne vil have den til, er at kunne lave en menu med et uendeligt antal levels.
Avatar billede morpheus Nybegynder
13. december 2007 - 20:17 #1
Tag jer ikke lige af feltnavnene i koden... De er omdøbt fra den gamle version
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester