Avatar billede psyclown Nybegynder
24. marts 2004 - 19:52 Der er 6 kommentarer og
2 løsninger

Lille problem med tree menu

Jeg oprettede et spørgsmål tidligere som jeg har fundet et svar på og er næsten færdig med menuen, men når jeg når til tredje "gren" i menuen, så vil den ikke vise undermenuerne.

Menuen kan ses her: http://www.cichlide-net.dk/shop/
Klik på harddiske så, er det meningen at man skulle kunne klikke på IBM også skulle der komme nogle flere undermenuer.
Jeg er gået helt i stå, så jeg håber at jeg kan få noget hjælp herinde.

Her er min kode:

strMenuId = Request.Querystring("MenuId")
strParentId = Request.Querystring("ParentId")
strSubId = Request.Querystring("SubId")

if strMenuId = "" or not isNumeric(strMenuId) then strMenuId = -1
if strParentId = "" or not isNumeric(strParentId) then strParentId = -1
'    if strSubId = "" or not isNumeric(strSubId) then strSub = -1

set conntemp = Server.CreateObject("ADoDB.Connection")
conntemp.open DSN
set rsMenu = conntemp.execute("select menu_id, got_sub, parent_id, name from menu")

if not rsMenu.eof then
    arrRecords = rsMenu.getrows()
    Response.Write BuildParent(arrRecords) & vbCrLf
end if
rsMenu.Close
Set rsMenu = Nothing

function BuildParent(arrRecords)
    strDisplayParent = ""
    for i = 0 to Ubound(arrRecords, 2)
        if cInt(arrRecords(2, i)) = 0 then
            if cInt(arrRecords(1, i)) = 1 then
                if cInt(strMenuId) = arrRecords(0, i) then
                    strDisplayParent = strDisplayParent & "> <a href="""& Request.ServerVariables("HTTP_REFERER") &""">"& arrRecords(3, i) &"</a><br>"& vbCrLf
                    strDisplayParent = strDisplayParent & BuildChild(arrRecords, arrRecords(0, i), 0) & vbCrLf
                else
                    strDisplayParent = strDisplayParent & "> <a href=""?MenuId="& arrRecords(0, i) &""">"& arrRecords(3, i) &"</a><br>"& vbCrLf
                end if
            end if
        end if
    next
    BuildParent = strDisplayParent
end function

function BuildChild(arrRecords, intParentId, intLevel)
    strDisplayChild = ""
    strLevel = ""
    for x = 0 to intLevel
        strLevel = strLevel &"&nbsp;&nbsp;"
    next
    for j = 0 to Ubound(arrRecords, 2)
        if cInt(arrRecords(2, j)) = intParentId then
            if cInt(arrRecords(1, j)) = 1 then
                if cInt(strMenuId) = arrRecords(0, j) then
                    strDisplayChild = strDisplayChild & strLevel &"> <a href=""?MenuId="& arrRecords(2, j) &""">"& arrRecords(3, j) &"</a><br>"& vbCrLf
                    strDisplayChild = strDisplayChild & BuildChild(arrRecords, arrRecords(0, j), intLevel + 1) & vbCrLf
                else
                    strDisplayChild = strDisplayChild & strLevel &"> <a href=""?MenuId="& arrRecords(0, j) &"&ParentId="& arrRecords(2, j) &""">"& arrRecords(3, j) &"</a><br>"& vbCrLf
                end if
            else
                strDisplayChild = strDisplayChild & strLevel &"- <a href=""?MenuId="& strMenuId &"&ChildId="& arrRecords(0, j) &"&ShowKat=1"">"& arrRecords(3, j) &"</a><br>"& vbCrLf
            end if
        end if
    next
    BuildChild = strDisplayChild
end function

På forhånd tak!
Avatar billede skg Nybegynder
25. marts 2004 - 07:04 #1
Hej

