Avatar billede zantiago Nybegynder
22. april 2006 - 13:53 Der er 66 kommentarer og
1 løsning

Opret poster i database ud fra bullets

Hej Eksperter,

Jeg har fået en skør idé, og har brug for jeres hjælp.

Jeg har et lille CMS, hvor man kan oprette sider osv.

Nu vil jeg gerne lave en måde så man hurtigt kan oprette sider ved hjælp af bullitpoints.

Man skal så ved hjælp af indrykninger kunne laver undersider.

Eks.:
-------------------------------
:: Side 1
:: Side 2
  :: Side 2.1
  :: Side 2.2
::Side 3
-------------------------------

Det må betyde at hver gang koden støder på et <ul> skal den lægge 1 til en værdi, lad os kalde den for n.

Så når man starter koden må man skulle have at:

n=0

Hver gang der kommer en <li> skal den hente indholdet mellem <li> og </li> og oprette en post i tabellen med sidens navn og værdien af n.

Så kommer html-koden:
----------------------------------------------------------
<ul><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>
----------------------------------------------------------

Er der nogen som forstår hvad jeg mener?

Jeg har brug for hjælp til at oversætte mine skøre tanker til ASP :o)

På forhånd tak..

// Z
Avatar billede eagleeye Praktikant
22. april 2006 - 16:35 #1
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

  firstUL = inStr(i, str, "<ul>", 1)
  firstSUL = inStr(i, str, "</ul>", 1)
  firstLI = inStr(i, str, "<li>", 1)

  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.


Funktionen skal så kaldes sådan her:

liste = "<ul><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>"
makeMenu(liste, 0, 0, 1)




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
Avatar billede eagleeye Praktikant
22. april 2006 - 16:47 #2
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

  firstUL = inStr(i, str, "<ul>", 1)
  firstSUL = inStr(i, str, "</ul>", 1)
  firstLI = inStr(i, str, "<li>", 1)
  firstSLI = inStr(i, str, "</li>", 1)

  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
Avatar billede eagleeye Praktikant
22. april 2006 - 16:48 #3
Ideen kommer af denne funktion: http://www.html.dk/scripts/asp/00015/
Som jo er den præsis modsatte funktion.
Avatar billede zantiago Nybegynder
22. april 2006 - 18:49 #4
Microsoft VBScript compilation  error '800a0414'

Får en lille fejl:
---------------------------------------------
Cannot use parentheses when calling a Sub

/admin/page.asp, line 601

makeMenu(liste, 0, 0, 1)
------------------------^
Avatar billede zantiago Nybegynder
22. april 2006 - 18:50 #5
skriver i koden:

<%
liste = Request.form("Editor1")
makeMenu(liste, 0, 0, 1)

function makeMenu(str, oldparent, parent, i)
  dim firstUL, firstSUL, firstLI, firstSLI

  firstUL = inStr(i, str, "<ul>", 1)
  firstSUL = inStr(i, str, "</ul>", 1)
  firstLI = inStr(i, str, "<li>", 1)
  firstSLI = inStr(i, str, "</li>", 1)

  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
%>
Avatar billede eagleeye Praktikant
22. april 2006 - 18:52 #6
Prøv at rette:

makeMenu(liste, 0, 0, 1)

til dette:

makeMenu liste, 0, 0, 1
Avatar billede zantiago Nybegynder
22. april 2006 - 19:07 #7
Yes - super.. Fedt at du gider hjælpe... :o)

Nu tror jeg lige at der skal laves nogle rettelser i dette her stykke kode:

    'Find nanvet imellem <li> og </li>
    'bruge inStr til at finde hvor navnet start og hvor </li> starter
    navn = mid(str, x, y)

for jeg får en fejl:
Microsoft VBScript runtime  error '800a0005'

Invalid procedure call or argument: 'Mid'

/admin/page.asp, line 623
Avatar billede eagleeye Praktikant
22. april 2006 - 19:10 #8
Ja det skal være noget som finder navnet imellem <li> og </li>:

Du kan tilrette:

    navn = mid(str, x, y)


Til noget som dette så den finder navnet fra lige efter <li> til starten af </li:

    i1 = inStr(firstLI, str, "<li>", 1) + 4
    i2 = inStr(firstLI, str, "</li", 1)
    navn = mid(str, i1, i2-i1)
