Submenu navigation 2 levels
Hi all,
I need to have a submenu inside a template that can show navigation items 2 levels deep.
See the attachment for an example.
Someone who did already managed to do this?
I've looked at the navigation control, but none of the options seems to fit for this.
I can create a custom control for this, but maybe it is possible in another way.
Regards,
Daniel
Hi,
I would also be interested in knowing how to do this as v3.7 did this but not v4?
thanks
Hi,
I made a custom control for this.
Regards,
Nicolas
Awesome! Would you like to share it?
Cheers,
Daniel
No problem :)
VerticalMenu.acsx :
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="VerticalMenu.ascx.cs" Inherits="SitefinityWebApp.CustomComponent.VerticalMenu" %>
<%@ Register Assembly="Telerik.Sitefinity" Namespace="Telerik.Sitefinity.Web.UI" TagPrefix="sf" %>
<
sf:ResourceLinks
ID
=
"resourceLinks"
runat
=
"server"
UseEmbeddedThemes
=
"false"
>
<
sf:ResourceFile
Name
=
"~/Styles/VerticalMenu.css"
Static
=
"true"
/>
</
sf:ResourceLinks
>
<
div
id
=
"verticalMenu"
>
<
asp:Literal
ID
=
"menuContent"
runat
=
"server"
/>
</
div
>
using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Text;
using
SF.Widgets.CommonLib;
using
Telerik.Sitefinity.Modules.Pages;
using
Telerik.Sitefinity.Pages.Model;
using Telerik.Sitefinity.Services;
using
Telerik.Sitefinity.Web;
using
System.Globalization;
using
System.Threading;
namespace
SitefinityWebApp.CustomComponent
public
partial
class
VerticalMenu : System.Web.UI.UserControl
#region Properties
protected
PageNode currentNode;
protected
IList<PageNode> NodeList;
protected
List<PageNode> ParentNodes =
new
List<PageNode>();
#endregion Properties
#region Methods
private
PageNode GetParent(PageNode pNode)
PageNode pToReturn = pNode;
ParentNodes.Add(pToReturn);
if
(pNode !=
null
)
if
(pNode.Parent != pNode.RootNode)
pToReturn =
this
.GetParent(pNode.Parent);
return
pToReturn;
private
void
GetCurrentPage()
//Get current page Key
if
(!
string
.IsNullOrEmpty(SiteMapBase.GetCurrentProvider().CurrentNode.Key))
Guid currentKey =
new
Guid(SiteMapBase.GetCurrentProvider().CurrentNode.Key);
PageManager pMng =
new
PageManager();
currentNode = pMng.GetPageNode(currentKey);
NodeList =
this
.GetParent(currentNode).Nodes;
private
void
DisplayNode(IList<PageNode> pNodes, StringBuilder sb,
bool
firstLevel)
sb.Append(
"<ul>"
);
CultureInfo language = Thread.CurrentThread.CurrentCulture;
foreach
(PageNode pNode
in
pNodes)
if
(pNode.ApprovalWorkflowState ==
"Draft"
|| !pNode.AvailableCultures.Contains(language)
|| (pNode.NodeType == NodeType.Group && pNode.Nodes.Count == 0))
continue
;
if
(pNode.WasPublished && pNode.ShowInNavigation)
if
(!firstLevel && !ParentNodes.Contains(pNode.Parent))
continue
;
if
(
this
.IsSelected(pNode.Id))
sb.Append(
"<li class=\"selected\">"
);
else
sb.Append(
"<li>"
);
sb.AppendFormat(
"<a href=\"0\">1</a>"
, pNode.GetFullUrl(language,
false
).Trim(
'~'
), pNode.Title);
if
(pNode.Nodes.Count > 0)
this
.DisplayNode(pNode.Nodes, sb,
false
);
sb.Append(
"</li>"
);
sb.Append(
"</ul>"
);
private
bool
IsSelected(Guid IdNode)
foreach
(PageNode pN
in
ParentNodes)
if
(pN.Id.Equals(IdNode))
return
true
;
return
false
;
#endregion Methods
protected
void
Page_Load(
object
sender, EventArgs e)
if
(SystemManager.IsDesignMode && !SystemManager.IsPreviewMode)
return
;
GetCurrentPage();
StringBuilder sb =
new
StringBuilder();
this
.DisplayNode(NodeList, sb,
true
);
this
.menuContent.Text = sb.ToString();
Hi Nicolas,
Thanks for sharing.
I'm having some troubles with getting only the languages that are for the current selected culture. How would you adjust the code so that the menu shows only the current selected language?
When I have a site with multiple languages it now shows all languages beneath each other.
Regards,
Daniel
Dear Daniel
I usualy do this
1. Level standard SF navigation widget
2. and 3. level I use the DataSitemap and a RadPanelbar
Maybe the screenshots help you set it up.
Step 1
Enable RadControls (screenshot 1). This will make them visible in your toolbox
Step 2
Drag a Site map data source widget to your template (screenshot 2)
Step 3
Configure the site map data source (screenshot 3)
Copy the ID to past it later to the pannel bar
Step 4
Drag a PanelBar to the template (screenshot 4)
Step 5
Configure the PanelBar (screenshot 5)
Hope I did not miss something here.
Give it a try.
Markus
Hi,
Weird i'm also in multilingual and it works for me. Your page are synchronised ?
I use into DisplayNode : CultureInfo language = Thread.CurrentThread.CurrentCulture;
Regards,
Nicolas
Okay, strange. I'm not sure if it synchronized. I'll check.
See the screenshot for the behaviour. I enabled two languages at the moment.
@Markus: hey, your solutions works okay, so because of time I'll go for this. Although the RadPanelBar creates lots over overhead. I'm more into a clean solution, but don't have time to figure it out. Thanks!
Dear Daniel
Glad to hear it works :-)
Markus
Hi Markus,
It works well when project is deployed on root. Navigation links are not found when project is deployed inside a folder. It does not takes its path. Can you please help.