我为所有这些类别创建了不同的页面:书籍,手机,comp等。现在我想在所有页面中放置这种类型的导航菜单(如图所示)并打开页面应突出显示相应的菜单链接。
我应该创建一个包含文本和链接的模式并将其设为多值吗?那么我创建一个组件,最后在所有页面中渲染它们?
如果没有,请建议任何其他更好的方法。
答案 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作为页面类型,下面将介绍其他导航逻辑:
创建一个包含重要页面信息(ID,路径,标题......)的导航xml(包含所有页面)
创建将生成痕迹导航或任何其他导航的ascx控件。由于参数控制应检索当前页面ID
通过这种方式减少渲染(发布)时间,导航将在页面加载时呈现。不幸的是,通过这种方式增加页面加载时间。这取决于您的需求什么是更合适的解决方案。刷新导航XML是这种方法的问题之一......