Avatar billede zantiago Nybegynder
22. april 2006 - 19:16 #9
Super - Hvor definerer jeg ID'et henne??

Den melder fejl her:
id = id + 1

Microsoft VBScript runtime  error '800a000d'

Type mismatch

/admin/page.asp, line 630
Avatar billede eagleeye Praktikant
22. april 2006 - 19:29 #10
id, arrID, arrNavn, arrParent skal være globale variable så prøv at tilføje:

redim arrID(0)
redim arrNavn(0)
redim arrParent(0)
dim id
id = 0


De liner skal være før denne:

makeMenu liste, 0, 0, 1
Avatar billede zantiago Nybegynder
22. april 2006 - 19:31 #11
JA JA JA - Kom igennem dokumentet uden fejl :o)

Jubii...

Nu skal jeg bare have dem i databasen... Takker endnu en gang - du er for cool...

Skriver lige hvis jeg, eller rettere når jeg får problemer med det... ;o)
Avatar billede zantiago Nybegynder
22. april 2006 - 19:39 #12
Yes - så er jeg på banen igen ;o)

Jeg vil egentlig gerne at brugerne lige skal godkende det - dvs. at den viser hvordan det kommer til at se ud.

Så trykker man Godkend og så sider man arraysene i databasen..

Normalt når jeg kalder menuen, så den vises i en træstruktur, gør jeg følgende:

<script type="text/javascript">
                    <!--
                    d = new dTree('d');
                    d.add(0,-1,'Website','');
<%
Noget kode hvor jeg udskriver felterne fra databasen...
%>
                    d.add(<%=id%>,<%=parrent%>,'<%=Page_Name%>','','','','','');
                    <%
                    'Looper felterne
                    rs_menu.MoveNext
                    Loop
                    'recordset lukkes
                    rs_menu.close
                    %>
                    document.write(d);
                    //-->
                    </script>
Avatar billede zantiago Nybegynder
22. april 2006 - 19:40 #13
Så mit spørgsmål er  om jeg kan lave en lign. opstillin ud fra de data jeg har liggende i arraysene???

Derefter trykke Godkend, og så flytter den data'ene til databasen :o)

Wow hvis det her kommer til at virke vil jeg gerne have en idol plakat af dig hængende =D
Avatar billede eagleeye Praktikant
22. april 2006 - 19:43 #14
Ja det kan gøres på samme måd ud fra arraysne:



<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>
Avatar billede zantiago Nybegynder
22. april 2006 - 19:52 #15
Nu lyder jeg nok som en klovn - men hvor længe bliver de der arrays gemt?

Kan jeg godt gå videre til en ny side nu, hvor jeg så kan smide dem i databasen?
Avatar billede eagleeye Praktikant
22. april 2006 - 20:02 #16
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)
%>

<form action="" method="post">
<input type="hidden" name="idList" value="<%=idliste%>">
<input type="hidden" name="parentList" value="<%=parrentListe%>">
<input type="hidden" name="Page_NameList" value="<%=Page_NameList%>">
<input type="submit" name="Gem" value="Gem"
</form>



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
%>
Avatar billede zantiago Nybegynder
22. april 2006 - 20:02 #17
Men anyway - du har svaret =D

Cool alle pointsene er fortjente...
Avatar billede eagleeye Praktikant
22. april 2006 - 20:18 #18
Ok så kommer her et svar :)
Avatar billede zantiago Nybegynder
22. april 2006 - 20:27 #19
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(

Hvad gør jeg lige der?
Avatar billede eagleeye Praktikant
22. april 2006 - 21:04 #20
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
Avatar billede eagleeye Praktikant
22. april 2006 - 21:05 #21
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
Avatar billede zantiago Nybegynder
22. april 2006 - 21:13 #22
Ja det ser jo fint ud - men jeg forstår ikke så meget af det.. Gider du at sætte det ind i min kode?

------------------------------------------------------------------------------------------

<%
arrID = Split(Request.Form("idList"), ",")
arrParent = Split(Request.Form("parentList"), ",")
arrNavn = Split(Request.Form("Page_NameList"), ",")

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

rs_add_page.Addnew
rs_add_page("Site_Id")            =    Site_Id
rs_add_page("Language_Id")        =    Session("sprog")
rs_add_page("Page_Parrent")    =    ?????
rs_add_page("Page_Name")        =    arrNavn(x)



rs_add_page.Update
rs_add_page.Close
Next
%>

------------------------------------------------------------------------------------------
Avatar billede eagleeye Praktikant
22. april 2006 - 21:18 #23
ja hvad hedder din autonummer kolonne?
Det er vel den du vil havde ind i page_parent.
Avatar billede zantiago Nybegynder
22. april 2006 - 21:21 #24
Id
Avatar billede eagleeye Praktikant
22. april 2006 - 21:29 #25
ok prøv at rette den viste kode til dette:


<%
arrID = Split(Request.Form("idList"), ",")
arrParent = Split(Request.Form("parentList"), ",")
arrNavn = Split(Request.Form("Page_NameList"), ",")

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
%>
Avatar billede eagleeye Praktikant
22. april 2006 - 21:40 #26
hov nu kom det -1 med igen i denne linie_

  for xx = 0 to ubound(arrParent)-1


Det skal være:

  for xx = 0 to ubound(arrParent)
Avatar billede zantiago Nybegynder
22. april 2006 - 21:48 #27
99% en succes ;o)