Jeg sad og kedede mig lidt, så prøv om ikke det her kan hjælpe dig lidt frem :-)

Sig endelig til hvis der er noget der ikke virker.

<%

Option Explicit

CONST MENUITEM_ID = 0
CONST MENUITEM_ISPARENT = 1
CONST MENUITEM_PARENTID = 2
CONST MENUITEM_NAME = 3

Class MenuClass

    Private items, count, openItemsIdList_
    Private baseUrl_, baseUrlHasAmp_, queryStringName_, persistQueryString_, persistedQueryString_, closeItemOnClick_

    Private Sub Class_Initialize  ' Setup Initialize event.

        openItemsIdList_ = Null
        persistedQueryString_ = Null

        BaseUrl = Request.ServerVariables( "URL" )
        QueryStringName = "menuOpenItems"
        PersistQueryString = True
        CloseItemOnClick = True
        count = 0

        Dim Conn

        Set Conn = Server.CreateObject("ADODB.Connection")
        Call Conn.open( DSN )
        set MenuRs = Conn.Execute("Select menu_id, got_sub, parent_id, name From menu")

        If Not MenuRs.Eof Then

            menuItems = MenuRs.GetRows()
            count = UBound( items )

        End If

        Call Conn.Close()
        Set Conn = Nothing

        Set MenuRs = Nothing
    End Sub

    Public Function Build()
        Call buildMenuItems( 0, 0 )
    End Function

    Private Function buildMenuItems( ByVal parentId, ByVal level )

        Dim I, IsFirst
        IsFirst = True

        For I = 0 To count
            If parentId = CLng( items( I, MENUITEM_PARENTID ) ) Then

                If IsFirst Then
                    If Level = 0 Then
                        Response.Write( "<ul class=""menu"">" )
                    Else
                        Response.Write( "<ul>" )
                    End If

                    IsFirst = False
                End If

                Call buildMenuItem( I, level )

            End If
        Next

        If Not IsFirst Then
            Response.Write( "</ul>" & vbCrLf )
        End If

    End Function

    Private Function buildMenuItem( ByVal itemIndex, ByVal level )

        Dim isOpen
        isOpen = isMenuItemOpen( items( itemIndex, MENUITEM_ID ) )

        Dim itemUrl
        itemUrl = getItemUrl( items( itemIndex, MENUITEM_ID ), isOpen )

        Response.write( "    <li>" )

        Response.Write( "<a href=""" & itemUrl & """>" )

        Response.write( items( itemIndex, MENUITEM_NAME ) )

        Response.Write( "</a>" )


        If items( itemIndex, MENUITEM_ID ) <> 0 Then
            If isOpen Then
                Call buildMenuItems( items( itemIndex, MENUITEM_ID ), level + 1 )
            End If
        End If

        Response.write( "</li>" & vbCrLf )

    End Function

    Private Function getItemUrl( ByVal menuItemID, ByVal isOpen )

        Dim openItemsIdListNew, joinedList

        If Not IsOpen Then

            joinedList = Join( openItemsIdList_, "," )

            If joinedList <> "" Then
                joinedList = joinedList & ","
            End If

            joinedList = joinedList & menuItemID

        Else
            If closeItemOnClick_ Then
                joinedList = Replace( "," & Join( openItemsIdList_, "," ) & ",", "," & menuItemID & ",", "," )
            Else
                joinedList = Join( openItemsIdList_, "," )
            End If

        End If

        joinedList = Replace( joinedList, ",,", "," )

        If Left( joinedList, 1 ) = "," Then
            joinedList = Mid( joinedList, 2, Len( joinedList ) )
        End If

        If Right( joinedList, 1 ) = "," Then
            joinedList = Mid( joinedList, 1, Len( joinedList ) - 1 )
        End If

        openItemsIdListNew = queryStringName_ & "=" & joinedList

        If baseUrlHasAmp_ Then
            getItemUrl = baseUrl_ & openItemsIdListNew
        Else
            getItemUrl = baseUrl_ & "?" & openItemsIdListNew
        End If

        If persistQueryString_ Then

            If IsNull( persistedQueryString_ ) Then
                Dim Item
                For Each item In Request.QueryString
                    If Not Item = queryStringName_ Then
                        persistedQueryString_ = persistedQueryString_ & "&amp;" & item & "=" & Request.QueryString(item)
                    End If
                Next
            End If

            getItemUrl = getItemUrl & persistedQueryString_
        End If
   
    End Function

    Private Function ensureOpenItemsIdList
        If IsNull( openItemsIdList_ ) Then
            openItemsIdList_ = Split( Request.QueryString( queryStringName_ ), "," )
        End If
    End Function

    Private Function isMenuItemOpen( ByVal menuItemID )

        Call ensureOpenItemsIdList()

        Dim I

        For I = 0 To UBound( openItemsIdList_ )

            If IsNumeric( openItemsIdList_( I ) ) Then

                If openItemsIdList_( I ) = CStr( menuItemID ) Then
                    isMenuItemOpen = True
                    Exit Function
                End If

            End If
        Next

        isMenuItemOpen = False

    End Function

    Public Property Let BaseUrl( value )

        If InStr( value, "?" ) > 0 Then
            baseUrlHasAmp_ = True
        Else
            baseUrlHasAmp_ = False
        End If

        baseUrl_ = value

    End Property

    Public Property Let QueryStringName( value )
        queryStringName_ = value
    End Property

    Public Property Let PersistQueryString( value )
        persistQueryString_ = CBool( value )
    End Property

    Public Property Let CloseItemOnClick( value )
        closeItemOnClick_ = CBool( value )
    End Property

End Class

Dim Menu
set Menu = new MenuClass


%>
<style>
ul.menu, ul.menu ul
{
margin:0px;
}
ul.menu li
{
list-style:none;
margin-left:0px;
padding-left:15px;
}
</style>

<%Menu.Build()%>
Avatar billede psyclown Nybegynder
25. marts 2004 - 16:49 #2
Jeg kan godt nok ikke få din kode til at virke, men jeg vil også hellere have min egen kode til at virke som den skal, hvis det er noget du kan hjælpe med :)
Avatar billede skg Nybegynder
26. marts 2004 - 02:30 #3
jeg fik selv min kode til at virke :

<%

Option Explicit

CONST MENUITEM_ID = 0
CONST MENUITEM_ISPARENT = 1
CONST MENUITEM_PARENTID = 2
CONST MENUITEM_NAME = 3

Class MenuClass

    Private items, count, openItemsIdList_
    Private baseUrl_, baseUrlHasAmp_, queryStringName_, persistQueryString_, persistedQueryString_, closeItemOnClick_

    Private Sub Class_Initialize  ' Setup Initialize event.

        openItemsIdList_ = Null
        persistedQueryString_ = Null

        BaseUrl = Request.ServerVariables( "URL" )
        QueryStringName = "menuOpenItems"
        PersistQueryString = True
        CloseItemOnClick = True
        count = 0

        Dim Conn
        Set Conn = Server.CreateObject("ADODB.Connection")

        Dim DSN
        DSN = "Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\Inetpub\wwwroot\_MiscTestFolder\TreeMenu\data.mdb;Uid=Admin;Pwd=;"

        Call Conn.Open( DSN )

        Dim MenuRs
        set MenuRs = Conn.Execute("select menu_id, got_sub, parent_id, name from menu")

        If Not MenuRs.Eof Then
            items = MenuRs.GetRows()
            count = UBound( items, 2 )
        End If

        Call Conn.Close()
        Set Conn = Nothing

        Set MenuRs = Nothing
    End Sub

    Public Function Build()
        Call buildMenuItems( 0, 0 )
    End Function

    Private Function buildMenuItems( ByVal parentId, ByVal level )

        Dim I, IsFirst
        IsFirst = True

        For I = 0 To count

            If parentId = CLng( items( MENUITEM_PARENTID, I ) ) Then

                If IsFirst Then
                    If Level = 0 Then
                        Response.Write( "<ul class=""menu"">" )
                    Else
                        Response.Write( "<ul>" )
                    End If

                    IsFirst = False
                End If

                Call buildMenuItem( I, level )

            End If
        Next

        If Not IsFirst Then
            Response.Write( "</ul>" & vbCrLf )
        End If

    End Function

    Private Function buildMenuItem( ByVal itemIndex, ByVal level )

        Dim isOpen
        isOpen = isMenuItemOpen( items( MENUITEM_ID, itemIndex ) )

        Dim itemUrl
        itemUrl = getItemUrl( items( MENUITEM_ID, itemIndex ), isOpen )

        Response.write( "    <li>" )

        Response.Write( "<a href=""" & itemUrl & """>" )

        Response.write( items( MENUITEM_NAME, itemIndex ) )

        Response.Write( "</a>" )


        If items( MENUITEM_ID, itemIndex ) <> 0 Then
            If isOpen Then
                Call buildMenuItems( items( MENUITEM_ID, itemIndex ), level + 1 )
            End If
        End If

        Response.write( "</li>" & vbCrLf )

    End Function

    Private Function getItemUrl( ByVal menuItemID, ByVal isOpen )

        Dim openItemsIdListNew, joinedList

        If Not IsOpen Then

            joinedList = Join( openItemsIdList_, "," )

            If joinedList <> "" Then
                joinedList = joinedList & ","
            End If

            joinedList = joinedList & menuItemID

        Else
            If closeItemOnClick_ Then
                joinedList = Replace( "," & Join( openItemsIdList_, "," ) & ",", "," & menuItemID & ",", "," )
            Else
                joinedList = Join( openItemsIdList_, "," )
            End If

        End If

        joinedList = Replace( joinedList, ",,", "," )

        If Left( joinedList, 1 ) = "," Then
            joinedList = Mid( joinedList, 2, Len( joinedList ) )
        End If

        If Right( joinedList, 1 ) = "," Then
            joinedList = Mid( joinedList, 1, Len( joinedList ) - 1 )
        End If

        openItemsIdListNew = queryStringName_ & "=" & joinedList

        If baseUrlHasAmp_ Then
            getItemUrl = baseUrl_ & openItemsIdListNew
        Else
            getItemUrl = baseUrl_ & "?" & openItemsIdListNew
        End If

        If persistQueryString_ Then

            If IsNull( persistedQueryString_ ) Then
                Dim Item
                For Each item In Request.QueryString
                    If Not Item = queryStringName_ Then
                        persistedQueryString_ = persistedQueryString_ & "&amp;" & item & "=" & Request.QueryString(item)
                    End If
                Next
            End If

            getItemUrl = getItemUrl & persistedQueryString_
        End If
   
    End Function

    Private Function ensureOpenItemsIdList
        If IsNull( openItemsIdList_ ) Then
            openItemsIdList_ = Split( Request.QueryString( queryStringName_ ), "," )
        End If
    End Function

    Private Function isMenuItemOpen( ByVal menuItemID )

        Call ensureOpenItemsIdList()

        Dim I

        For I = 0 To UBound( openItemsIdList_ )

            If IsNumeric( openItemsIdList_( I ) ) Then

                If openItemsIdList_( I ) = CStr( menuItemID ) Then
                    isMenuItemOpen = True
                    Exit Function
                End If

            End If
        Next

        isMenuItemOpen = False

    End Function

    Public Property Let BaseUrl( value )

        If InStr( value, "?" ) > 0 Then
            baseUrlHasAmp_ = True
        Else
            baseUrlHasAmp_ = False
        End If

        baseUrl_ = value

    End Property

    Public Property Let QueryStringName( value )
        queryStringName_ = value
    End Property

    Public Property Let PersistQueryString( value )
        persistQueryString_ = CBool( value )
    End Property

    Public Property Let CloseItemOnClick( value )
        closeItemOnClick_ = CBool( value )
    End Property

End Class

Dim Menu
set Menu = new MenuClass


%>
<style>
ul.menu, ul.menu ul
{
margin:0px;
}
ul.menu li
{
list-style:none;
margin-left:0px;
padding-left:15px;
}
</style>

<%Menu.Build()%>
Avatar billede skg Nybegynder
26. marts 2004 - 03:21 #4
Hvis jeg forstår dit problem ret, så er det fordi du kun bruger "MenuID" parametret til at holde styr på hvilket menupunkt der skal være åbent. Når et af hovedpunkterne er åbnet, så må du ( i din kode ) ikke ændre dette, da det jo så vil blive lukket igen, medmindre du også checker "ParentID" parametret.

Jeg har lavet lidt om i din BuildChild funktion, så den bruger "ParentID" ( da BuildParent oj bruger "MenuID" ), og så virker det.

---
function BuildChild(arrRecords, intParentId, intLevel)
    strDisplayChild = ""
    strLevel = ""
    for x = 0 to intLevel
        strLevel = strLevel &"&nbsp;&nbsp;"
    next
    for j = 0 to Ubound(arrRecords, 2)
        if cInt(arrRecords(2, j)) = intParentId then
            if cInt(arrRecords(1, j)) = 1 then
8 >>          if cInt(strParentId) = arrRecords(0, j) then
                    strDisplayChild = strDisplayChild & strLevel &"> <a href=""?MenuId="& arrRecords(2, j) &""">"& arrRecords(3, j) &"</a><br>"& vbCrLf
                    strDisplayChild = strDisplayChild & BuildChild(arrRecords, arrRecords(0, j), intLevel + 1) & vbCrLf
                else
14 >>              strDisplayChild = strDisplayChild & strLevel &"> <a href=""?MenuId="& arrRecords(2, j) &"&ParentId="& arrRecords(0, j) &""">"& arrRecords(3, j) &"</a><br>"& vbCrLf
                end if
            else
17 >>          strDisplayChild = strDisplayChild & strLevel &"- <a href=""?MenuId="& strMenuId &"&ChildId="& arrRecords(0, j) &"&ShowKat=1"">"& arrRecords(3, j) &"</a><br>"& vbCrLf
            end if
        end if
    next
    BuildChild = strDisplayChild
end function

---
Ændringerne er i linie 8, 14 og 17


Du får dog problemer hvis du vil tilføje endnu et level, da du jo bruger et parameter pr. level.
Avatar billede psyclown Nybegynder
26. marts 2004 - 20:03 #5
Nu var det jo egentligt meningen at funktion skal bruges til at lave en evig menu, så kan man ikke lave en permanent ændring som virker hele tiden ?
Avatar billede skg Nybegynder
27. marts 2004 - 09:26 #6
Kig på det kode jeg lavede :-)
Avatar billede psyclown Nybegynder
05. april 2004 - 22:23 #7
Jeg har kigget på det og jeg har fundet fidusen i det, men kan ikke finde ud af hvordan jeg skal få det til at virke.
Måske du kunne forklarer hvordan jeg skal sætte det sammen, for jeg har prøvet alt muligt uden held.

Undskyld det sene svar, men har haft lidt travlt.
Du skal selvfølgeligt nok få de point.
Avatar billede skg Nybegynder
14. april 2004 - 05:53 #8
jeg er ikke helt med på hvor du har problemer.

Jeg har lavet det så det burde virke ud fra den tabel du har i forvejen.




En ting jeg har overvejet var dog at implementere en property så man kan se hvilket link/punkt der sidst er blevet trykket på.
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