Jeg er ved at udvikle et CMS system, hvor jeg skal kunne generere menupunkter fra en database. Fra administrationen af cms'en skal jeg kunne bestemme rækkefølgen menupunkterne på sitet vises på. Jeg forestiller mig at man har en liste, hvor man kan markere et menupunkt og bruge 'op' og 'ned' pile til at bestemme rækkefølgen. Hvordan gør man det??
Det har jeg tilfældigvis lavet. Scriptet kræver et int-felt i databasen der hedder MenuOrder. Hver gang et dokument oprettes som det første i et "level" skal feltet tildeles værdien 1.
Her er scriptet:
ID = Request.Querystring("ID") Mode = Request.QueryString("Mode")
if Mode = "Up" Then
Query = "SELECT ID, ParentID, MenuOrder FROM Docs WHERE ID = '" & ID & "'" Set Docs = Server.CreateObject("ADODB.RecordSet") Docs.Open Query, Connect, 0
if NowMenuOrder > 1 Then NewMenuOrder = int(NowMenuOrder) - 1
Query = "UPDATE Docs SET MenuOrder = '" & NowMenuOrder & "' WHERE MenuOrder = '" & NewMenuOrder & "' AND ParentID = '" & ThisParent & "'" Connect.Execute Query
Query = "UPDATE Docs SET MenuOrder = '" & NewMenuOrder & "' WHERE ID = '" & ID & "'" Connect.Execute Query
else response.redirect("foldermenu.asp") end if
response.redirect("foldermenu.asp")
Else
Query = "SELECT ID, ParentID, MenuOrder FROM Docs WHERE ID = '" & ID & "'" Set Docs = Server.CreateObject("ADODB.RecordSet") Docs.Open Query, Connect, 0
Query = "SELECT TOP 1 MenuOrder FROM Docs WHERE ParentID = '" & ThisParent & "' ORDER BY MenuOrder DESC" Set Top = Server.CreateObject("ADODB.RecordSet") Top.Open Query, Connect, 0
MaxMenuOrder = Top("MenuOrder")
if NowMenuOrder < MaxMenuOrder Then NewMenuOrder = int(NowMenuOrder) + 1
Query = "UPDATE Docs SET MenuOrder = '" & NowMenuOrder & "' WHERE MenuOrder = '" & NewMenuOrder & "' AND ParentID = '" & ThisParent & "'" Connect.Execute Query
Query = "UPDATE Docs SET MenuOrder = '" & NewMenuOrder & "' WHERE ID = '" & ID & "'" Connect.Execute Query
Jeg læser dit script sådan at hvis inputtet er UP (dvs. ryk menupunktet en linie up) så ændres værdien i den aktuelle til værdien -1 - og værdien-1 adderes med 1. På den måde bytter de plads - er det rigtig læst?
Hjælp mig lige: hvad betyder int, som du bruger her: NewMenuOrder = int(NowMenuOrder) + 1
Det er rigtigt at scriptet bytter om på menupunkterne.
Int i "NewMenuOrder = int(NowMenuOrder) + 1" bruger jeg bare for at være 100% sikker på at det er to tal der adderes. Da MenuOrder feltet jo er af typen Int er det faktisk unødvendigt.
Det virker perfekt - men kun sålænge MenuOrder værdierne er fortløbende altså 1, 2, 3 osv. I mit CMS kan jeg slette en side jeg ikke længere har brug for og derved brydes den fortløbende række til f.eks 1, 3 - og scriptet virker ikke fordi du ændrer MenuOrder med 1 når de bytter plads. Løsningen må vel være at få fat i værdien for MenuOrder før/efter den aktuelle så jeg ved hvilke to, der skal byttes...
Sorry - jeg kan se at jeg har glem at tildele dig points dengang... Jeg er på udkik efter en løsning hvor jeg kan klikke på en knap for 'flyt op' og en knap for 'flyt ned'. Når man klikker på knapperne skifter menupunkterne plads. Det kan man vist ikke med dig løsning??
Nej, så skal du vist over i JavaScripts, eller udbygge det på en anden måde med VB-scripting. Jeg ville prøve at oprette spørgsmålet i kategorien Programmering -> Scripts -> JavaScript, jeg tror JavaScript er mere hensigtsmæssigt at bruge til denne opgave. Håber du lægger et link, så jeg også kan se en evt. løsning :o)
Jeg har fundet ud af det nu - sved på panden... min menu er en vandret menu - derfor skal menupunkterne flyttes til venstre el. højre. Jeg har bygget det sådan op at jeg først bygger et array af menuorder. Derefter fanger jeg den aktuellse værdi og derefter den forrige/næste (alt efter om punktet skal flyttes til højre el. venstre). Derefter opdatere jeg databasen ved at de to aktuelle værdier har byttet plads. Nu har de to punkter byttet plads - og det er helt uafhængigt af om værdierne er fortløbende. gir' det mening?
<!-- #INCLUDE file="conn.inc" -->
<% 'opretter array af menupunkter Set rs = Conn.Execute("Select menuorder from indhold WHERE menu = 'ON' ORDER By menuorder desc") arrData = rs.GetRows() Set rs = nothing
'Hvis der er klikket på Ryk til venstre If request("flyt") = "v" Then
NowMenu = request("NowMenu") NowMenu = int(NowMenu) For t = LBound(arrData,2) to UBound(arrData,2) If (arrData(0,t) = NowMenu) and (t => lbound(arrData,2)) Then forrige = t - 1 'henter de to værdi for menuorder, der skal byttes rundt Set NuMenu=Conn.Execute("SELECT id, menuorder from indhold WHERE menuorder = "&arrData(0,t)&"") id1=NuMenu("id") Set NuMenu=nothing Set NyMenu=Conn.Execute("SELECT id, menuorder from indhold WHERE menuorder = "&arrData(0,forrige)&"") 'menu2=NuMenu("menuorder") id2=NyMenu("id") Set NyMenu=nothing
'opdaterer de to records med de nye værdier for menuorder Set UPNuMenu =Conn.Execute("UPDATE indhold SET menuorder ="&arrData(0,t)&" WHERE id ="&id2&"") Set UPNuMenu = nothing
Set UPNyMenu =Conn.Execute("UPDATE indhold SET menuorder ="&arrData(0,forrige)&" WHERE id ="&id1&"") Set UPNyMenu = nothing End If
Next
End If NowMenu ="" 'Hvis der er klikket på Ryk til højre If request("flyt") = "h" Then
NowMenu = request("NowMenu") NowMenu = int(NowMenu) For t = LBound(arrData,2) to UBound(arrData,2) If (arrData(0,t) = NowMenu) and (t => lbound(arrData,2)) Then forrige = t + 1 Set NuMenu=Conn.Execute("SELECT id, menuorder from indhold WHERE menuorder = "&arrData(0,t)&"") id1=NuMenu("id") Set NuMenu=nothing Set NyMenu=Conn.Execute("SELECT id, menuorder from indhold WHERE menuorder = "&arrData(0,forrige)&"") id2=NyMenu("id") Set NyMenu=nothing
Set UPNuMenu =Conn.Execute("UPDATE indhold SET menuorder ="&arrData(0,t)&" WHERE id ="&id2&"") Set UPNuMenu = nothing
Set UPNyMenu =Conn.Execute("UPDATE indhold SET menuorder ="&arrData(0,forrige)&" WHERE id ="&id1&"") Set UPNyMenu = nothing End If
Det ser godt nok fornemt ud, lmejding! Og det fungerer selvfølgelig?
Synes godt om
Ny brugerNybegynder
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.