De kommer perfekt på plads som parents ;o)

Eneste der mangler er at hvis der kommer sider efter dem igen, så ligger den også med den parent...

Jeg lavede et eks.:

:: Side 1
:: Side 2
    :: Side 2.1
    :: Side 2.2
:: Side 3

Det så fint ud på nær at "Side 3" kom til at ligge på Side 2.3's plads.. hvis du forstår.. den fik altså Side 2's Id som parent...
Avatar billede eagleeye Praktikant
22. april 2006 - 21:59 #28
hmm prøv lige at rette:

  for xx = 0 to ubound(arrParent)-1
    if arrIdConv(0,xx) = arrParent(x) then
      parentID = arrIdConv(1,xx)
      exit for
    end if
  next


Til dette:

  for xx = 0 to ubound(arrParent)-1
    parentID = 0
    if arrIdConv(0,xx) = arrParent(x) then
      parentID = arrIdConv(1,xx)
      exit for
    end if
  next
Avatar billede zantiago Nybegynder
22. april 2006 - 22:00 #29
Skulle jeg ikke fjerne det der -1

:-/
Avatar billede eagleeye Praktikant
22. april 2006 - 22:02 #30
Ja det skal fjernes, hmm hov det kom med igen :)
Avatar billede zantiago Nybegynder
22. april 2006 - 22:07 #31
Hov - fandt lige en fejl inden jeg nåede at teste det du skrev:
Det her:
http://zantiago.dk/billede 2.png
Bliver til:
http://zantiago.dk/billede 1.png


miv miv miv...
Avatar billede zantiago Nybegynder
22. april 2006 - 22:09 #32
Men det andet virkede ;o)

Jeg testede lige med samme opstilling som før:
:: Side 1
:: Side 2
    :: Side 2.1
    :: Side 2.2
:: Side 3

... Og der kom Side 3 ind på plads igen :o)
Avatar billede eagleeye Praktikant
22. april 2006 - 22:39 #33
hmm ja det går ikke godt når man har 3 levels på. Kigger lige på den så skal der en opdatering af funktionen på til.
Avatar billede eagleeye Praktikant
22. april 2006 - 22:49 #34
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

  firstUL = inStr(i, str, "<ul>", 1)
  firstSUL = inStr(i, str, "</ul>", 1)
  firstLI = inStr(i, str, "<li>", 1)
  firstSLI = inStr(i, str, "</li>", 1)

  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

end function
%>
Avatar billede zantiago Nybegynder
22. april 2006 - 22:54 #35
Tester lige :o)

Hvor mange niveauer understøtter den?
Avatar billede zantiago Nybegynder
22. april 2006 - 22:58 #36
Nok kan jeg se :o)

Det virker fint, og jeg indsatte bare din kode? Var der mere som jeg skulle gøre??? Hvilke globale variabler skulle jeg ændre?
Avatar billede eagleeye Praktikant
22. april 2006 - 23:01 #37
Den skulle kunne håndtere "uendeligt" mange
hvis du har kopiret hele koden ind er den tilføjet. Det er denne som er ny:

redim arrLastParent(0)
Avatar billede zantiago Nybegynder
22. april 2006 - 23:04 #38
PERFEKT :o)

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)
Avatar billede eagleeye Praktikant
22. april 2006 - 23:18 #39
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

  firstUL = inStr(i, str, "<ul>", 1)
  firstSUL = inStr(i, str, "</ul>", 1)
  firstLI = inStr(i, str, "<li>", 1)
  firstSLI = inStr(i, str, "</li>", 1)

  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

