07. oktober 2004 - 21:25Der er
107 kommentarer og 1 løsning
Dynamisk menu
Jeg vil gerne kunne oprette hovedmenupunkter med dertilhørende undermenupunkter. Desuden skal de også kunne sorteres v.hj.a. <input type="text" value="X">, hvor X = prioriteringen (ORDER BY priority), og det er til en Access Database.
Jeg ved ikke hvordan man nemmest tjekker på, om det ene eller det andet hovedmenupunkt er valgt, så alle undermenuerne herunder bliver vist, og de andre hovedmenupunkter er lukket sammen. Jeg sætter gerne point op til maks, hvis du også kan levere denne løsning.
Jeg skal først og fremmest kunne oprette hovedmenupunkter med tilhørende undermenupunkter. De skal jo trækkes ud i en løkke, og den menu skal, som jeg har linket til, skal slet ikke bruges. Det var kun for at kunne illustrere :o)
Ok, du kan vælge at have én eller to tabeller. Det er nok nemmest at overskue, hvis du har 2.
Tabel1: Navn: Hovedmenu Værdier: id (int), navn (varchar)
Tabel2: Navn: submenu Værdier: id (int), parent (int), navn (varchar)
I tabel1 har du alle hovedmenuerne, og i tabel2 har du alle undermenuerne. Undermenuerne har en "parent"-værdi, der indikerer hvilken hovedmenu den hører til.
Nej, menuerne skal bare sorteres efter den rækkefølge, som administratoren angiver. Dvs. der nok skal sorteres efter hovedmenuerne. I den hovedmenu, som han vælger skal være øverst i menuen, indtaster han værdien 1. Den næste får værdien 2 osv. Undermenupunkterne skal så bare følge med hovedmenupunktet. Er det til at forstå? :o)
Ok, så kan du indsætte noget testdata, så der både er hovedmenuer og undermenuer. Husk at "Parent"-værdien i undermenuerne skal være en værdi fra hovedmenuernes id'er
Prøv det her (jeg håber det virker i første forsøg):
<% set menuer = conn.execute("select * from menumain order by priorityID asc")
do while not menuer.eof %> <%=menuer("mainmenu")%> <ul> <% set undermenuer = Conn.execute("select * from menusub where parent = " & menuer("id") " order by priorityID asc")
do while not undermenuer.eof %> <li><%=undermenuer("submenu")%></li> <% undermenuer.movenext loop %> </ul> <% menuer.movenext loop
set undermenuer = Conn.execute("select * from menusub where parent = " & menuer("id") " order by priorityID asc") --------------------------------------------------------------------------------------^
ja, det kunne godt tyde på, at der mangler nogle værdier. Du kan sikre dig i koden, at den ikke fejler på grund af det:
<% set menuer = conn.execute("select * from menumain order by priorityID asc")
do while not menuer.eof %> <%=menuer("mainmenu")%> <ul> <% menuid = trim(menuer("id")) if menuid = "" then menuid = 0 set undermenuer = Conn.execute("select * from menusub where parent = " & menuid & " order by priorityID asc")
do while not undermenuer.eof %> <li><%=undermenuer("submenu")%></li> <% undermenuer.movenext loop %> </ul> <% menuer.movenext loop
Det har jeg gjort, men nu tror jeg der er gået noget galt på serveren, prøv lige at kigge på siden. conn.asp, som bliver inkluderet i toppen, ser således ud:
<% Set Conn = CreateObject("ADODB.Connection") Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("/fpdb/borch.mdb") %>
Det må da være et eller andet hos min host, der er gået galt?
Så skal der kunne oprettes hovedmenuer, som man kan tilføje undermenupunkter til, og administrere/prioritere. Vil du lave det for max point, eller ...?
Jeg skal lige høre dig ad: ID i menusub, den kan vel godt starte med 1, og så ellers tælle opad? Burde det ikke have været autonummerering istedet for et tal?
Jeg TROR jeg har styr på det. Kan vi kigge lidt på det, når du har tid? Jeg vil gerne bare have, at du lige kigger mig over skulderen og går det efter.
<% menuID = Trim(Server.HTMLEncode(RS("ID"))) If menuID = "" Then menuID = 0 SET RS1 = Conn.Execute("SELECT * FROM menusub WHERE parent = '" & menuID & "' ORDER BY priorityID ASC")
Hvis du har tid, håber jeg lige du vil vælge "Rediger menu". Her vil jeg liste alle hovedmenupunkterne ud, og de skal være links til de valgte punkt og de dertilhørende undermenuer, men det driller sq :o(
Kan du umiddelbart se løsningen? Så ville jeg være glad :o)
Ret linien: Set RS = Conn.Execute("SELECT * FROM menumain WHERE menuID = '" & SQLEncode("ID") & "'") til: Set RS = Conn.Execute("SELECT * FROM menumain WHERE ID = '" & menuID & "'")
Jo, den virker fint nok. Men når jeg skal ind at redigere hovedmenu-links og submenus, så går det galt. "Se alle" er bare en liste over samtlige hovedmenulinks. Det er når jeg skal trække hovedmenu-linket med de tilhørende submenus frem (editmenu.asp?menuID=4), at kæden hopper af :/
<% Dim menuID menuID = Request.Querystring("menuID")
Set RS = Conn.Execute("SELECT * FROM menumain WHERE ID = " & menuID) set submenu = conn.execute("select * from menusub where parent='" & menuID & "' order by priorityID asc") %>
Kunne man ikke bare benytte editmenu.asp, istedet for opdatermenu.asp og opdatersub.asp? Altså på sådan en måde, at man altid befinder sig i editmenu.asp, men evt. får udskrevet et sted på siden med røde bogstaver "Opdateringen er gennemført" eller noget i den stil?
Prøver lige at hive noget gammelt kode frem til eksempel ...
Virker det ikke meget godt? Du har ret i, at koden vil blive mere overskuelig, men alligevel ...? Hvad skulle der i givet fald være på opdatermenu.asp og opdatersub.asp?
<% Dim menuID menuID = Request.Querystring("menuID")
Set RS = Conn.Execute("SELECT * FROM menumain WHERE ID = " & menuID) set submenu = conn.execute("select * from menusub where parent=" & menuID & " order by priorityID asc") %>
<!-- #include virtual="/borch/includes/conn.asp" --> <% id = request("ID") Navn = request("menunavn") prioritet = request("prioritet") ToDo = request("ToDo")
if ToDo = "opdater" then conn.execute("update menumain set mainmenu='" & navn & "', priorityID=" & prioritet & " where id=" & id) response.redirect("editmenu.asp?status=1&menuID=" & id) else conn.execute("insert into menumain (mainmenu, priorityID) values('" & navn & "', " & prioritet & ")") end if
%>
opdatersub.asp
<!-- #include virtual="/borch/includes/conn.asp" --> <% id = request("ID") parent = request("parentID") Navn = request("menunavn") prioritet = request("prioritet") ToDo = trim(request("ToDo"))
if ToDo = "opdater" then conn.execute("update menusub set submenu='" & navn & "', priorityID=" & prioritet & " where id=" & id) response.redirect("editmenu.asp?status=3&menuID=" & parent) else conn.execute("insert into menusub (submenu, parent, priorityID) values('" & navn & "', " & parent & ", " & prioritet & ")") response.redirect("editmenu.asp?status=4&menuID=" & parent) end if
%>
DATABASEN:
Tabel menumain
ID (Autonummerering, primary key) mainmenu (tekst) priorityID (tal) url (tekst)
Nej, ikke endnu. Jeg vil lige prøve at sætte url ind i editmenu.asp, så man kan linke. Men jeg mener ikke det bliver det store problem. Ellers håber jeg du gider hjælpe lidt til? :)
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.