Avatar billede internet Nybegynder
10. november 2008 - 19:03 Der er 30 kommentarer og
1 løsning

Menu i flere niveauer

Hej

Jeg har brug for hjælp til at lave en menu ligesom den på menu i stil med den http://www.norrevang.dk/default.asp?lan=238 har. Menuen skal lavet ud fra en MySQL datbase.

Håber der er nogle der kan hjælpe.
Avatar billede w13 Novice
10. november 2008 - 19:08 #1
Jeg ser ikke nogen menu i flere niveauer i hverken Safari eller FireFox på Mac.
Avatar billede w13 Novice
10. november 2008 - 19:09 #2
Men ellers skal du bare søge på "javascript dropdown menu" på Google, så er der en milliard. =)
Avatar billede internet Nybegynder
10. november 2008 - 19:17 #3
Hvis man klikker på et af linkene, kommer der flere niveauer frem.
Fx hvis man klikker på "Om Nørrevang" kommer der 6 under punkter frem.

Scriptet skal være inkluderet på alle sider, derfor skal den selv kunne find, frem til hvilke under punkter den skal vise, ud fra databasen.
Avatar billede w13 Novice
10. november 2008 - 19:20 #4
Hmm, nåeh ok. Jeg havde ikke testet lige det punkt.

Jeg ville nok lave det med JavaScript frem for PHP, da det bliver meget lettere at holde styr på, hvad der er klikket på, end hvis siden skal genloades.

Selvfølgelig skal de stadig hentes fra databasen.
Avatar billede w13 Novice
10. november 2008 - 19:21 #5
Hvis du viser et eksempel på, hvordan du henter fra database med PHP på din side, kan jeg nok bygge det. Erstat selvfølgelig password og brugernavn til databasen med noget andet.
Avatar billede w13 Novice
10. november 2008 - 19:22 #6
Og hvordan er din menu-tabel i databasen bygget?
Avatar billede internet Nybegynder
10. november 2008 - 19:30 #7
Jeg har tænkt på følgende:

`id` INT(11) NOT NULL AUTO_INCREMENT,
  `navn` VARCHAR(100) NOT NULL DEFAULT '',
  `link_url` VARCHAR(100) NOT NULL DEFAULT '',
  `parent_id` INT(11) NOT NULL DEFAULT '',

"Navn" er navnet på linket.
"link_url" er det fulde link til siden (ved ikke om det er nødvendigt)
"parent_id" giver vel sig selv. Bruges til at definere om linket er et underpunkt fx kunne der står 1, så ville den være et underpunkt til menupunkt med "id" 1
Avatar billede internet Nybegynder
10. november 2008 - 19:40 #8
Hvordan jeg henter fra databasen:

<?php
$conn = mysql_connect("$server", "$user", "$password");
mysql_select_db("$database");
$resultat = mysql_query("
SELECT * FROM menu;
") or die (mysql_error());
while ($row = mysql_fetch_assoc($resultat)) {
extract($row);
?>

<a href="<?php echo $link_url?>"><?php echo $navn?></a><br>

<?php }?>
Avatar billede w13 Novice
10. november 2008 - 20:22 #9
Prøv lige dette:

<?php

$conn = mysql_connect("$server", "$user", "$password");
mysql_select_db("$database");

$resultat = mysql_query("
    SELECT *
    FROM menu AS M
    WHERE M.parent = 0
        LEFT JOIN menu AS L
        ON L.parent = M.id
    ORDER BY M.id;
") or die (mysql_error());

while ($row = mysql_fetch_assoc($resultat)) {

    extract($row);

    if ($parent_id == 0) {
        echo '<a href="' . $link_url . '">' . $navn . '</a><br>';
    } else {
        echo '<a style="margin-left:20px" href="' . $link_url . '">' . $navn . '</a><br>';
    }

}

?>

Ikke helt sikker på, det virker, men test det lige.
Avatar billede w13 Novice
10. november 2008 - 20:31 #10
Ellers kan det jo gøres ca. sådan her:

<?php

$conn = mysql_connect("$server", "$user", "$password");
mysql_select_db("$database");

$resultat = mysql_query("
    SELECT *
    FROM menu
    WHERE parent_id = 0
    ORDER BY parent_id;
") or die (mysql_error());

while ($row = mysql_fetch_assoc($resultat)) {

    extract($row);

    echo '<a href="' . $link_url . '">' . $navn . '</a><br>';

    $submenus = mysql_query("
        SELECT *
        FROM menu
        WHERE parent_id = " . $parent_id . ";
    ") or die (mysql_error());

    while ($subrow = mysql_fetch_assoc($submenus)) {
   
        echo '<a style="margin-left:20px" href="' . $subrow['link_url'] . '">' . $subrow['navn'] . '</a><br>';

    }

}

?>

Bare ærgerligt, hvis man ikke kunne få det til at nøjes med én SQL-sætning.
Avatar billede w13 Novice
10. november 2008 - 20:32 #11
SQL-sætningen i kode 1 skulle selvfølgelig ikke være:

$resultat = mysql_query("
    SELECT *
    FROM menu AS M
    WHERE M.parent = 0
        LEFT JOIN menu AS L
        ON L.parent = M.id
    ORDER BY M.id;
") or die (mysql_error());

men:

$resultat = mysql_query("
    SELECT *
    FROM menu AS M
    WHERE M.parent_id = 0
        LEFT JOIN menu AS L
        ON L.parent_id = M.id
    ORDER BY M.id;
") or die (mysql_error());

Og ja, undermenuerne er ikke klappet sammen lige nu. Det fikser jeg med JavaScript, når vi har fundet ud af at hente rigtigt fra databasen.
Avatar billede internet Nybegynder
10. november 2008 - 21:17 #12
Jeg kan ikke få kode 1 til at virke.

Kode 2 virker, men ikke ordentlig.

Du kan se mit eksempel her:
http://emilc.eu/test/

Jeg har oprettet følgende menu struktur:

- Forside
- Mig
-- Kajak
- Hunde
- Andet
Avatar billede olebole Juniormester
10. november 2008 - 22:04 #13
<ole>

w13 >> jeg sad og rodede med denne her for et stykke tid siden, men fik aldrig lavet JavaScriptet færdigt, men hvis du gider, kan du lege videre ... jeg er på vej i byen og drikk ... ehhh ... høre noget blues :)

CREATE TABLE IF NOT EXISTS menu (
  id int(10) unsigned NOT NULL auto_increment,
  parid int(10) unsigned ,
  text char(255) ,
  PRIMARY KEY (id)
);

INSERT INTO menu VALUES("1", "0", "Item 0.0");
INSERT INTO menu VALUES("2", "0", "Item 0.1");
INSERT INTO menu VALUES("3", "0", "Item 0.2");
INSERT INTO menu VALUES("4", "0", "Item 0.3");
INSERT INTO menu VALUES("5", "0", "Item 0.4");
INSERT INTO menu VALUES("6", "2", "Item 2.0");
INSERT INTO menu VALUES("7", "2", "Item 2.1");
INSERT INTO menu VALUES("8", "2", "Item 2.2");
INSERT INTO menu VALUES("9", "2", "Item 2.3");
INSERT INTO menu VALUES("10", "7", "Item 2.1.0");
INSERT INTO menu VALUES("11", "7", "Item 2.1.1");
INSERT INTO menu VALUES("12", "7", "Item 2.1.2");
INSERT INTO menu VALUES("13", "11", "Item 2.1.1.0");
INSERT INTO menu VALUES("14", "11", "Item 2.1.1.1");
INSERT INTO menu VALUES("15", "11", "Item 2.1.1.2");
INSERT INTO menu VALUES("16", "11", "Item 2.1.1.3");
INSERT INTO menu VALUES("17", "11", "Item 2.1.1.4");
INSERT INTO menu VALUES("18", "11", "Item 2.1.1.5");
INSERT INTO menu VALUES("19", "15", "Item 2.1.1.2.0");
INSERT INTO menu VALUES("20", "15", "Item 2.1.1.2.1");
INSERT INTO menu VALUES("21", "15", "Item 2.1.1.2.2");
INSERT INTO menu VALUES("22", "15", "Item 2.1.1.2.3");
INSERT INTO menu VALUES("23", "17", "Item 2.1.1.4.0");
INSERT INTO menu VALUES("24", "17", "Item 2.1.1.4.1");
INSERT INTO menu VALUES("25", "17", "Item 2.1.1.4.2");
INSERT INTO menu VALUES("26", "4", "Item 0.3.0");
INSERT INTO menu VALUES("27", "4", "Item 0.3.1");
INSERT INTO menu VALUES("28", "4", "Item 0.3.2");
INSERT INTO menu VALUES("29", "4", "Item 0.3.3");
INSERT INTO menu VALUES("30", "4", "Item 0.3.4");
INSERT INTO menu VALUES("31", "28", "Item 0.3.2.0");
INSERT INTO menu VALUES("32", "28", "Item 0.3.2.1");
INSERT INTO menu VALUES("33", "28", "Item 0.3.2.2");

<?php
class ListTreeMenu {
    private $tableName;
    private $htmlId;
   
    private function getHTML($aMenu, $nLevel=0) {
        $aRet = array();
        $aRet[] = $nLevel==0 ? "<ul id='".$this->htmlId."'>" : "<ul>";
        for ($i=0,$j=count($aMenu[$nLevel]); $i<$j; $i++) {
            $nId = $aMenu[$nLevel][$i]->id;
            $sTxt = $aMenu[$nLevel][$i]->text;
            if (is_array($aMenu[$nId])) {
                $aRet[] = "<li><a href='#' onclick='showSub(this);return false'>".$sTxt."</a>";
                $aRet[] = $this->getHTML($aMenu, $nId)."</li>";
            }
            else $aRet[] = "<li><a href='page.php?id=".$nId."'>".$sTxt."</a></li>";
        }
        print $bla;
        return implode("", $aRet)."</ul>";
    }
   
    public function dump() {
        $sql = "SELECT `id`, `parid`, `text` FROM ".$this->tableName;
        $res = mysql_query($sql) or die (mysql_error());
       
        while ($row=mysql_fetch_object($res)) {
            if (!is_array($aMenu[$row->parid])) $aMenu[$row->parid] = array();
            $aMenu[$row->parid][] = $row;
        }
        print $this->getHTML($aMenu);
    }
   
    public function __construct($sTableName, $sHtmlId) {
        $this->tableName = $sTableName;
        $this->htmlId = $sHtmlId;
    }
}
?>

<?php
include("ListTreeMenu.class.php");

// Forbind til DB
$menu = new ListTreeMenu("menu", "minMenu");
?>

- og nede i markup'en:

    <div class="dropdown">
        <?php $menu->dump() ?>
    </div>

/mvh
</bole>
Avatar billede olebole Juniormester
10. november 2008 - 22:05 #14
- og hvis du vil have noget grundlæggende CSS til:

.dropdown {
    width: 180px;
    overflow: hidden;
}
.dropdown ul {
    margin: 0;
    padding: 0;
    background: #dedede;
}
.dropdown ul li {
    width: 100%;
    list-style: none;
}
.dropdown ul li a, .dropdown ul li a:visited {
    display: block;
    width: 100%;
    padding-left: 4px;
    text-decoration: none;
    background: #dedede;
    color: #000;
}
.dropdown ul li a:hover {
    background: #666;
    color: #fff;
}
.dropdown ul ul {
    margin-left: 10px;
    display: none;
}
Avatar billede olebole Juniormester
10. november 2008 - 22:07 #15
PS: Ét databasekald!  ;o)
Avatar billede internet Nybegynder
10. november 2008 - 22:21 #16
Jeg forstår desværre ikke dit eksempel olebole.

Det ser meget kompliseret ud. Skal koden splittes ud i seperate filer?

Hvor skal database oplysningerne være?
Avatar billede internet Nybegynder
09. december 2008 - 20:02 #17
Er der ingen der kan hjælpe?
Avatar billede olebole Juniormester
09. december 2008 - 20:51 #18
Hvad er det, du ikke kan finde ud af?
Avatar billede internet Nybegynder
09. december 2008 - 21:05 #19
Jeg har først oprettet databasen, og indsat data:

CREATE TABLE IF NOT EXISTS menu (
  id int(10) unsigned NOT NULL auto_increment,
  parid int(10) unsigned ,
  text char(255) ,
  PRIMARY KEY (id)
);

INSERT INTO menu VALUES("1", "0", "Item 0.0");
INSERT INTO menu VALUES("2", "0", "Item 0.1");
INSERT INTO menu VALUES("3", "0", "Item 0.2");
INSERT INTO menu VALUES("4", "0", "Item 0.3");
INSERT INTO menu VALUES("5", "0", "Item 0.4");
INSERT INTO menu VALUES("6", "2", "Item 2.0");
INSERT INTO menu VALUES("7", "2", "Item 2.1");
INSERT INTO menu VALUES("8", "2", "Item 2.2");
INSERT INTO menu VALUES("9", "2", "Item 2.3");
INSERT INTO menu VALUES("10", "7", "Item 2.1.0");
INSERT INTO menu VALUES("11", "7", "Item 2.1.1");
INSERT INTO menu VALUES("12", "7", "Item 2.1.2");
INSERT INTO menu VALUES("13", "11", "Item 2.1.1.0");
INSERT INTO menu VALUES("14", "11", "Item 2.1.1.1");
INSERT INTO menu VALUES("15", "11", "Item 2.1.1.2");
INSERT INTO menu VALUES("16", "11", "Item 2.1.1.3");
INSERT INTO menu VALUES("17", "11", "Item 2.1.1.4");
INSERT INTO menu VALUES("18", "11", "Item 2.1.1.5");
INSERT INTO menu VALUES("19", "15", "Item 2.1.1.2.0");
INSERT INTO menu VALUES("20", "15", "Item 2.1.1.2.1");
INSERT INTO menu VALUES("21", "15", "Item 2.1.1.2.2");
INSERT INTO menu VALUES("22", "15", "Item 2.1.1.2.3");
INSERT INTO menu VALUES("23", "17", "Item 2.1.1.4.0");
INSERT INTO menu VALUES("24", "17", "Item 2.1.1.4.1");
INSERT INTO menu VALUES("25", "17", "Item 2.1.1.4.2");
INSERT INTO menu VALUES("26", "4", "Item 0.3.0");
INSERT INTO menu VALUES("27", "4", "Item 0.3.1");
INSERT INTO menu VALUES("28", "4", "Item 0.3.2");
INSERT INTO menu VALUES("29", "4", "Item 0.3.3");
INSERT INTO menu VALUES("30", "4", "Item 0.3.4");
INSERT INTO menu VALUES("31", "28", "Item 0.3.2.0");
INSERT INTO menu VALUES("32", "28", "Item 0.3.2.1");
INSERT INTO menu VALUES("33", "28", "Item 0.3.2.2");

Derefter har jeg oprettet filen ListTreeMenu.class.php:

<?php
class ListTreeMenu {
    private $tableName;
    private $htmlId;
 
    private function getHTML($aMenu, $nLevel=0) {
        $aRet = array();
        $aRet[] = $nLevel==0 ? "<ul id='".$this->htmlId."'>" : "<ul>";
        for ($i=0,$j=count($aMenu[$nLevel]); $i<$j; $i++) {
            $nId = $aMenu[$nLevel][$i]->id;
            $sTxt = $aMenu[$nLevel][$i]->text;
            if (is_array($aMenu[$nId])) {
                $aRet[] = "<li><a href='#' onclick='showSub(this);return false'>".$sTxt."</a>";
                $aRet[] = $this->getHTML($aMenu, $nId)."</li>";
            }
            else $aRet[] = "<li><a href='page.php?id=".$nId."'>".$sTxt."</a></li>";
        }
        print $bla;
        return implode("", $aRet)."</ul>";
    }
 
    public function dump() {
        $sql = "SELECT `id`, `parid`, `text` FROM ".$this->tableName;
        $res = mysql_query($sql) or die (mysql_error());
     
        while ($row=mysql_fetch_object($res)) {
            if (!is_array($aMenu[$row->parid])) $aMenu[$row->parid] = array();
            $aMenu[$row->parid][] = $row;
        }
        print $this->getHTML($aMenu);
    }
 
    public function __construct($sTableName, $sHtmlId) {
        $this->tableName = $sTableName;
        $this->htmlId = $sHtmlId;
    }
}
?>

Til sidst har jeg oprettet index.php:

<?php
include("ListTreeMenu.class.php");
include("includes/config.php")

$conn = mysql_connect("$server", "$user", "$password");
mysql_select_db("$database");

$menu = new ListTreeMenu("menu", "minMenu");

?>

<div class="dropdown">
        <?php $menu->dump() ?>
    </div>

Men alligevel får jeg følgende fejl:

Parse error: syntax error, unexpected T_VARIABLE in /hsphere/local/home/internet/emilc.eu/test/index.php on line 5
Avatar billede olebole Juniormester
09. december 2008 - 21:07 #20
include("includes/config.php"); // <-- semikolon  ;o)
Avatar billede olebole Juniormester
09. december 2008 - 21:09 #21
- og så kan du forøvrigt godt spare gåseøjnene her:
    $conn = mysql_connect($server, $user, $password);

- og her:
    mysql_select_db($database);
Avatar billede olebole Juniormester
09. december 2008 - 21:10 #22
det med gåseøjnene er ikke en fejl, men de er komplet overflødige  =)
Avatar billede internet Nybegynder
09. december 2008 - 21:14 #23
Nu får jeg følgende fejl:

Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /hsphere/local/home/internet/emilc.eu/test/ListTreeMenu.class.php on line 3
Avatar billede internet Nybegynder
09. december 2008 - 21:20 #24
Jeg ved ikke om det er en fejl, men min config.php indeholder kun følgende:

<?php
$server = "....";
$user = "....";
$password = "....";
$database = "....";
?>
Avatar billede olebole Juniormester
09. december 2008 - 21:22 #25
Det sidste er rigtig nok - men du får ikke den fejl, du beskriver med den kode, du viser
Avatar billede olebole Juniormester
09. december 2008 - 21:26 #26
Ehhhh ... hvilken PHP version kører du? Den kode, jeg har vist, kan kun afvikles under PHP 5+
Avatar billede internet Nybegynder
09. december 2008 - 21:32 #27
Jeg tror at jeg kører med php4, men er ikke sikker.

Hvor i phpinfo ser man det:
http://emilc.eu/test/phpinfo.php

Jeg får den fejl som jeg skrev, du kan se det her:
http://emilc.eu/test/
Avatar billede olebole Juniormester
09. december 2008 - 21:39 #28
Ja, hvor mon man ser det? Prøv f.eks. allerførste linje, der overhovedet bliver udskrevet ... overskriften  ;o)

Ja, du får fejlen, fordi du stadig kører PHP 4. Koden kan som sagt kun afvikles under version 5 og opefter
Avatar billede internet Nybegynder
09. december 2008 - 21:42 #29
Ok, det var sgu ærgeligt.

Er der ikke andre methoder?
Avatar billede olebole Juniormester
09. december 2008 - 21:55 #30
Jo, du kan omskrive det til PHP 4. Jeg orker ikke ligenu
Avatar billede internet Nybegynder
28. marts 2010 - 12:37 #31
lukker
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

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