end function
%>
Avatar billede zantiago Nybegynder
22. april 2006 - 23:23 #40
Kan jeg så bare erstatte eks.:
makeMenu liste, 0, 0, 1

med:
makeMenu liste, 0, n, 1

også lade n være id'et på parent'en ??? eller hvordan styrer jeg det?
Avatar billede eagleeye Praktikant
22. april 2006 - 23:26 #41
Ja, hvis du retter funktionen makeMenu til den vist 22/04-2006 23:18:57
Avatar billede eagleeye Praktikant
22. april 2006 - 23:32 #42
Der er lige en ting mere som skal rettes og det er det som skriver til databasen, der skal disse linier:

  for xx = 0 to ubound(arrParent)
    parentID = 0
    if arrIdConv(0,xx) = arrParent(x) then
      parentID = arrIdConv(1,xx)
      exit for
    end if
  next



Rettes til disse så den tager den rigtigt parentID og ikke 0:

  for xx = 0 to ubound(arrParent)
    parentID = arrParent(x)
    if arrIdConv(0,xx) = arrParent(x) then
      parentID = arrIdConv(1,xx)
      exit for
    end if
  next
Avatar billede zantiago Nybegynder
22. april 2006 - 23:55 #43
Det er sq cool...

Previewet bliver ikke så godt hvis jeg sætter en parent <> 0...


<!--
a = new dTree('a');
a.add(0,-1,'Forslag','');
a.add(1,814,'Side 2.2.1','','','','','');
a.add(2,1,'side 2.2.1.1<br />','','','','','');
document.write(a);
//-->

Den første sætter det rigtige parent-id ind, mens nummer to er parent til nummer et :o)

Giver det nogle problemer i koden til databasen?
Avatar billede zantiago Nybegynder
23. april 2006 - 00:02 #44
Jeg fandt en løsning.. satt bare n ind i roden af træet..

a.add(<%=n%>,-1,'Forslag','');

Så virker det perfekt :o)
Avatar billede eagleeye Praktikant
23. april 2006 - 00:05 #45
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 ;)
Avatar billede zantiago Nybegynder
23. april 2006 - 00:06 #46
eagleeye - det har været en KÆMPE fornøjelse.. tusind tak for hjælpen....
Avatar billede zantiago Nybegynder
23. april 2006 - 09:55 #47
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...
Avatar billede eagleeye Praktikant
23. april 2006 - 10:40 #48
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..
Avatar billede zantiago Nybegynder
23. april 2006 - 10:46 #49
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.

Men hvordan så derfra?
Avatar billede eagleeye Praktikant
23. april 2006 - 11:04 #50
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

  firstUL = inStr(i, str, "<ul>", 1)
  firstSUL = inStr(i, str, "</ul>", 1)
  firstLI = inStr(i, str, "<li>", 1)
  firstSLI = inStr(i, str, "</li>", 1)

  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

    redim Preserve  arrID(ubound(arrID)+1)
    redim Preserve  arrNavn(ubound(arrID))
    redim Preserve  arrLevel(ubound(arrID))
    redim Preserve  arrParent(ubound(arrID))
    tmp = makeMenu(mid(str,firstSLI + 5), level, startlevel, parent, 1) 
  end if

end function
%>
Avatar billede eagleeye Praktikant
23. april 2006 - 11:07 #51
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:

rs_add_page("Page_level")        =    arrLevel(x)
Avatar billede zantiago Nybegynder
23. april 2006 - 11:13 #52
før havde jeg nogle bogstaver inde i sætningen:
makeMenu liste, 0, 0, 1, 1 ????

Jeg kalder jo min parent sådan her:
n = Request.Form("Page_Relation")

På samme måde skal jeg vel gøre med Level?

Er det så bare:
startlevel = Request.Form("Page_Level")
parent i = Request.Form("Page_Relation")

Og hvad laver det der i efter parent??? :-/
Avatar billede eagleeye Praktikant
23. april 2006 - 11:16 #53
Jeps, i denne orden: makeMenu (str, level, startlevel, parent i)

n = Request.Form("Page_Relation")
parent_i = Request.Form("Page_Relation")

makeMenu liste, 0, parent_i, n, 1


