webForumDet fria alternativet

Hjälp med meny utskrift.

ASP

10 svar · 398 visningar · startad av ConnyFox

Medlem sedan aug. 20011 087 inlägg
Frågan#1

Jag använder mig utav ett meny script jag hittade här på forumet som jag modifierat lite. Hur som helst så ser databasbyggnaden ut såhär

id - menyalternativets id (doh)

namn - namnet som syns när menyn skrivs ut (doh*2)

belongto - ifall menyalternativet är undermeny till något annat alternativ så står det alternativets id här, annars 0.

folder - Innehåller en 1 eller 0 som visar på om alternativet endast är en innehållare åt andra alternativ eller om den kan vara både och. (denna kan ni ignorera egentligen)

Nu det jag vill göra är att skriva ut alla menyalternativ i en select ungefär såhär

<select>
<option name="menyid" value="5">Bilar</option>
  <option name="menyid" value="7"> - Volvo</option>
  <option name="menyid" value="24"> - saab</option>
<option name="menyid" value="12">Blommor</option>
  <option name="menyid" value="1">tussilago</option>
</select>

value skall alltså vara det menyalternativets idnummer.

Dvs att menyalternativen skrivs ut med sina underalternativ efteråt.
Skall tilläggas att menyn kan ha onändligt antal undernivåer.

Någon som kan hjälpa mig med detta?

Medlem sedan dec. 1999707 inlägg
#2

Om du använder dig av SQLServer så skulle jag byggt en SP som hämtar ut alla items med en extra kolumn: itemLevel. Som visar på vilken nivå i strukturen ett item ligger. För att göra dett så skapar man en temptabell som man insertar item i flera steg. Kan visa i sql om så behövs.

Är det bara två nivåer på menyn så kan du köra en UNION på två select satser, en för root-nivå items och en för dess underliggande items och sortera på belongto.

Annars kan du skriva en rekursiv function som responsar ut option-taggar. nackdelen är att man få hämta item i flera omgångar.

Medlem sedan aug. 20011 087 inlägg
#3

Använder mysql =/ tycker väll att det borde gå o hämta ut alla o sedan sortera dom så dom hamnar i rätt ordning o skriva ut.. eller nått.. :D har ju sett detta göras på så många sidor.

Och dom gör ju det i scriptet när dom skriver ut menyn..

Medlem sedan dec. 1999707 inlägg
#4

Ja det är klart bättre har du rätt i. Hämta alla och sätta .Filter-egenskapen på recordsetet.

Dim itemLevel
Dim rs   <-- dimma globalt
Set rs = .... <- hämta alla items
itemLevel = 0

%>

<select><% Call renderChildNodes(0) %></select>

<%

Function renderChildNodes(ByVal parentId)

   rs.Filter = "belongto = " & parentId
   If rs.RecordCount = 0 then Exit Function
   Do Until rs.Eof
      Response.Write "<option value=""" & rs("id") & """>" & String(itemLevel, "-") & rs("namn") & "</option>"
      Call renderChildNodes(rs("id"))
   Loop

End Function

%>
Medlem sedan aug. 20011 087 inlägg
#5

Hmm det där fungerade inte alls.. den skrev bara ut ett menyalternativ.. Kanske e jag som inte förstog helt iofs..

Medlem sedan dec. 1999707 inlägg
#6

Sorry men jag testade inget, skrev det helt ad-hoc. Hoppades mest att det skulle hjälpa dig på traven.

Hur recordsetet ut om du skriver ut det?

Medlem sedan aug. 20011 087 inlägg
#7

brukar vanligtvis använda getrows så kanske är därför jag inte förstår allt..

hur skall detta egentligen se ut?

Dim itemLevel
Dim rs   <-- dimma globalt
Set rs = .... <- hämta alla items

för mig ser det ut såhär

Dim itemLevel
Dim rs 
mysql = "select * from meny"
Set rs = connect.execute(mysql)
itemLevel = 0

Hur skriver jag ut recordsetet?

Scriptet jag använder (om än modifierat) är detta :
http://www.webforum.nu/showthread.php?s=&forumid=148&threadid=76224&highlight=meny
Macce linktree

Medlem sedan okt. 2004502 inlägg
#8

Har du flera nivåer? Är det bara en nivå nedåt bör du kunna göra så här:

hämta alla där belongto=0
börja loopa
anropa databasen och hämta alla som har belongto=aktuellt id
loopa igenom och skriv ut alla underkategorier
avsluta loopen

visserligen inte optimalt, men ganska enkelt.

Medlem sedan aug. 20011 087 inlägg
#9

Mjo tyvärr kan jag inte garantera att det bara kommer vara 2 nivåer :( har försökt modifiera koden i macce linktree för den gör ju ungefär så som jag vill bara det att alla undernivåer inte visas och att den skriver ut länkar och inte options.. hmm med andra ord inte alls samma och inte heller så optimalt antagligen.. men jag lyckades hur som helst inte så jag vände mig hit..

Medlem sedan aug. 20011 087 inlägg
#10

Ok har fixat denna koden nu,en modifierad version av koden som kan hittas på andra sidan i denna tråden.

http://www.webforum.nu/showthread.php?s=&threadid=96541&perpage=25&highlight=meny under&pagenumber=2

Den fungerar utmärkt och gör exakt det jag vill ha gjort.
bara ett problem, den måste ju markera att det är undermenyer på något vis. Jag får bara inte till det.
Tror jag lyckats markera dom mest konstiga kombinationerna utan just underkategorina.

Sub PrintTree(intParent)
  strSQL = "SELECT id, me_belongto, me_namn FROM meny WHERE me_belongto = " & intParent
  Set objRubrik = objConn.Execute(strSQL)

  Do Until objRubrik.EOF
  
    strSQL = "SELECT me_belongto FROM meny WHERE me_belongto = " & objRubrik(0)
    Set objNode = objConn.Execute(strSQL)

    If NOT objNode.EOF Then
      Response.Write("<option>" & objRubrik(2) & "</option>")
	  PrintTree objNode(0)
	   Else
      Response.Write("<option>" & objRubrik(2) & "</option>")
	  End If

    objNode.Close : Set objNode = Nothing : 
	objRubrik.MoveNext
  Loop

  objRubrik.Close : Set objRubrik = Nothing

End Sub

PrintTree 0

objConn.Close : Set objConn = Nothing
Medlem sedan aug. 20011 087 inlägg
#11

JAAAAAAAAAAAAAa!!!!
jag löste det, fy helvete vad bra jag är ;D


response.write "<select>"

call dbopen(connect)

Sub PrintTree(intParent,intSub)
  MySQL = "SELECT id, me_belongto, me_namn FROM meny WHERE me_belongto = " & intParent & " Order by me_namn"
  Set objRubrik = connect.Execute(MySQL)

  Do Until objRubrik.EOF
  
    MySQL = "SELECT me_belongto FROM meny WHERE me_belongto = " & objRubrik(0)
    Set objNode = connect.Execute(MySQL)

if intSub = 1 then
strSub = "-"
else
strSub = ""
end if

    If NOT objNode.EOF Then
	Response.Write("<option>" & objRubrik(2) & "</option>")
		PrintTree objNode(0), 1
	Else
      Response.Write("<option>"& strSub & objRubrik(2) & "</option>")
	  End If

    objNode.Close : Set objNode = Nothing : 
	objRubrik.MoveNext
  Loop

  objRubrik.Close : Set objRubrik = Nothing

End Sub

PrintTree 0, 0

call dbclose(connect)

response.write "</select>"
556 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
420 ms — deklarationer (db)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)
420 ms — ändringar (db)