Det du skal havde gemt for hver menu er et unik nummer (id), og parentid samt navnet.
Eks kunne være en rekrusiv funktion som kigger strengen i gemmen og kalder sig selv ved en ny <li>, <ul> eller </ul> og ligger id, navn og parentid ind i nogle arrays som senere kan ligges i databasen:
function makeMenu(str, oldparent, parent, i) dim firstUL, firstSUL, firstLI
if firstUL = 1 then 'ny parent er fundet kald funktionen igen med den nye parent, samt overfør den gamle parent (oldparent) oldparent = parent parent = id tmp = makeMenu(mid(str,firstUL+4), oldparent, parent, 1) elseif firstSUL = 1 then 'Slut på en sub menu ret parent til oldparen og kald funktionen igen: parent = oldparent tmp = makeMenu(mid(str,firstSUL+5), oldparent, parent, 1) elseif firstLI = 1 then 'Find nanvet imellem <li> og </li> 'bruge inStr til at finde hvor navnet start og hvor </li> starter navn = mid(str, x, y)
id = id + 1 'Opdater id så det nye menupunkt får nyt id. 'Gem det nye menu punkt i arrays arrID(ubound(arrID)) = id arrNavn(ubound(arrID)) = navn arrParent(ubound(arrID)) = parent
'Udvid arraysne så der er plads til et nyt menu punkt redim Preserve arrID(ubound(arrID)+1) redim Preserve arrNavn(ubound(arrID)) redim Preserve arrParent(ubound(arrID))
tmp = makeMenu(mid(str,firstSLI + 5), oldparent, parent, 1) end if
end function
id, arrID, arrNavn, arrParent skal være globale variable.
Iden er den kaldet sig selv ved hver <ul>, <li> og </ul> og klipper streng til som den kommer frem så først vil den finde <ul> opdter parent og kalde sig selv med dennes streng: <li>Side 1</li><li>Side 2</li><ul><li>Side 2.1</li><li>Side 2.2</li></ul><li>Side 3<br /></li></ul> Så vil den finde <li> Side 1 og kalde sig selv med denne streng: <li>Side 2</li><ul><li>Side 2.1</li><li>Side 2.2</li></ul><li>Side 3<br /></li></ul> Så vil den finde <li> Side 2 og kalde sig selv med denne streng: <ul><li>Side 2.1</li><li>Side 2.2</li></ul><li>Side 3<br /></li></ul> Så vil den finde <ul> opdter parent og kalde sig selv med dennes streng: <li>Side 2.1</li><li>Side 2.2</li></ul><li>Side 3<br /></li></ul>
ovs. ovs. så har du 3 array som ideholder:
arrID, arrNavn, arrParent 1 - Side 1 - 0 2 - Side 2 - 0 3 - Side 2.1 - 2 4 - Side 2.2 - 2 5 - Side 3 - 0
Der mangler lige et variable navn i funktionen, firstSLI som bruges til at finde ud af hvor navnet slutter når funktionen kaldes igen og det var <li> som var først:
function makeMenu(str, oldparent, parent, i) dim firstUL, firstSUL, firstLI, firstSLI
if firstUL = 1 then 'ny parent er fundet kald funktionen igen med den nye parent, samt overfør den gamle parent (oldparent) oldparent = parent parent = id tmp = makeMenu(mid(str,firstUL+4), oldparent, parent, 1) elseif firstSUL = 1 then 'Slut på en sub menu ret parent til oldparen og kald funktionen igen: parent = oldparent tmp = makeMenu(mid(str,firstSUL+5), oldparent, parent, 1) elseif firstLI = 1 then 'Find nanvet imellem <li> og </li> 'bruge inStr til at finde hvor navnet start og hvor </li> starter navn = mid(str, x, y)
id = id + 1 'Opdater id så det nye menupunkt får nyt id. 'Gem det nye menu punkt i arrays arrID(ubound(arrID)) = id arrNavn(ubound(arrID)) = navn arrParent(ubound(arrID)) = parent
'Udvid arraysne så der er plads til et nyt menu punkt redim Preserve arrID(ubound(arrID)+1) redim Preserve arrNavn(ubound(arrID)) redim Preserve arrParent(ubound(arrID))
tmp = makeMenu(mid(str,firstSLI + 5), oldparent, parent, 1) end if
end function
I funktionen mangler der også det kode som finder navnet imellem <li> og </li>...
Ideen var så at du kunne lave et loop igenne arraysne og gemme i databsen eks bemærk (-1) da arrayet vil være en plads større end der er menu punkter pga den måde funktionen virker på:
for x = 0 to ubound(arrID)-1 sql = "insert into tabel (menuid, navn, parentID) values (" & arrID(x) & ", '" & arrNavn(x) & "' ," & arrParent(x) & ")" conn.execute(sql) next
if firstUL = 1 then 'ny parent er fundet kald funktionen igen med den nye parent, samt overfør den gamle parent (oldparent) oldparent = parent parent = id tmp = makeMenu(mid(str,firstUL+4), oldparent, parent, 1) elseif firstSUL = 1 then 'Slut på en sub menu ret parent til oldparen og kald funktionen igen: parent = oldparent tmp = makeMenu(mid(str,firstSUL+5), oldparent, parent, 1) elseif firstLI = 1 then 'Find nanvet imellem <li> og </li> 'bruge inStr til at finde hvor navnet start og hvor </li> starter navn = mid(str, x, y)
id = id + 1 'Opdater id så det nye menupunkt får nyt id. 'Gem det nye menu punkt i arrays arrID(ubound(arrID)) = id arrNavn(ubound(arrID)) = navn arrParent(ubound(arrID)) = parent
'Udvid arraysne så der er plads til et nyt menu punkt redim Preserve arrID(ubound(arrID)+1) redim Preserve arrNavn(ubound(arrID)) redim Preserve arrParent(ubound(arrID))
tmp = makeMenu(mid(str,firstSLI + 5), oldparent, parent, 1) end if
<script type="text/javascript"> <!-- d = new dTree('d'); d.add(0,-1,'Website',''); <% for x = 0 to ubound(arrID)-1 id = arrID(x) parrent = arrParent(x) Page_Name = arrNavn(x) %> d.add(<%=id%>,<%=parrent%>,'<%=Page_Name%>','','','','',''); <% 'Looper felterne next %> document.write(d); //--> </script>
De bliver kun gemt på den side hvor de er defineret så skal de føres vidre til en ny side kan du evt. gemme data i en komma seperetet liste og så lave 3 hidden fejler hvor det ligger:
<% for x = 0 to ubound(arrID)-1 idliste = idliste & "," & arrID(x) parrentListe = parrentListe & "," & arrParent(x) Page_NameList = Page_NameList & "," & arrNavn(x) next idliste = mid(idliste,2) parrentListe = mid(parrentListe ,2) Page_NameList= mid(Page_NameList,2) %>
Så kan du hente indholdet og splite og så har du arrayet igen: arrID = Split(Request.Form("idList"), ",") arrParent = Split(Request.Form("parentList"), ",") arrNavn = Split(Request.Form("Page_NameList"), ",")
Så kan du gemme det i databasen:
<% for x = 0 to ubound(arrID) sql = "insert into tabel (menuid, navn, parentID) values (" & arrID(x) & ", '" & arrNavn(x) & "' ," & arrParent(x) & ")" conn.execute(sql) next %>
Arghhhh - lille problem.. håber du er med lidt endnu...
Det Id som jeg giver siderne, kommer jo til at ændre sig, så snart jeg ligger dem i databasen, og dermed kommer parrent id også til at ændre sig.. :'o(
Ja det var lidt være men her er et eksempel hvor den laver et array til at konverter imellem de ID funktionen giver og de ID som er i datasen:
antal = ubound(arrID) redim arrIdConv(1, antal) for x = 0 to ubound(arrIdConv,2) arrIdConv(0,x) = 0 arrIdConv(1,x) = 0 next for x = 0 to ubound(arrID)-1 for xx = 0 to ubound(arrParent)-1 if arrIdConv(0,xx) = arrParent(x) then parentID = arrIdConv(1,xx) exit for end if next sql = "insert into tabelnavn (navn, parent) values ('" & arrNavn(x) & "', " & parentID & ")" Conn.Execute(SQL) sql = "select max(id) from tabelnavn" set rs=conn.Execute(SQL) 'Gemmer arrID samt det nye id arrIdConv(0,x) = arrID(x) arrIdConv(1,x) = rs(0) next
hov der skal nok ikke være -1 på hvis du har lavet det med hidden felt der føre data vidre til den side som skiver til databasen:
antal = ubound(arrID) redim arrIdConv(1, antal) for x = 0 to ubound(arrIdConv,2) arrIdConv(0,x) = 0 arrIdConv(1,x) = 0 next for x = 0 to ubound(arrID) for xx = 0 to ubound(arrParent) if arrIdConv(0,xx) = arrParent(x) then parentID = arrIdConv(1,xx) exit for end if next sql = "insert into tabelnavn (navn, parent) values ('" & arrNavn(x) & "', " & parentID & ")" Conn.Execute(SQL) sql = "select max(id) from tabelnavn" set rs=conn.Execute(SQL) 'Gemmer arrID samt det nye id arrIdConv(0,x) = arrID(x) arrIdConv(1,x) = rs(0) next
for x = 0 to ubound(arrID) 'Opretter en ny side Set rs_add_page = Server.CreateObject("ADODB.RecordSet") rs_add_page.open "Select * From [Pages]" , Conn,1, 3
antal = ubound(arrID) redim arrIdConv(1, antal) for x = 0 to ubound(arrIdConv,2) arrIdConv(0,x) = 0 arrIdConv(1,x) = 0 next for x = 0 to ubound(arrID) 'Opretter en ny side for xx = 0 to ubound(arrParent)-1 if arrIdConv(0,xx) = arrParent(x) then parentID = arrIdConv(1,xx) exit for end if next Set rs_add_page = Server.CreateObject("ADODB.RecordSet") rs_add_page.open "Select * From [page]" , Conn,1, 3
rs_add_page.Addnew rs_add_page("Site_Id") = Site_Id rs_add_page("Language_Id") = Session("sprog") rs_add_page("Page_Parrent") = parentID rs_add_page("Page_Name") = arrNavn(x) rs_add_page.Update id = rs_add_page("ID") rs_add_page.Close arrIdConv(0,x) = arrID(x) arrIdConv(1,x) = id Next %>
Funktion makeMenu skal laves lidt om, prøv at rette den neden for. Samt tilføje et nyt array som global variable, det nye array skal kun bruges i funktionen:
<% liste = Request.form("Editor1")
redim arrID(0) redim arrNavn(0) redim arrParent(0) redim arrLastParent(0) dim id id = 0
makeMenu liste, 0, 0, 1
function makeMenu(str, level, parent, i) dim firstUL, firstSUL, firstLI, firstSLI
if firstUL = 1 then 'ny parent er fundet kald funktionen igen med den nye parent, samt overfør den gamle parent (oldparent) level = level + 1 if ubound(arrLastParent) < level-1 then redim preserve arrLastParent(ubound(arrLastParent)+1) end if arrLastParent(level-1) = id arrLastParent(0) = 0 parent = id tmp = makeMenu(mid(str,firstUL+4), level, parent, 1) elseif firstSUL = 1 then 'Slut på en sub menu ret parent til oldparen og kald funktionen igen: level = level-1 paren = 0 if level > 0 then parent = arrLastParent(level-1) end if tmp = makeMenu(mid(str,firstSUL+5), level, parent, 1) elseif firstLI = 1 then 'Find nanvet imellem <li> og </li> 'bruge inStr til at finde hvor navnet start og hvor </li> starter i1 = inStr(firstLI, str, "<li>", 1) + 4 i2 = inStr(firstLI, str, "</li", 1) navn = mid(str, i1, i2-i1)
id = id + 1 'Opdater id så det nye menupunkt får nyt id. 'Gem det nye menu punkt i arrays arrID(ubound(arrID)) = id arrNavn(ubound(arrID)) = navn arrParent(ubound(arrID)) = parent
'Udvid arraysne så der er plads til et nyt menu punkt redim Preserve arrID(ubound(arrID)+1) redim Preserve arrNavn(ubound(arrID)) redim Preserve arrParent(ubound(arrID))
tmp = makeMenu(mid(str,firstSLI + 5), level, parent, 1) end if
Du er sq guld værd.. hvis jeg engang bliver rig på det her CMS, så skylder jeg dig BIG TIME MONEY ;o)
Men det sker sq nok ikke :o(
--------------------------------------------
Ville det egentlig være svært at bygge ind i funktionen, at hvis man trykkede på opret undersider på en allerede eksisterende side, at den så oprettede strukturen under den side??
Altså lige nu opretter den bare i roden hvor den første side har parent = 0, men kunne man gøre sådan så det første niveau havde parent lig med x ???
Så ville det sq rykke... he he...
ej, sorry skal nok lade dig være i fred, du har vidst gjort alt for meget for mig allerede.. tak for hjælpen og sov godt :o)
Ja det er faktisk muligt at lave rimelig let da "baseline" parent overføres som parameter til funktionen som parametere nr. 3. Den står lige nu til 0:
makeMenu liste, 0, 0, 1
men hvis man de nye menuer skal være sub menuer til menu ID=4 man man skrive parent sim 4:
makeMenu liste, 0, 4, 1
Det kræver så funktionen lige rettes lidt til for lige nnu er det hardcoded til 0 inde i funtkionen (ikke så smar :)) så prøv at rette funktion makeMenu til denne:
<% liste = Request.form("Editor1")
redim arrID(0) redim arrNavn(0) redim arrParent(0) redim arrLastParent(0) dim id id = 0
makeMenu liste, 0, 0, 1
function makeMenu(str, level, parent, i) dim firstUL, firstSUL, firstLI, firstSLI
if firstUL = 1 then 'ny parent er fundet kald funktionen igen med den nye parent, samt overfør den gamle parent (oldparent) level = level + 1 if ubound(arrLastParent) < level-1 then redim preserve arrLastParent(ubound(arrLastParent)+1) end if if (level-1 = 0) then arrLastParent(0) = parent else arrLastParent(level-1) = id end if parent = arrLastParent(level-1) tmp = makeMenu(mid(str,firstUL+4), level, parent, 1) elseif firstSUL = 1 then 'Slut på en sub menu ret parent til oldparen og kald funktionen igen: level = level-1 if level > 0 then parent = arrLastParent(level-1) end if tmp = makeMenu(mid(str,firstSUL+5), level, parent, 1) elseif firstLI = 1 then 'Find nanvet imellem <li> og </li> 'bruge inStr til at finde hvor navnet start og hvor </li> starter i1 = inStr(firstLI, str, "<li>", 1) + 4 i2 = inStr(firstLI, str, "</li", 1) navn = mid(str, i1, i2-i1)
id = id + 1 'Opdater id så det nye menupunkt får nyt id. 'Gem det nye menu punkt i arrays arrID(ubound(arrID)) = id arrNavn(ubound(arrID)) = navn arrParent(ubound(arrID)) = parent
'Udvid arraysne så der er plads til et nyt menu punkt redim Preserve arrID(ubound(arrID)+1) redim Preserve arrNavn(ubound(arrID)) redim Preserve arrParent(ubound(arrID))
tmp = makeMenu(mid(str,firstSLI + 5), level, parent, 1) end if
Jeg kender ikke dTree men det giver så vidt jeg kan se ikke et problem med dtabase da alle ID'er vil være det, hvis det ser underligt ud er det nok fordi den ikke kan finde en med ID'et som svare til parentID :)
Ja det lyder meget logisk at ændre den føste få den får ID= lig det parent ID der er valgt ;)
Hov lige en sidste ting.. jeg kan se at jeg bruger et felt i min database som hedder Page_Level, som simpelhen bare fortæller hvilket niveau siden befinder sig i.
Du har også skrevet noget med level i koden - kan jeg bruge det til at sætte ind??
Mine levels fungerer så at Level 1 er først niveau, Level 2 er andet osv...
Ja faktisk bruges den level sammen med arrLastParent(0) til at holde styr på hvilken parent et level hvade sidst.
Men level kan også bruges direkte, hvis det skal være 1,2,3,4.. men det vil ikke virke så godt hvis man skal indsætte flere menuer til en sub menu som måske er på level 3 så vil de næste starte på level 1.
Så der skal laves et nyt array med menulevel og så skal man nok overføre start level til funktionen og så enten tælle menulevel og og ned hved hver <ul> og </ul> eller lige start menulevel sammen med level så man har det rigtige level..
Ja - jeg tænkte også at skulle indsætte en start_level, som standard er 1.
Og at den så lægger til og trækker fra ud fra <ul> og </ul>...
Er lidt i tvivl om hvordan, da jeg hele natten har siddet og prøvet at gennemskue din kode ;o)
Brugeren vælger i starten af koden hvilken side den nye sidestrruktur skal placeret under, ud fra en select-boks, hvor den bare sender et parent id med. men der kunne den vel også sende et Page_Level med.
Funktionen opdateres sådan her. Funktion skal ud fra tags <ul>, <li>, eller </ul> gøre forskellige ting. Strukturen i funktionen er en if then elseif stryktur som tjekker om man står ved enten <ul> eller </ul> eller <li>.
Så strukturen er:
- Er det ved <ul> betyder det man går et level højre op eks. 3->4. Detfor tælles level op med en, den gemmer så id som parent det det level man står på, så man senere kan finde det parent id når man kommer tilbage på den samme level. Der efter kalder den funktionen igen hvor "<ul>" er fjernet.
- Er det ved </ul> betyder det man går et level ned eks. 4->3. Detfor tælles level ned med en, den henter så parent som er gemt for det level så nye menu punkter på samme level får rigtigt parent id. Der efter kalder den funktionen igen hvor "</ul>" er fjernet.
- Er det ved <li> betyder det man har fundet et menu punkt. Den finder navnet imellem <li> og næste </li> tag. Den gemmer så de nødvendige oplysninger i nogle arrays ID, navn, og parent og nu også level. Der efter kalder den funktionen igen hvor "<li>navn</li>" er fjernet.
De arrays skal så svare til det som er nødvendigt for at ligge posten ind i databasen, grunden til det ikke er et array men flere er at det er letere at håndtere en dimentional arrays når man ikke kender størrelsen på forhåand (antal menu punkter).
Det som jeg har gjort er at tilføje "start menu" level så funktion ud fra startlevel og level kan afgøre hvilket level menu ligger på og gemmer det i arrLevel for menu punktet.
funktionen kaldes med:
makeMenu str, level (altid 0), startlevel, parent, i (antal 1)
<% liste = Request.form("Editor1")
redim arrID(0) redim arrNavn(0) redim arrLevel(0) redim arrParent(0) redim arrLastParent(0) dim id id = 0
makeMenu liste, 0, 0, 1, 1
function makeMenu(str, level, startlevel, parent i) dim firstUL, firstSUL, firstLI, firstSLI
if firstUL = 1 then 'ny parent er fundet kald funktionen igen med den nye parent, samt overfør den gamle parent (oldparent) level = level + 1 if ubound(arrLastParent) < level-1 then redim preserve arrLastParent(ubound(arrLastParent)+1) end if if (level-1 = 0) then arrLastParent(0) = parent else arrLastParent(level-1) = id end if parent = arrLastParent(level-1) tmp = makeMenu(mid(str,firstUL+4), level, startlevel, parent, 1) elseif firstSUL = 1 then 'Slut på en sub menu ret parent til oldparen og kald funktionen igen: level = level-1 if level > 0 then parent = arrLastParent(level-1) end if tmp = makeMenu(mid(str,firstSUL+5), level, startlevel, parent, 1) elseif firstLI = 1 then 'Find nanvet imellem <li> og </li> 'bruge inStr til at finde hvor navnet start og hvor </li> starter i1 = inStr(firstLI, str, "<li>", 1) + 4 i2 = inStr(firstLI, str, "</li", 1) navn = mid(str, i1, i2-i1)
id = id + 1 'Opdater id så det nye menupunkt får nyt id. 'Gem det nye menu punkt i arrays arrID(ubound(arrID)) = id arrNavn(ubound(arrID)) = navn arrLevel(ubound(arrID)) = startlevel + level - 1 arrParent(ubound(arrID)) = parent
Så skal det nye array arrLevel med alle de steder hvor de 3 andre arrays er i koden altå i "preview" funktionen skal der laves en liste med level. På den næste side skal der være en linie som ligger strenge over i et nyt array ligesom med de 3 andre.
For tilsidst at havde en linie på den side der skriver til databasen:
Så når du henter "Page_Relation" så splite den op ved | så det bliver et array, så dette: n = Request.Form("Page_Relation") parent_i = Request.Form("Page_Level") + 1
Bliver til: arr = split(Request.Form("Page_Relation"), "|") n = arr(0) parent_i = arr(1)
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.