en note til startlevel hvis det skal være sub menuer til eksvis level 4 skal startlevel være 5 altså den aktive + 1.
Avatar billede eagleeye Praktikant
23. april 2006 - 11:17 #54
hov nr2 Request.Form("Page_Relation") skal jo være "Page_level" :)
Avatar billede zantiago Nybegynder
23. april 2006 - 11:20 #55
Hvis der skal lægges en til, skal det så ikke være sådan her:

n = Request.Form("Page_Relation")
parent_i = Request.Form("Page_Level") + 1
liste = Request.form("Editor1")
Avatar billede zantiago Nybegynder
23. april 2006 - 11:21 #56
Øhhh forresten - have lige glemt.. Hvordan sender jeg to værdier videre fra en dropdown-boks???

Jeg sender jo allerede Page_Relation videre fra value feltet... :-/
Avatar billede eagleeye Praktikant
23. april 2006 - 11:22 #57
Jo, og hvis det så er en helt ny menu stryktur man vil lave skal den overføre 0 som "Page_Level"
Avatar billede eagleeye Praktikant
23. april 2006 - 11:25 #58
Du kan sætte dem sammen med | imellem:

<option value = "433|5">Menu 3.2.2.4.5</option>

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)
Avatar billede eagleeye Praktikant
23. april 2006 - 11:25 #59
og så lige +1 igen til parent_i :)
Avatar billede zantiago Nybegynder
23. april 2006 - 11:30 #60
hov:

Microsoft VBScript compilation  error '800a03ee'

Expected ')'

/admin/page.asp, line 685

function makeMenu(str, level, startlevel, parent i)
-------------------------------------------------^
Avatar billede eagleeye Praktikant
23. april 2006 - 11:32 #61
hov jeg har glemt et komma i den linie efter parent;

function makeMenu(str, level, startlevel, parent, i)
Avatar billede zantiago Nybegynder
23. april 2006 - 11:41 #62
Jeg har ikke lige fået rettet det med arraysene, men se lige om jeg gør det rigtigt:

'Gemmer Arrays i en liste
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)
%>
<form action="?Action=Add_Pages_Dbase" method="post">
<input type="hidden" name="idList" value="<%=idliste%>">
<input type="hidden" name="parentList" value="<%=parrentListe%>">
<input type="hidden" name="Page_NameList" value="<%=Page_NameList%>">

Bliver til:

'Gemmer Arrays i en liste
for x = 0 to ubound(arrID)-1
  idliste  = idliste & "," & arrID(x)
  parrentListe = parrentListe & "," & arrParent(x)
  Page_NameList = Page_NameList & "," & arrNavn(x)
  Page_LevelList = Page_LevelList & "," & arrLevel(x)
next
idliste = mid(idliste,2)
parrentListe = mid(parrentListe ,2)
Page_NameList= mid(Page_NameList,2)
Page_LevelList= mid(Page_LevelList,2)
%>
<form action="?Action=Add_Pages_Dbase" method="post">
<input type="hidden" name="idList" value="<%=idliste%>">
<input type="hidden" name="parentList" value="<%=parrentListe%>">
<input type="hidden" name="Page_NameList" value="<%=Page_NameList%>">
<input type="hidden" name="Page_LevelList" value="<%=Page_LevelList%>">

?? Har jeg fat i det rigtige ?? :o)
Avatar billede eagleeye Praktikant
23. april 2006 - 11:48 #63
Ja det ser rigtigt ud.
Avatar billede zantiago Nybegynder
23. april 2006 - 11:52 #64
Wuhuu - det virker også =D

Så er der kun en lille udfordring tilbage :o)

Den sidste side som bliver oprettet i databasen, har en "<br />" i slutningen..

Kan man undersøge sidenavnet for denne tekststreng, og så slette det?

For jeg kunne godt forestille mig at det ville give nogle problemer i menuerne senere ;o)
Avatar billede zantiago Nybegynder
23. april 2006 - 11:54 #65
Avatar billede eagleeye Praktikant
23. april 2006 - 12:03 #66
Ja man kan replace det eks er det med eller uden mellemrum? man kan også havde begge:

navn = replace(navn, "<br/>", "")
navn = replace(navn, "<br />", "")
Avatar billede zantiago Nybegynder
23. april 2006 - 12:43 #67
Cool - Så slutter jeg her ;o)

Ha' en god søndag :o)

... Endnu engang tak...
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