More in this section

Forums / Developing with Sitefinity / Problem with Menu

Problem with Menu

3 posts, 0 answered
  1. Krzysztof
    Krzysztof avatar
    1 posts
    Registered:
    28 May 2008
    05 Jun 2008
    Link to this post
    Hello
    I have small question
    I want to do a particular menu
    Menu static:)
    Idea is this
    I have some pages Father: HomePage Page1 Page2
    and also below pages HomePageA, HomePageB, Page1A, Page1B, Page2A, Page2B
    Page HomePage is Father for HomePageA, HomePageB
    Work is Page1 father for Page1A and Page1B
      Menu onLoad page must be expanded example
    - HomePage-Page1
        - HomePage-Page1A
        - HomePageA-Page1B

    expamle bellow is what i whant
    http://img338.imageshack.us/img338/4233/menustaticji8.jpg
    I thought use Site TabStrip, Site PanelBar
    Only I'm blocked, and i do not know what i must do
    thanks for help and collaboration
    Krzysztof Zajac
  2. Nigel
    Nigel avatar
    38 posts
    Registered:
    01 Dec 2004
    05 Jun 2008
    Link to this post
    Hey Krzysztof

    I made my own menu and breadcrumb controls as I wanted very light, XHTML compliant output with little or no clientside script. One of my simpler menus (does 1 or 2 levels - starting node can be current page or root site node), I believe, is similar to what you are looking for. Code posted at bottom, as it's kind of long.

    Have a look at the User Manual and Developer docs to see how to implement your own user controls.

    Imports System.ComponentModel 
    Imports Telerik.Cms.Web 
    Imports Telerik 
     
    <DefaultProperty("IsSubNavigation")> _ 
    Partial Class SitefinityLiteMenu 
        Inherits System.Web.UI.UserControl 
    #Region "Data Fields" 
        Private _showOnlyFirstLevel As Boolean = True 
        Private _isSub As Boolean = False 
        Private _topLevelSelected As String = "l-on" 
        Private _subLevelSelected As String = "ls-on" 
        Private _menuClass As String = "" 
    #End Region 
     
        Private _menu As StringBuilder 
        Private _active As Hashtable 
     
        ''' <summary>Overriden. Renders the control content.</summary> 
        Protected Overloads Overrides Sub Render(ByVal writer As HtmlTextWriter) 
            ' Checks if this is called by the Search Indexer and does not render anything if so. 
            ' Navigation controls are present in every page and should NOT be indexed multiple times. 
            If Not CmsContext.IsCrawlerRequest Then 
                RenderNodes() 
                writer.Write(_menu.ToString) 
                MyBase.Render(writer) 
            End If 
        End Sub 
     
        Private Sub RenderNodes() 
            Dim loopcnt As Integer = 1 
            _menu = New StringBuilder 
            _active = New Hashtable(10) 
            _active.Add("telerik""."
            _menu.AppendFormat("<ul class=""{0}"">", _menuClass) 
     
            If Me.ShowOnlyFirstLevel Then 
                Dim node2 As CmsSiteMapNode = TryCast(SiteMap.CurrentNode, CmsSiteMapNode) 
                If Not node2 Is Nothing AndAlso Not node2.ParentNode Is Nothing Then 
                    While Not node2.ParentNode Is SiteMap.RootNode 
                        node2 = TryCast(node2.ParentNode, CmsSiteMapNode) 
                    End While 
                    Dim sUrl As String = Me.ResolveUrl(node2.Url) 
     
                    For Each node1 As SiteMapNode In SiteMap.RootNode.ChildNodes 
                        If (Me.ResolveUrl(node1.Url).Equals(sUrl)) Then 
                            If loopcnt = 1 Then 
                                loopcnt += 1 
                                AddSingleNodeCustom(node1.Title, node1.Url, "l-first " & _topLevelSelected) 
                            Else 
                                AddSingleNodeActive(node1.Title, node1.Url) 
                            End If 
                        Else 
                            If loopcnt = 1 Then 
                                loopcnt += 1 
                                AddSingleNodeCustom(node1.Title, node1.Url, "l-first"
                            Else 
                                AddSingleNode(node1.Title, node1.Url) 
                            End If 
                        End If 
                    Next 
     
                Else 
                    For Each node1 As SiteMapNode In SiteMap.RootNode.ChildNodes 
                        If loopcnt = 1 Then 
                            loopcnt += 1 
                            AddSingleNodeCustom(node1.Title, node1.Url, "l-first"
                        Else 
                            AddSingleNode(node1.Title, node1.Url) 
                        End If 
                    Next 
                End If 
            Else 
                Dim startNode As CmsSiteMapNode = TryCast(SiteMap.CurrentNode, CmsSiteMapNode) 
                If Not startNode Is Nothing AndAlso Not startNode.ParentNode Is Nothing Then 
                    _active.Add(startNode.Key, "."
                    While Not startNode.ParentNode Is SiteMap.RootNode 
                        startNode = TryCast(startNode.ParentNode, CmsSiteMapNode) 
                        _active.Add(startNode.Key, "."
                    End While 
                End If 
     
                If Me._isSub Then 
                    If Not startNode Is Nothing Then 
                        CreateLevels(startNode) 
                    Else 
                        CreateLevels(SiteMap.RootNode) 
                    End If 
                Else 
                    CreateLevels(SiteMap.RootNode) 
                End If 
     
            End If 
     
            _menu.AppendLine("</ul>"
        End Sub 
    #Region "Properties" 
        ''' <summary> 
        ''' Gets or sets a value indicating whether the Menu should show only the first level  
        ''' of nodes in the sitemap 
        ''' </summary> 
        <Browsable(True)> _ 
        <Category("Behavior")> _ 
        Public Property ShowOnlyFirstLevel() As Boolean 
            Get 
                Return _showOnlyFirstLevel 
            End Get 
            Set(ByVal value As Boolean
                _showOnlyFirstLevel = value 
            End Set 
        End Property 
     
        ''' <summary> 
        ''' Gets or sets a value indicating whether the Menu should start from the root site node 
        ''' or the current page node 
        ''' </summary> 
        <Browsable(True)> _ 
        <Category("Navigation")> _ 
        Public Property IsSubNavigation() As Boolean 
            Get 
                Return _isSub 
            End Get 
            Set(ByVal value As Boolean
                _isSub = value 
            End Set 
        End Property 
     
     
        ''' <summary> 
        ''' Sets the (CSS) class for top-level UL menu tag 
        ''' </summary>    
        <Browsable(True)> _ 
        <Category("Appearance")> _ 
        Public Property MenuCSSClass() As String 
            Get 
                Return Me._menuClass 
            End Get 
            Set(ByVal value As String
                Me._menuClass = value 
            End Set 
        End Property 
     
        ''' <summary> 
        ''' Sets the on (CSS) class for top-level menu items when selected 
        ''' </summary>    
        <Browsable(True)> _ 
        <Category("Appearance")> _ 
        Public Property TopLevelSelectedClass() As String 
            Get 
                Return Me._topLevelSelected 
            End Get 
            Set(ByVal value As String
                Me._topLevelSelected = value 
            End Set 
        End Property 
     
        ''' <summary> 
        ''' Sets the on (CSS) class for sub-level menu items when selected 
        ''' </summary>    
        <Browsable(True)> _ 
        <Category("Appearance")> _ 
        Public Property SubLevelSelectedClass() As String 
            Get 
                Return Me._subLevelSelected 
            End Get 
            Set(ByVal value As String
                Me._subLevelSelected = value 
            End Set 
        End Property 
    #End Region 
    #Region "Methods" 
        Private Sub AddSingleNode(ByVal text As StringByVal url As String
            _menu.AppendLine(String.Format("<li><a href=""{0}"" title=""{1}"">{1}</a></li>"Me.ResolveUrl(url), text)) 
        End Sub 
     
        Private Sub AddSingleNodeActive(ByVal text As StringByVal url As String
            _menu.AppendLine(String.Format("<li class=""{2}""><a href=""{0}"" title=""{1}"">{1}</a></li>"Me.ResolveUrl(url), text, _topLevelSelected)) 
        End Sub 
     
        Private Sub AddSingleNodeCustom(ByVal text As StringByVal url As StringByVal css As String
            _menu.AppendLine(String.Format("<li class=""{2}""><a href=""{0}"" title=""{1}"">{1}</a></li>"Me.ResolveUrl(url), text, css)) 
        End Sub 
     
        Private Sub AddNodes(ByVal text As StringByVal url As StringByVal nodes As String
            _menu.AppendLine(String.Format("<li><a href=""{0}"" title=""{1}"">{1}</a>"Me.ResolveUrl(url), text)) 
            _menu.AppendLine(nodes) 
            _menu.AppendLine("</li>"
        End Sub 
     
        Private Sub AddNodesActive(ByVal text As StringByVal url As StringByVal nodes As String
            _menu.AppendLine(String.Format("<li class=""{2}""><a href=""{0}"" title=""{1}"">{1}</a>"Me.ResolveUrl(url), text, _topLevelSelected)) 
            _menu.AppendLine(nodes) 
            _menu.AppendLine("</li>"
        End Sub 
     
        Private Sub AddNodesCustom(ByVal text As StringByVal url As StringByVal nodes As StringByVal css As String
            _menu.AppendLine(String.Format("<li class=""{2}""><a href=""{0}"" title=""{1}"">{1}</a>"Me.ResolveUrl(url), text, css)) 
            _menu.AppendLine(nodes) 
            _menu.AppendLine("</li>"
        End Sub 
     
        Private Sub CreateLevels(ByVal pNode As SiteMapNode) 
            Dim sb As StringBuilder 
            Dim loopcnt As Integer = 1, subcnt As Integer = 0 
            For Each node As CmsSiteMapNode In pNode.ChildNodes 
     
                If node.HasChildNodes Then 
                    sb = New StringBuilder 
                    sb.AppendLine("<ul>"
                    subcnt = 1 
                    For Each cnode As CmsSiteMapNode In node.ChildNodes 
                        If _active.ContainsKey(cnode.Key) Then 
                            If subcnt = 1 Then 
                                subcnt += 1 
                                sb.AppendLine(String.Format("<li class=""{2}""><a href=""{0}"" title=""{1}"">{1}</a></li>"Me.ResolveUrl(cnode.Url), cnode.Title, "ls-first " & _subLevelSelected)) 
                            Else 
                                sb.AppendLine(String.Format("<li class=""{2}""><a href=""{0}"" title=""{1}"">{1}</a></li>"Me.ResolveUrl(cnode.Url), cnode.Title, _subLevelSelected)) 
                            End If 
                        Else 
                            If subcnt = 1 Then 
                                subcnt += 1 
                                sb.AppendLine(String.Format("<li class=""{2}""><a href=""{0}"" title=""{1}"">{1}</a></li>"Me.ResolveUrl(cnode.Url), cnode.Title, "ls-first")) 
                            Else 
                                sb.AppendLine(String.Format("<li><a href=""{0}"" title=""{1}"">{1}</a></li>"Me.ResolveUrl(cnode.Url), cnode.Title)) 
                            End If 
                        End If 
                    Next 
                    sb.AppendLine("</ul>"
                    If _active.ContainsKey(node.Key) Then 
                        If loopcnt = 1 Then 
                            AddNodesCustom(node.Title, node.Url, sb.ToString, "l-first " & _topLevelSelected) 
                        Else 
                            AddNodesActive(node.Title, node.Url, sb.ToString) 
                        End If 
                    Else 
                        If loopcnt = 1 Then 
                            AddNodesCustom(node.Title, node.Url, sb.ToString, "l-first"
                        Else 
                            AddNodes(node.Title, node.Url, sb.ToString) 
                        End If 
                    End If 
                Else 
                    If _active.ContainsKey(node.Key) Then 
                        If loopcnt = 1 Then 
                            AddSingleNodeCustom(node.Title, node.Url, "l-first " & _topLevelSelected) 
                        Else 
                            AddSingleNodeActive(node.Title, node.Url) 
                        End If 
                    Else 
                        If loopcnt = 1 Then 
                            AddSingleNodeCustom(node.Title, node.Url, "l-first"
                        Else 
                            AddSingleNode(node.Title, node.Url) 
                        End If 
                    End If 
                End If 
                loopcnt += 1 
            Next 
        End Sub 
    #End Region 
     
    End Class 
     

  3. Sonya
    Sonya avatar
    231 posts
    Registered:
    24 Sep 2012
    06 Jun 2008
    Link to this post
    Hi Nigel,

    Thank you for sharing your work with another person from the Sitefinity community. As a note of gratitude your Telerik account has been updated.

    Hi Krzysztof,

    You could use the Site Menu control. As Nigel said, you could also take a look at the following topics in the Developer manual that provide guidance on the themes you are working on:
     - Working with Navigation Controls
     - Creating Simple Functionality with User Controls


    Let us know if that is not the desired behavior you would like to achieve or if you have any additional questions.

    Kind regards,
    Sonya
    the Telerik team

    Instantly find answers to your questions at the new Telerik Support Center
Register for webinar
3 posts, 0 answered