Avatar billede lmejding Nybegynder
29. maj 2004 - 06:38 Der er 14 kommentarer

Ændre rækkefølge i menu

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??
Avatar billede steen_hansen Forsker
29. maj 2004 - 07:32 #1
Jeg ville lave det med textfelter, hvor man kunne indtaste prioriteringerne i. Når de trækkes ud, trækkes de ud med ORDER by priority DESC
Avatar billede steen_hansen Forsker
29. maj 2004 - 07:37 #2
Jeg ville køre dette gennem en løkke, som trækker menuen ud:

<td><input type="text" value="<%=Server.HTMLEncode(RS("priority"))%>" name="priority"></td><td><input type="text" value="<%=Server.HTMLEncode(RS("nameofmenu"))%>" name="nameofmenu"></td><td><input type="text" value="<%=Server.HTMLEncode(RS("url"))%>" name="url"></td>
Avatar billede tobby Nybegynder
29. maj 2004 - 22:54 #3
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
   
    ThisParent = Docs("ParentID")
    NowMenuOrder = Docs("MenuOrder")
   
    Docs.Close
    Set Docs = Nothing
   
    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
   
    ThisParent = Docs("ParentID")
    NowMenuOrder = Docs("MenuOrder")
   
    Docs.Close
    Set Docs = Nothing
   
    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
               
    else
        response.redirect("foldermenu.asp")
    end if
       
    response.redirect("foldermenu.asp")


end if
Avatar billede lmejding Nybegynder
30. maj 2004 - 15:13 #4
Hej Tobby,

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

/Lars
Avatar billede tobby Nybegynder
30. maj 2004 - 18:18 #5
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.
Avatar billede lmejding Nybegynder
31. maj 2004 - 08:56 #6
Hej tobby

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...

Har du et bud på hvordan jeg gør??

/Lars
Avatar billede steen_hansen Forsker
31. maj 2004 - 09:11 #7
Hvis du laver det om til et textfelt og tilknytter værdier fra 1 til det antal menupunkter du nu har (f.eks. 9)

<form>
    <input type="text" value="<%=Server.HTMLEncode(RS("priority"))%>" name="priority">
    <input type="submit">
</form>

og trækker dem ud på denne måde

ORDER BY priority DESC

behøver du ikke at trække fra/lægge til. Eller hvad? :o)
Avatar billede tobby Nybegynder
31. maj 2004 - 11:22 #8
Det er jo ligemeget at rækken brydes. Selvom værdierne er 1, 2, 5, 7 osv har du jo stadig rækkefølgen.
Avatar billede steen_hansen Forsker
31. maj 2004 - 12:57 #9
Nemlig, det vil blive trukke ud på denne måde:

priority: 4    NameOfMenu: Hjem    url: /
priority: 6    NameOfMenu: Ny bruger    url: /newuser/
priority: 8    NameOfMenu: Login    url: /login/
priority: 9    NameOfMenu: Artikler    url: /articles/default.asp?articleID=421
Avatar billede steen_hansen Forsker
02. juni 2004 - 22:03 #10
Kunne du bruge det til noget?
Avatar billede lmejding Nybegynder
30. september 2004 - 08:37 #11
Hej steen,

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??
Avatar billede steen_hansen Forsker
30. september 2004 - 10:53 #12
Det er 10-4 :o)

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)
Avatar billede lmejding Nybegynder
01. oktober 2004 - 14:45 #13
Hej Steen,

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
       
    Next

End If
response.redirect "menu_liste.asp"
%>
Avatar billede steen_hansen Forsker
01. oktober 2004 - 15:35 #14
Det ser godt nok fornemt ud, lmejding! Og det fungerer selvfølgelig?
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
Kurser inden for grundlæggende programmering

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