如何在SDL Tridion中为不同页面创建导航菜单?

时间:2012-05-26 11:05:00

标签: tridion tridion-2011

我为所有这些类别创建了不同的页面:书籍,手机,comp等。现在我想在所有页面中放置这种类型的导航菜单(如图所示)并打开页面应突出显示相应的菜单链接。

我应该创建一个包含文本和链接的模式并将其设为多值吗?那么我创建一个组件,最后在所有页面中渲染它们?

如果没有,请建议任何其他更好的方法。

enter image description here

2 个答案:

答案 0 :(得分:9)

在Tridion中生成任何导航的最常用方法是根据结构组和页面在C#模板中生成它。

例如,可以通过以下内容从模板(C#片段或实现ITemplate的类)中轻松生成面包屑跟踪:

 
var pageDocument = package.GetByType(ContentType.Page).GetAsXmlDocument();
var current = new Page(pageDocument.DocumentElement, engine.GetSession());
var breadcrumb = page.Title;
while (current.OrganizationalItem != null)
{
    current = current.OrganizationalItem;
    breadcrumb = current.Title + " > " + breadcrumb;
}
package.PushItem("breadcrumb", 
                 package.CreateStringItem(ContentType.Text, breadcrumb));

上面的片段实际上只显示了如何向上导航结构组的层次结构。您仍然必须将每个结构组作为链接,可能通过查看每个PublishUrl的{​​{1}}属性。

我知道你不是在询问面包屑的痕迹,你的看起来更像是一个左撇子。但是所有导航元素的方法都是类似的:使用ITemplate中的TOM.NET遍历相关的Pages和StructureGroup,并从中生成导航HTML。

要获取当前StructureGroup中所有页面的列表(并标记当前的那个),我希望这样:

StructureGroup

另请参阅this great example from Nick where he generates an entire sitemap。这更接近你最终需要的东西,但当然是更多的代码(在这里重现太多)。艾伯特还分享了一些his experience with this approach and mentions the alternatives

答案 1 :(得分:5)

如果您使用ASPX作为页面类型,下面将介绍其他导航逻辑:

  1. 创建一个包含重要页面信息(ID,路径,标题......)的导航xml(包含所有页面)

  2. 创建将生成痕迹导航或任何其他导航的ascx控件。由于参数控制应检索当前页面ID

  3. 更改页面DWT(放置ascx控件)
  4. 通过这种方式减少渲染(发布)时间,导航将在页面加载时呈现。不幸的是,通过这种方式增加页面加载时间。这取决于您的需求什么是更合适的解决方案。刷新导航XML是这种方法的问题之一......